Este documento resume estratégias para introdução e remoção de dados em bancos de dados relacionais, incluindo:
1) Preencher primeiro tabelas sem chaves estrangeiras e depois tabelas com chaves estrangeiras referenciando chaves primárias já existentes;
2) Apagar dados primeiro de tabelas com chaves estrangeiras e depois tabelas sem chaves estrangeiras;
3) Exemplos de comandos SQL como INSERT, SELECT, WHERE, ORDER BY, LIMIT e diferentes tipos de JOIN (INNER, LEFT OUTER, RIGHT OUTER) para recuperar dados de múlt
1. Bases de dados: SQL
SELECT, INNER JOINS e OUTER JOINS
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula 06, 07-03-2012
2. Estratégia para a introdução de dados numa BD
Para não violar a integridade referencial da BD
• Só podemos introduzir valores nas FK que já existam nas PK com que as
primeiras estão relacionadas:
• preencher primeiro as tabelas que não tenham FK
• preencher depois as tabelas com FK, desde que as PK dessas relações
já tenham valores
Clientes Encomendas
idCliente nomeCliente nrEncomenda dataEncomenda Clientes_idCliente
1 João 1 2010-‐02-‐23 1
2 Maria 2 2010-‐04-‐11 2
3 Manuel 3 2010-‐03-‐13 2
4 2010-‐05-‐21
5 2010-‐06-‐25 5
3. E para apagar dados e tabelas?
Inverter a ordem anterior!
• apagar primeiro os dados e as tabelas que tenham FK
4. Exemplos de SQL com INSERT
INSERT
• INSERT INTO table_name VALUES (value1, value2, value3,...) -> se não
existir uma PK com auto incremento
• INSERT INTO decoracao.Vendedores (NomeVend, ApelidoVend) VALUES
('Manuel','Vieira');
5. SQL: SELECT
Vamos considerar como exemplo o exercício de gestão dos CDs. A base
de dados designa-se “MeusCDs” e existe uma tabela com os “Amigos”
• SELECT * FROM MeusCDs.Amigos;
“Devolve todos os campos de todos os registos existentes na tabela
Amigos da BD MeusCDs”
• SELECT nome, email FROM MeusCDs.amigos;
“Devolve os campos nome e email de todos os registos existentes na
tabela Amigos da BD MeusCDs”
6. SQL: SELECT ... WHERE
Para selecionar um determinado conjunto de registos utiliza-se a cláusula
WHERE
• SELECT nome_colunas
FROM nome_tabela
WHERE nome_coluna operador valor;
A ter em atenção:
• a coluna da condição não tem que estar na lista de nome_colunas
• um valor do tipo string é escrito como “valor” ou ‘valor’
• os operadores possíveis de utilizar são: =, <>, >, <, >=, <=, BETWEEN,
LIKE e IN
• o operador LIKE só deve ser utilizado para pesquisas em campos do tipo
string
7. SQL: SELECT ... WHERE
• SELECT * FROM MeusCDs.amigos WHERE nome = ”Rui”;
• SELECT * FROM MeusCDs.amigos WHERE nome > ‘Carlos’;
• SELECT * FROM MeusCDs.amigos WHERE nome > Carlos;
“Unknown column ‘Carlos’ in ‘WHERE clause’
8. SQL: SELECT ... WHERE ... LIKE
Wildcards em SQL com operador LIKE
• “_” -> pode ser substituído por qualquer caracter (mas apenas 1)
• “%” -> pode ser substituído por 0 ou mais caracteres
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”R%”;
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”r%”;
9. SQL: SELECT ... WHERE ...
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”%o%”;
As condições também podem incluir os operadores lógicos: AND e OR
• SELECT * FROM MeusCDs.amigos
WHERE nome="pedro" OR email LIKE "r%";
10. SQL: SELECT ... ORDER BY ...
Os resultados finais podem ser ordenados pelos valores de uma ou mais
colunas
• SELECT nome_colunas
FROM nome_tabela
ORDER BY nome_coluna(s) [ASC|DESC]
A ter em atenção:
• a coluna que tem mais prioridade é a que aparece primeiro na lista de
colunas
• por defeito, a ordenação é ascendente
11. SQL: SELECT ... ORDER BY ...
• SELECT * FROM MeusCDs.amigos ORDER BY nome;
• SELECT * FROM MeusCDs.amigos ORDER BY nome DESC;
12. SQL: SELECT ... LIMIT ...
Os resultados finais podem ser limitados a uma determinada gama de
resultados
• SELECT nome_colunas
FROM nome_tabela
LIMIT X,Y;
A ter em atenção:
• X é o índice do primeiro elemento do resultado global que queremos obter
• Y é o número de resultados
• mecanismo muito útil para criar mecanismos de paginação de resultados!
13. SQL: SELECT ... LIMIT ...
• SELECT * FROM MeusCDs.amigos LIMIT 1,2;
• SELECT * FROM MeusCDs.amigos LIMIT 3,100;
14. E como obter dados resultantes de várias tabelas?
Os processos de combinar dados de várias tabelas no âmbito de uma
query são suportados pelas relações (JOINS) existentes entre elas.
• exemplo: “listar todos os empréstimos indicando o nome do amigo”
amigos empresLmos
id_amigo nome telefone id_empresLmo data_empresLmo data_devolucao id_amigo
1 José
Mourinho 916545955 1 2010-‐02-‐23 2010-‐02-‐25 1
2 Jorge
Jesus 234545955 2 2010-‐04-‐11 2010-‐04-‐18
3 Domingos
Paciência 234897897 3 2010-‐03-‐13 2010-‐03-‐19 1
4 Vítor
Pereira 923435566 4 2010-‐05-‐21 2010-‐05-‐23 4
5 André
Villas-‐Boas 934975766 5 2010-‐06-‐25 2010-‐06-‐29
15. Joins
amigos empresLmos
id_amigo nome telefone id_empresLmo data_empresLmo data_devolucao id_amigo
1 José
Mourinho 916545955 1 2010-‐02-‐23 2010-‐02-‐25 1
2 Jorge
Jesus 234545955 2 2010-‐04-‐11 2010-‐04-‐18
3 Domingos
Paciência 234897897 3 2010-‐03-‐13 2010-‐03-‐19 1
4 Vítor
Pereira 923435566 4 2010-‐05-‐21 2010-‐05-‐23 4
5 André
Villas-‐Boas 934975766 5 2010-‐06-‐25 2010-‐06-‐29
amigos
sem
amigos
com emprésLmos
emprésLmos emprésLmos sem
amigos
registos registos
não
relacionados registos não
relacionados
relacionados
16. INNER JOIN (standard/exclusivo/natural)
Num join natural, um INNER JOIN, os dados resultantes de uma query são
apenas aqueles que podem ser relacionados entre as duas tabelas.
• SELECT nome_coluna(s)
FROM nome_tabela1
INNER JOIN nome_tabela2
ON nome_tabela1.nome_coluna=nome_tabela2.nome_coluna;
A ter em atenção:
• os campos mencionados na condição do join são a PK e FK que
estabelecem a relação entre as duas tabelas
• os dados da tabela “nome_tabela1” que não estão relacionados com
dados da tabela “nome_tabela2” não são retornados na query
• o inverso da última afirmação também é verdade
17. INNER JOIN
Exemplo: Selecionar todos os Amigos com Empréstimos
• SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimo
FROM MeusCDs.amigos
INNER JOIN MeusCDs.emprestimos
ON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
• SELECT amigos.nome, emprestimos.id_emprestimo
FROM amigos
INNER JOIN emprestimos
ON amigos.id_amigo = emprestimos.id_amigo;
18. INNER JOIN
Exemplo: Selecionar todos os Amigos com Empréstimos
• SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimo
FROM MeusCDs.amigos
INNER JOIN MeusCDs.emprestimos
ON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
19. OUTER JOIN (inclusivos)
Os OUTER JOINS permitem obter os registos relacionados e os não
relacionados. Podem ser do tipo LEFT ou RIGHT, de acordo com o sentido
do JOIN.
• LEFT JOIN Mostra todos os registos relacionados
(Amigos com Empréstimos)
+
Registos não relacionados da tabela esquerda (tabela de partida): amigos
(Amigos sem Empréstimos)
• RIGHT JOIN Mostra todos os registos relacionados
(Amigos com Empréstimos)
+
Registos não relacionados da tabela direita (tabela de chegada):
emprestimos (Empréstimos sem Amigos)
20. LEFT OUTER JOIN
Exemplo: Seleccionar todos os amigos com empréstimos e todos os
amigos sem empréstimos
• SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimo
FROM MeusCDs.amigos
LEFT JOIN MeusCDs.emprestimos
ON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
21. JOINS: exemplo 2
Considere-se um stand automóvel onde cada vendedor é responsável pela
venda de vários automóveis. No entanto, num dado momento, poderão
existir: vendedores sem automóveis atribuídos e automóveis sem
vendedor atribuído.
22. JOINS: exemplo 2
Selecionar todos os vendedores com carros atribuídos
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,
stand.automoveis.Modelo
FROM stand.vendedores
INNER JOIN stand.automoveis
ON stand.vendedores.idVENDEDORES =
stand.automoveis.VENDEDORES_idVENDEDORES
23. JOINS: exemplo 2
Selecionar todos os vendedores com e sem carros atribuídos
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,
stand.automoveis.Modelo
FROM stand.vendedores
LEFT JOIN stand.automoveis
ON stand.vendedores.idVENDEDORES =
stand.automoveis.VENDEDORES_idVENDEDORES
24. JOINS: exemplo 2
Na tabela automóveis foram adicionados 2 novos registos (2 novos
automóveis) aos quais ainda não foi atribuído um vendedor.
Selecionar todos os vendedores com carros atribuídos e os carros sem
vendedor atribuído
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,
stand.automoveis.Modelo
FROM stand.vendedores
RIGHT JOIN stand.automoveis
ON stand.vendedores.idVENDEDORES =
stand.automoveis.VENDEDORES_idVENDEDORES
25. JOINS: FULL JOIN no MySQL
Selecionar todos os vendedores com carros atribuídos e sem carros
atribuídos e todos os carros atribuídos e carros sem vendedor atribuído
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,
stand.automoveis.Modelo
FROM stand.vendedores
LEFT JOIN stand.automoveis
ON stand.vendedores.idVENDEDORES =
stand.automoveis.VENDEDORES_idVENDEDORES
UNION
SELECT stand.vendedores.Nome, stand.automoveis.Marca,
stand.automoveis.Modelo
FROM stand.vendedores
RIGHT JOIN stand.automoveis
ON stand.vendedores.idVENDEDORES =
stand.automoveis.VENDEDORES_idVENDEDORES
26. JOINS: FULL JOIN no MySQL
Selecionar todos os vendedores com carros atribuídos e sem carros
atribuídos e todos os carros atribuídos e carros sem vendedor atribuído