2. Apresentação
• Este módulo pretende introduzir uma linguagem standard de
manipulação de dados em sistema de gestão de bases de dados.
• Esta linguagem permite a pesquisa, a inserção, a alteração e a
remoção de registos numa base de dados.
• Neste módulo, os alunos são confrontados com a necessidade de
aceder a uma base de dados e retirar de lá a informação necessária
ao funcionamento do sistema de informação.
3. Objetivos de Aprendizagem
• No final deste módulo os alunos devem ter adquirido conhecimentos,
procedimentos e atitudes que lhe permitam:
• Utilizar uma linguagem de manipulação de dados.
• Pesquisar informação numa base de dados, inserir, apagar e atualizar dados
numa base de dados.
• Produzir pesquisas complexas recorrendo aos mecanismos próprios do SQL.
4. Âmbito dos Conteúdos
• SQL como linguagem “universal” para pesquisas sobre bases de dados.
• Apresentação da linguagem SQL.
• Pesquisas (“queries”) simples sobre a base de dados (estrutura básica do
comando SELECT).
• Predicados ALL e DISTINCT 5.
5. Âmbito dos Conteúdos
• Pesquisas complexas. Agregação de dados com a instrução SELECT
• Lógica e funções de grupo
• JOIN como forma de extrair informação de tabelas diferentes com base em
critérios de comparação de valores em colunas comuns (INNER JOIN, LEFT
JOIN e RIGHT JOIN)
• Utilização de sub pesquisas (ou pesquisas encadeadas)
• Uniões
6. Bibliografia / Outros Recursos
• CARRIÇO, Rui Carriço, Desenho de bases de dados e linguagem SQL em Access, Lisboa: C.T.I, 2002. DAMAS,
Luis,
• SQL – Structed Query Language, Lisboa: FCA,2003. PEREIRA, José Luis
• Tecnologia de bases de dados, FCA,sd. WAZLAWICK, Raul,
• Análise e Projecto de Sistemas de Informação Orientados a Objectos. Lisboa: Editora Campus, 2004.
• Computador Internet Retroprojetor / Projetor Multimédia Manuais Escolares
• Links importantes:
• http://sqlzoo.net/wiki/SELECT_basics
• http://sourceforge.net/projects/xampp/
• http://dev.mysql.com/doc/refman/5.7/en
• http://www.w3schools.com/sql/default.asp
• http://Lanapt.com
7.
8. SQL como linguagem “universal” para
pesquisas sobre bases de dados.
• A SQL (Structured Query Language) é uma linguagem de interrogação
para o sistema relacional. Sendo que, embora possua características
que permitam criar, alterar e remover todos os componentes de uma
base de dados, como tabelas, consultas, chaves, etc., será
apresentada como linguagem de manipulação de dados.
• A SQL que será apresentada, baseia-se na estrutura de
funcionamento do MySql em plataforma Windows. Poderão aparecer
algumas diferenças na sintaxe para SGBD distintos: Access MS
(Microsoft), o Sql AnyWhere (Sybase) e o Oracle (Oracle).
9. Estrutura básica de expressão de SQL
Select - Sintaxe
Conceptual:
SELECT (projeção da álgebra relacional)
FROM (lista das relações)
WHERE (predicado da seleção)
Estrutural:
SELECT a1, a2, a3, ...an (campos pretendidos)
FROM r1, r2, r3, ...rn (tabelas dos campos pretendidos)
WHERE p (condições a serem satisfeitas)
Sendo que a cláusula WHERE é opcional.
Ver mais em: MySql 5.7 en/select
10. Select - Aplicações
Como exemplo temos a tabela: tbl_codigospostais
O mais simples:
Select * from tbl_codigospostais;
Ou
Select codigo, local from tbl_codigospostais;
Ou
Select tbl_codigospostais.codigo, tbl_codigospostais.local from tbl_codigospostais;
Ou
Select tbl_codigospostais.* from tbl_codigospostais;
Ou
Select cp.codigo, cp.local from tbl_codigospostais AS cp;
https://www.sqlteaching.com
http://sqlzoo.net/wiki/SELECT_basics
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
11. Select - Aplicações
Como exemplo temos a tabela: tbl_codigospostais, tbl_clientes
O mais simples:
Select * from tbl_codigospostais, tbl_clientes;
Ou
Select codigo, local, codcliente, nome, codigoc from tbl_codigospostais, tbl_clientes;
Ou
Select tbl_codigospostais.codigo, tbl_codigospostais.local, tbl_clientes.codcliente, tbl_clientes.nome, tbl_clientes.codigoc
from tbl_codigospostais, tbl_clientes;
Ou
Select tbl_codigospostais.*, tbl_clientes.* from tbl_codigospostais, tbl_clientes;
Ou
Select cp.codigo, cp.local, cl.codcliente, cl.nome, cl.codigoc from tbl_codigospostais AS cp, tbl_clientes as cl;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codcliente nome codigoc
1 Ana 1100
2 Maria 4000
3 José 1500
4 André 1100
5 Luis 2040
6 Mário 2300
7 Vitor 4000
12. Cláusula WHERE (Restrição)
Operador Descrição Exemplo Resultado
= Igual a 7=5 Falso
> Maior que 7>5 Verdadeiro
< Menor que 7<5 Falso
>= Maior ou Igual que 7>=5 Verdadeiro
<= Menor ou Igual que 7<=5 Falso
<> ou != Diferente 7<>5 Verdadeiro
A operação de restrição permite restringir o número de linhas a apresentar, que satisfaçam a condição pretendida.
No entanto, para efetuar as restrições, é necessária a utilização de operadores:
Operadores Relacionais
Operadores Lógicos
Outros Operadores
BETWEEN – permite especificar intervalos de valores.
IN – permite especificar conjuntos de valores.
IS – permite efetuar o tratamento de nulos (NULL) – strings vazias.
LIKE – permite resolver alguns problemas naturais que existem quando se pretende comparar strings.
Operador Exemplo
AND condição ou atributo AND condição ou atributo
OR condição ou atributo OR condição ou atributo
NOT NOT condição
13. Select - Aplicações
Como exemplo temos a tabela: tbl_codigospostais
O mais simples:
Select * from tbl_codigospostais where codigo=1000;
Ou
Select codigo, local from tbl_codigospostais where codigo=1000;
Ou
Select tbl_codigospostais.codigo, tbl_codigospostais.local from tbl_codigospostais where tbl_codigospostais.codigo=1000;
Ou
Select tbl_codigospostais.* from tbl_codigospostais where tbl_codigospostais.codigo=1000;
Ou
Select cp.codigo, cp.local from tbl_codigospostais AS cp where cp.codigo=1000;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
14. =
SELECT *
FROM tbl_codigospostais
WHERE local = LISBOA;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
15. >
SELECT *
FROM tbl_codigospostais
WHERE codigo > 1100;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
16. <
SELECT *
FROM tbl_codigospostais
WHERE codigo < 1100;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
17. <=
SELECT *
FROM tbl_codigospostais
WHERE codigo <= 1100;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
18. !=
SELECT *
FROM tbl_codigospostais
WHERE codigo != 1100;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTOcodigo local
1000 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
19. AND
SELECT *
FROM tbl_codigospostais
WHERE (codigo > 1100 AND codigo != 2000);
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1500 LISBOA
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
20. AND
SELECT *
FROM tbl_codigospostais
WHERE (codigo < 1100 AND codigo > 1500); ?
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
21. OR
SELECT *
FROM tbl_codigospostais
WHERE (codigo < 1100 OR codigo > 1500);
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
22. OR
SELECT *
FROM tbl_codigospostais
WHERE (codigo < 1100 OR codigo > 1500);
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
23. NOT
SELECT *
FROM tbl_codigospostais
WHERE NOT (codigo < 1100 OR codigo > 1500);
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1100 LISBOA
1500 LISBOA
24. NOT/IS
SELECT *
FROM tbl_codigospostais
WHERE IS NOT NULL;
SELECT *
FROM tbl_codigospostais
WHERE IS NULL;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
25. NOT
SELECT *
FROM tbl_codigospostais
WHERE NOT (codigo < 1100 OR codigo > 1500);
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1100 LISBOA
1500 LISBOA
26. LIKE
• Comparação entre um valor e uma cadeia de valores (dados).
• É case sensitive.
• % todos os carateres de qualquer comprimento
• _ todos os carateres de 1 comprimento.
SELECT *
FROM tbl_codigospostais
WHERE local like ‘L%’;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
28. LIKE
SELECT *
FROM tbl_codigospostais
WHERE local like ‘_I%’;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2040 RIO MAIOR
29. IN
• Especifica a condição para um determinado grupo de valores.
• Select * from tbl_codigospostais
• Where local IN (‘LISBOA’, ‘PORTO’);
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
4000 PORTO
30. BETWEEN
• Especifica a condição para um intervalo. Útil em datas e valores.
• Select * from tbl_codigopostal
• Where codigo BETWEEN 1100 AND 2100;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
31. DISTINCT
• Mostra os resultados sem repetir os registos iguais.
• Select DISTINCT * from tbl_codigospostais.
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
32. ORDER BY
A ordenação pode ser realizada através da cláusula ORDER BY no comando SELECT. Esta cláusula, se existir,
aparece sempre posicionada no final do comando SELECT.
SELECT campo1, campo2, ... campon
FROM tabela 1 , tabela 2, .... tabela n
[WHERE Condição ]
[GROUP BY ............]
[HAVING ………]
[ORDER BY Campo [ASC | DESC], Campo [ASC | DESC]…]
• Onde Campo representa o nome de um Campo, uma Expressão ou a Posição pela qual se pretende ordenar
o resultado do SELECT.
• ASC indica que a ordenação é ASCendente e DESC indica que a ordenação é DESCendente.
• Por defeito, ou seja, caso não seja indicado um tipo de ordenação, esta é efectuada por ordem ascendente.
33. ORDER BY
SELECT *
FROM tbl_codigospostais
WHERE (codigo < 1100 OR codigo > 1500)
ORDER BY codigo ASC;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
34. ORDER BY
SELECT *
FROM tbl_codigospostais
ORDER BY codigo ASC, local DESC;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
35. Seleção de Expressões
SELECT codigo, local, codigo + 1000
FROM tbl_codigospostais
where código <2000;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local Expr1
1000 LISBOA 2000
1100 LISBOA 2100
1500 LISBOA 2500
36. Sumario 139-140 (187) +3h
• Módulo 14 – Linguagem de manipulação de dados
• Comando insert – seleção de expressões. Utilização de funções (linha
e grupo).
37. Seleção de Expressões
SELECT codigo, local, codigo + 1000 AS ‘Novo Codigo’
FROM tbl_codigospostais
where código <2000;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local Novo Código
1000 LISBOA 2000
1100 LISBOA 2100
1500 LISBOA 2500
38. Funções
• Def. Permitem aplicar formulas na query para atingir e formatar
resultados.
• Estas podem ser funções de linha e funções de grupo.
Um função de linha devolve um resultado por linha da tabela acedida.
Já uma função de grupo retorna um resultado por grupo de registros.
39. Funções de Linha
• Exemplos de Funções de Linha:
- LCASE ("UFF") » uff
- UPPER ("uff") » UFF
- INITCAP (“escola secundária Dom") » Escola Secundária Dom (ORACLE)
- CONCAT ("String1", "String2") » String1String2
- SUBSTR ("String", 1, 3) » Str
- LENGTH ("UFF") » 3
- IFNULL (SAL, 0) » Se SAL for NULO seu valor será convertido para zero.
- ROUND (78.731, 2) » 78.73 (Até 4 p/ baixo, Acima de 4 p/ cima)
- ROUND (78.731, 0) » 79
- TRUNC (78.731, 2) » 78.73
- TRUNC (78.731) » 78
- MOD (100, 30) » 10
•MID() - Extract characters from a text field
•LEN() - Returns the length of a text field
•NOW() - Returns the current system date and time
•FORMAT() - Formats how a field is to be displayed
40. Funções de Grupo
• Funções de Grupo Existentes:
• AVG() - Média
• COUNT() – Total de registos
• FIRST() – Mostra o primeiro valor
• LAST() – Mostra o ultimo valor
• MAX() – O máximo (Maior)
• MIN() – O Mínimo (valor mais pequeno)
• SUM() – Soma dos resultados
• VARIANCE(), STDDEV e STDEVP () (Estatísticas)
41. Insert Into
• Sintaxe:
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
Não é preciso especificar os campos desde que:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
42. INSERT INTO
• Inserir registos nas tabelas.
• INSERT INTO tbl_codigospostais (codigo, local)
• values (2900, ‘Setúbal’);
• INSERT INTO tbl_codigospostais (codigo, local)
• values (5900, ‘Viana do Castelo’);
44. UPDATE
UPDATE from tbl_codigopostal set local= ‘PORTO’
where codigo=2000;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 SANTARÉM
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 PORTO
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
45. DELETE
• Sintaxe:
DELETE FROM table_name
WHERE [condition];
(na condição pode-se usar o AND e OR).
Cuidado ao realizar o: Delete From table;
46. DELETE - Exemplos
Delete from tbl_codigopostal
where local=‘PORTO’;
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2040 RIO MAIOR
2300 TOMAR
codigo local
1000 LISBOA
1100 LISBOA
1500 LISBOA
2000 PORTO
2040 RIO MAIOR
2300 TOMAR
4000 PORTO
47. Juntando várias tabelas
• O Modelo Relacional estabelece claramente as regras para a divisão
da informação entre tabelas, de forma a evitar a duplicação da
informação.
• Esta dispersão da informação por diferentes tabelas é facilmente
manipulável através da linguagem SQL, um vez que a ligação entre
estas será realizada através das chaves estrangeiras.
48. • A junção entre tabelas faz-se colocando na cláusula FROM o conjunto
de tabelas que se pretende juntar.
SELECT campo1, campo2, ... Campo n
FROM tabela 1 , tabela 2, .... tabela n
49. Produto Cartesiano de Tabelas
Id Nome Idade Telefone Cod_postal Código Local
71 António Dias 43 789654 1000 1000 Lisboa
54 Célia Morais 36 123456 1000 2000 Santarém
12 Isabel Silva 28 2040 2040 Rio Maior
49 José António 17 333555 2000 4000 Porto
Consideremos as seguintes relações (Pessoa e Postal):
SELECT *
FROM Pessoa, Postal
Obtém-se um resultado bastante inesperado e que consiste no produto cartesiano de dois conjuntos de
elementos.
O produto cartesiano entre as tabelas Pessoa e Postal associa a cada linha da tabela Pessoa o conjunto das
linhas da tabela Postal.
50. Produto Cartesiano de Tabelas
Id Nome Idade Telefone Cod_postal Código Local
71 António Dias 43 789654 1000 1000 Lisboa
71 António Dias 43 789654 1000 2000 Santarém
71 António Dias 43 789654 1000 2040 Rio Maior
71 António Dias 43 789654 1000 4000 Porto
54 Célia Morais 36 123456 1000 1000 Lisboa
54 Célia Morais 36 123456 1000 2000 Santarém
54 Célia Morais 36 123456 1000 2040 Rio Maior
54 Célia Morais 36 123456 1000 4000 Porto
12 Isabel Silva 28 2040 1000 Lisboa
12 Isabel Silva 28 2040 2000 Santarém
12 Isabel Silva 28 2040 2040 Rio Maior
12 Isabel Silva 28 2040 4000 Porto
49 José António 17 333555 2000 1000 Lisboa
49 José António 17 333555 2000 2000 Santarém
49 José António 17 333555 2000 2040 Rio Maior
49 José António 17 333555 2000 4000 Porto
Dado que na tabela Pessoa existem 4
registos e na tabela Postal existem 4
registos, o resultado do produto cartesiano
será 4*4 = 16 registos.
51. Produto Cartesiano de Tabelas
Id Nome Idade Telefone Cod_postal Código Local
71 António Dias 43 789654 1000 1000 Lisboa
71 António Dias 43 789654 1000 2000 Santarém
71 António Dias 43 789654 1000 2040 Rio Maior
71 António Dias 43 789654 1000 4000 Porto
54 Célia Morais 36 123456 1000 1000 Lisboa
54 Célia Morais 36 123456 1000 2000 Santarém
54 Célia Morais 36 123456 1000 2040 Rio Maior
54 Célia Morais 36 123456 1000 4000 Porto
12 Isabel Silva 28 2040 1000 Lisboa
12 Isabel Silva 28 2040 2000 Santarém
12 Isabel Silva 28 2040 2040 Rio Maior
12 Isabel Silva 28 2040 4000 Porto
49 José António 17 333555 2000 1000 Lisboa
49 José António 17 333555 2000 2000 Santarém
49 José António 17 333555 2000 2040 Rio Maior
49 José António 17 333555 2000 4000 Porto
O pretendido seria a junção entre as tabelas
Pessoa e Postal. Para tal é necessário, na
cláusula WHERE, indicar as chaves
estrangeiras de ligação.
52. Produto Cartesiano de Tabelas
Id Nome Idade Telefone Cod_postal Código Local
71 António Dias 43 789654 1000 1000 Lisboa
54 Célia Morais 36 123456 1000 1000 Lisboa
12 Isabel Silva 28 2040 2040 Rio Maior
49 José António 17 333555 2000 2000 Santarém
SELECT *
FROM Pessoa, Postal
WHERE Cod_postal = Código
53. Equi-Join
• Acontece quando todas as colunas das tabelas são apresentadas e a
ligação entre as tabelas é feita através de uma igualdade, dando
origem assim a duas colunas de conteúdos exatamente iguais.
SELECT *
FROM Pessoa, Postal
WHERE Cod_postal = Código
Id Nome Idade Telefone Cod_postal Código Local
71 António Dias 43 789654 1000 1000 Lisboa
54 Célia Morais 36 123456 1000 1000 Lisboa
12 Isabel Silva 28 2040 2040 Rio Maior
49 José António 17 333555 2000 2000 Santarém
54. Natural Join
• Acontece quando todas as colunas envolvidas na ligação entre tabelas
são apresentadas sem repetição de colunas.
SELECT Pessoa.*, Postal.Local
FROM Pessoa, Postal
WHERE Cod_postal = Código
Id Nome Idade Telefone Cod_postal Local
71 António Dias 43 789654 1000 Lisboa
54 Célia Morais 36 123456 1000 Lisboa
12 Isabel Silva 28 2040 Rio Maior
49 José António 17 333555 2000 Santarém
55. INNER JOIN
• Estes dois tipos de ligação entre tabelas fazem parte de um tipo de
ligação mais geral denominada INNER JOIN.
• Num INNER JOIN, apenas são apresentados os registos em que exista
ligação entre as tabelas.
http://www.codeproject.com/Articles/33052/Visual-Representation-of-
SQL-Joins
56. INNER JOIN
• Embora existam diversos tipos de ligação entre tabelas (JOIN), este é
o tipo mais comum e utilizado.
• Pretende-se selecionar o nome e morada completa (código e
localidade) de todas as pessoas da tabela Pessoa.
SELECT Nome, Cod_postal, Local
FROM Pessoa, Postal
Where Cod_postal = Código
Nome Cod_postal Local
António Dias 1000 Lisboa
Célia Morais 1000 Lisboa
Isabel Silva 2040 Rio Maior
José António 2000 Santarém
57. INNER JOIN
• Embora ainda de uso pouco comum, é possível, em alguns sistemas,
escrever o mesmo SELECT num formato em que se especifique a
natureza do Join (INNER), no mesmo exemplo mas ordenando o
resultado por Código Postal.
SELECT Nome, Cod_postal, Local
FROM Pessoa INNER JOIN Postal
ON Pessoa.Cod_postal = Postal.Código
ORDER BY Pessoa.Cod_postal
Nome Cod_postal Local
António Dias 1000 Lisboa
Célia Morais 1000 Lisboa
José António 2000 Santarém
Isabel Silva 2040 Rio Maior
58.
59. OUTER JOIN - LEFT
• O conceito do Outer Join é obter numa ligação a totalidade das linhas de uma tabela,
ainda que não exista o correspondente valor na outra tabela a que esta está ligada pela
junção.
• Pretende-se selecionar o nome e morada completa (código e localidade) de todas as
pessoas da tabela Pessoa, assim como todos os código postais existentes na tabela
Postal.
SELECT Nome, Cod_postal, Código, Local
FROM Postal LEFT JOIN Pessoa
ON Postal.Código = Pessoa.Cod_postal
• Todas as linhas da tabela Postal são apresentadas. Se existir correspondente na coluna
Cod_postal da tabela Pessoa, são mostrados os dados, senão as entradas da tabela
Pessoa são preenchidas a NULL.
Nome Cod_postal Código Local
António Dias 1000 1000 Lisboa
Célia Morais 1000 1000 Lisboa
1100 Lisboa
José António 2000 2000 Santarém
Isabel Silva 2040 2040 Rio Maior
2300 Tomar
4000 Porto
60. OUTER JOIN
• Quando o Outer Join é efectuado à direita, são considerados todos os
registos da tabela da direita e apenas os registos correspondentes na
tabela da esquerda.
• Pretende-se selecionar todas as pessoas da tabela pessoa, assim
como os correspondentes valores de comissão.
Id Nome Idade Id Id_msg Valor
71 António Dias 43 49 10 1250
12 Isabel Silva 28 49 70 750
49 José António 17 71 12 100
85 João Silva 49 71 15 200
61. OUTER JOIN
• Pretende-se selecionar todas as pessoas da tabela pessoa, assim
como os correspondentes valores de comissão.
SELECT Nome, Valor
FROM Comissão RIGHT JOIN Pessoa
ON Comissão.Id = Pessoa.Id
• Saber todas as pessoas e quais as correspondências na comissão
mesmo que não tenham valor.
Id Nome Idade Id Id_msg Valor
71 António Dias 43 49 10 1250
12 Isabel Silva 28 49 70 750
49 José António 17 71 12 100
85 João Silva 49 71 15 200
Nome Valor
António Dias 100
António Dias 200
Isabel Silva
José António 1250
José António 750
João Silva
62. SELF JOIN
• O Self Join é uma variante do Inner Join, em que se comparam duas colunas
da mesma tabela.
•
• Pretende-se saber quais os tipos de códigos postais existentes diferentes do
local LISBOA.
SELECT p1.Código, p2.Local
FROM Postal.p1, Postal.p2
WHERE p1.Código = p2.Código
AND
p2.Local <> “Lisboa”
63. UNION
SELECT Id_msg, Mensagem FROM Mensagem
UNION
SELECT Código, Local FROM PostalId_msg Mensagem
10 Comissão de vendas
30 Vendas extra
40 Refeições
1000 Lisboa
2040 Rio Maior
4000 Porto
Uma união não é propriamente uma ligação entre tabelas.
A UNION permite juntar o conteúdo de múltiplos comandos SELECT.
Pretende-se juntar o código e a descrição da tabela mensagens aos códigos
postais.
Depois de executados os comandos, os resultados obtidos serão:
Na UNION, o número de campos a selecionar em cada um dos comandos
SELECT tem de ser igual.
O nome dos campos não é relevante, mas o tipo de dados que pode ser agrupado
depende de sistema para sistema.
64. Funções de agregação/conjunto/grupo
Estas funções, também designadas por Funções Estatísticas, têm por objetivo obter informação sobre conjuntos de
linhas especificadas na cláusula WHERE ou sobre grupos de linhas indicadas na cláusula GROUP BY.
Função Descrição
COUNT(campo) Devolve o número de linhas.
MAX(campo) Devolve o maior valor da coluna.
MIN(campo) Devolve o menor valor da coluna.
SUM(campo) Devolve a soma de todos os valores da coluna.
AVG(campo) Devolve a média de todos os valores da coluna.
65. FUNÇÃO COUNT
• A função de agregação COUNT devolve o número de linhas que
resultam num SELECT.
• Pode ser utilizada de três formas distintas:
Forma Descrição
COUNT (*) Devolve o número de linhas que resulta de um SELECT.
COUNT (coluna) Devolve o número de ocorrências na coluna diferentes de NULL.
COUNT (DISTINCT coluna) Devolve o número de ocorrências (sem repetições) na coluna.
66. MIN e MAX
• As funções de agregação MIN e MAX permitem obter o menor e o
maior valor de uma determinada coluna.
Exemplo: Pretende-se saber qual o salário mais elevado e o salário mais baixo da
tabela Pessoa.
SELECT MAX (salário) AS [Salário mais elevado],
MIN (salário) AS [Salário mais baixo]
FROM Pessoa
Salário mais elevado Salário mais baixo
235000 86000
67. Exemplos práticos
• Pretende-se saber a idade da pessoa mais nova e a idade da pessoa
mais velha da tabela Pessoa.
• ?
• Qual o país com mais e com menos população?
• ?
• Nota: também “funciona” alfabeticamente.
68. SUM
A função SUM devolve a soma de uma determinada coluna.
Pretende-se saber o total de salários da tabela Pessoa.
SELECT SUM (salário) AS [Total de Salários]
FROM Pessoa
E quanto é 10% do total dos salários?
Id Nome Idade Salário Telefone Cod_postal
42 António Dias 43 94000 7896544 1000
5 Célia Morais 36 170000 1234565 1000
32 Florinda Simões 35 147000 4000
37 Isabel Espada 28 86000 2040
49 José António 17 210000 1000
14 Nascimento Augusto 35 220000 4561233 2300
75 Pedro Santos 42 235000 2040
Total de Salários
1162000
69. AVG
A função AVG devolve a média dos valores de uma determinada coluna.
• Pretende-se saber a média das idades da tabela Pessoa.
SELECT AVG (idade) AS [Média de Idades]
FROM Pessoa Média de idades
33.714285714285714
70. Agrupando a informação
• As funções de agregação são uma ferramenta útil quando usada para
obter informação resumida sobre o resultado de um comando
SELECT.
• No entanto, estas funções podem ser particularmente úteis no
tratamento de informação de forma agrupada, não como um todo, mas
em grupos mais pequenos.
71. Agrupando a informação
• Pretende-se mostrar as comissões e respetivos valores, ordenando o
resultado por Id da tabela comissão.
SELECT Id_comissão, Valor
FROM Comissão
ORDER BY Id_comissão
SELECT SUM(Valor) AS Total
FROM Comissão
Id_comissão Valor Id_comissão Valor
14 2600 37 120
14 400 37 5500
14 3750 37 14230
14 10500 37 20
25 370 40 20
25 2400 42 150
25 100 42 20
Total
40180
72. Agrupando a informação
• No entanto, se o objectivo fosse obter a soma das comissões por cada
Id_comissão, o resultado apresentado não seria o pretendido.
• Para resolver essas questões é necessário, antes de aplicar as funções de
agregação, possuir a informação agrupada.
SELECT campo1, campo2, ... campon
FROM tabela 1 , tabela 2, .... tabela n
[WHERE Condição ]
[GROUP BY ............]
73. Cláusula GROUP BY
• Esta cláusula divide o resultado de um SELECT em grupos de
resultados que irão ser tratados com as funções de agregação.
A cláusula GROUP BY é utilizada para agrupar informação.
Os registos são processados em grupos de características semelhantes.
As funções de agregação podem ser utilizadas para obter informação
sobre cada um dos grupos.
74. Agrupando a informação
• Pretende-se mostrar as comissões e respetivos valores, ordenando o
resultado por Id da tabela comissão.
SELECT Id_comissão, Valor
FROM Comissão
ORDER BY Id_comissão
SELECT SUM(Valor) AS Total
FROM Comissão
Id_comissão Valor Id_comissão Valor
14 2600 37 120
14 400 37 5500
14 3750 37 14230
14 10500 37 20
25 370 40 20
25 2400 42 150
25 100 42 20
Total
40180
75. Agrupando a informação
• Pretende-se saber, para cada Id, o total de valores de comissões.
SELECT Id_comissão, SUM(Valor) AS Total
FROM Comissão
GROUP BY Id_comissão Id_comissão Total
14 17250
25 2870
37 19870
40 20
42 170
76. Exercícios práticos
• Pretende-se saber, para cada Id, o maior valor de comissão?
• Pretende-se saber para cada Id, o maior valor de comissão,
efectuando a ordenação descendente por maior valor de comissão?
77. Resposta
SELECT MAX(Valor) AS Maior, Id_comissão
FROM Comissão
GROUP BY Id_comissão
ORDER BY MAX(Valor) DESC
Maior Id_comissão
14230 37
10500 14
2400 25
150 42
20 40
80. • using (var conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=C:BC207test.accdb"))
• using (var comm = conn.CreateCommand())
• {
• comm.CommandText = "SELECT password FROM HAHA";
• comm.CommandType = CommandType.Text;
• conn.Open();
• var returnValue = comm.ExecuteScalar();
• MessageBox.Show(returnValue.ToString());
81. • ExecuteScalar is typically used when your query returns a single value.
If it returns more, then the result is the first column of the first row.
An example might be SELECT @@IDENTITY AS 'Identity'.
• •ExecuteReader is used for any result set with multiple rows/columns
(e.g., SELECT col1, col2 from sometable).
• •ExecuteNonQuery is typically used for SQL statements without
results (e.g., UPDATE, INSERT, etc.).
82. using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
//
// Create new SqlCommand object.
//
using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1", connection))
{
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
int weight = reader.GetInt32(0); // Weight int
string name = reader.GetString(1); // Name string
string breed = reader.GetString(2); // Breed string
Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight, name, breed);
}
}
}