Junções em SQL
Inner, left, right, full, cross join
Fundamentos de Banco de Dados
Profa. Roberta Macêdo M. Gouveia
robertammg@gmail.com
Junções SQL
• SQL é baseada na álgebra relacional, uma forma de cálculo
sobre conjuntos e relações.
• Em SQL algumas das operações de junções entre tabelas podem
ser facilmente demonstradas com a teoria dos conjuntos.
– Os diagramas de Venn simbolizam graficamente as propriedades
relativas aos conjuntos e sua teoria.
INNER JOIN LEFT JOIN LEFT JOIN
(exclusiva)
RIGHT JOIN RIGHT JOIN FULL OUTER JOIN
(exclusiva)
FULL OUTER JOIN (exclusiva)
Junções em SQL
• Exemplos de Junções
Criar as duas tabelas abaixo no BD: Marcas e Carros.
create table carros(
marca varchar(100),
modelo varchar(100),
ano int,
cor varchar(100))
create table marcas(
marca varchar(50),
nome varchar(50))
Junções em SQL
Inserir Dados nas Tabelas:
6 registros na tabela Marcas e 14 registros na tabela Carros.
insert into marcas values ('VW','Volkswagem'), ('Ford','Ford'), ('GM','General
Motors'), ('Fiat','Fiat'), ('Renault','Renault'), ('MB','Mercedes Bens')
insert into carros values ('VW','Fox',2005,'preto'), ('VW','Fox',2008,'preto'),
('Ford','Ecosport',2009,'verde'), ('Ford','KA',2008,'prata'),
('Fiat','Punto',2008,'branco'), ('Fiat','Uno',2007,'preto'),
('Fiat','Stilo',200,'4prata'), ('Fiat','Uno',2005,'prata'), ('Fiat','Stilo',2008,'verde'),
('Fiat','Uno',2009,'branco'), ('Peugeot','207',2010,'prata'),
('Peugeot','207',2010,'prata'), ('Peugeot','207',2007,'azul'), ('Chrysler','300
C',2008,'verde')
Junções em SQL
Tabela Marcas
6 marcas
Tabela Carros
14 carros
Junções em SQL – INNER JOIN
A junção inner join irá juntar os registros
da tabela MARCA que tiver um
correspondente na tabela CARROS.
Exemplo:
select m.nome, c.modelo
from marcas as m inner join carros as c
on m.marca=c.marca
Resultado INNER JOIN
Tabela Marcas
6 marcas
Tabela Carros
14 carros
INNER JOIN
10 tuplas
Podemos dizer que 10 carros estão associados a alguma marca,
enquanto que os demais não.
Junções em SQL – LEFT JOIN
O left join irá fazer a junção das duas
tabelas “dando preferência” aos registros
da tabela marcas.
Exemplo:
select m.nome, c.modelo
from marcas as m left join carros as c
on m.marca= c.marca
Resultado LEFT JOIN
Tabela Marcas
6 marcas
Tabela Carros
14 carros
LEFT JOIN
13 tuplas
As marcas General Motors, Renault e Mercedes Bens não tem nenhum carro
cadastrado, mesmo assim elas apareceram no resultado.
Junções em SQL – LEFT JOIN (EXCLUSIVA)
Esta consulta retorna todos os registros
da tabela da esquerda que não possuem
coincidentes na tabela da direita.
select m.nome, c.modelo
from marcas as m left join carros as c
on m.marca= c.marca
where c.modelo is null
*c.marca
Junções em SQL – LEFT JOIN (EXCLUSIVA)
Tabela Marcas
6 marcas
Tabela Carros
14 carros
LEFT JOIN (EXCLUSIVA)
3 tuplas
As marcas General Motors, Renault e Mercedes Bens não tem nenhum carro
cadastrado.
Junções em SQL – RIGHT JOIN
A junção right join funciona de forma
inversa ao left join.
Com o right join será mostrado todos
os carros, mesmo aqueles que não
estejam associados a nenhum registro
da tabela marcas. Exemplo:
select m.nome, c.modelo
from marcas as m right join carros as c
on m.marca=c.marca
Junções em SQL – RIGHT JOIN
Tabela Marcas
6 marcas
Tabela Carros
14 carros
RIGHT JOIN
14 tuplas
Os modelos “207” e “300 C” estão cadastrados em Carros, mas não estão
associados a nenhuma Marca.
Junções em SQL – RIGHT JOIN (EXCLUSIVA)
Esta consulta retorna todos os registros
da tabela da direita que não possuem
coincidentes na tabela da esquerda.
Exemplo:
select m.nome, c.modelo
from marcas as m right join carros as c
on m.marca=c.marca
where m.marca is null
Junções em SQL – RIGHT JOIN (EXCLUSIVA)
Tabela Marcas
6 marcas
Tabela Carros
14 carros
RIGHT JOIN
(EXCLUSIVA)
4 tuplas
Os modelos “207” e “300 C” estão cadastrados em Carros, mas não estão
associados a nenhuma Marca.
Junções em SQL – CROSS JOIN
A junção cross join irá unir todos os
registros da tabela MARCAS com Essa junção não pode
todos os registros da tabela CARROS, ser representada
graficamente pelo
formando um Produto Cartesiano. Diagrama de Venn!
Exemplo:
select m.nome, c.modelo
from marcas as m cross join carros as c
Junções em SQL – CROSS JOIN
Tabela Marcas
6 marcas
Tabela Carros
14 carros
...
CROSS JOIN
84 tuplas
Junções em SQL – FULL OUTER JOIN
A junção full outer join não é implementada no MySQL, mas pode-
se obter o mesmo resultado usando união de left join com right
join. Ou seja, ela irá mostrar todas as marcas e todos os carros,
independente de existir valores correspondente na tabela oposta.
select m.nome, c.modelo
from marcas as m left join carros as c on m.marca= c.marca
UNION
select m.nome, c.modelo
from marcas as m right join carros as c on m.marca= c.marca
left join UNIÃO right join
Junções em SQL – FULL OUTER JOIN
Tabela Marcas
6 marcas
Tabela Carros
14 carros
FULL OUTER JOIN
11 tuplas
Junções em SQL – FULL OUTER JOIN (EXCLUSIVA)
A junção full outer join (exclusiva) é a
união de left join (exclusiva) com
right join (exclusiva). Ou seja, ela irá
mostrar as marcas que não tem
correspondência na tabela Carros, além de
mostrar os carros que não tem correspondência na tabela Marcas.
select m.nome, c.modelo
from marcas as m left join carros as c on m.marca= c.marca
where c.marca is null
UNION
select m.nome, c.modelo
from marcas as m right join carros as c on m.marca= c.marca
where m.marca is null
LEFT JOIN (EXCLUSIVA)
3 tuplas UNIÃO RIGHT JOIN
(EXCLUSIVA)
4 tuplas
Junções em SQL – FULL OUTER JOIN (EXCLUSIVA)
Tabela Marcas
6 marcas
FULL OUTER JOIN
Tabela Carros (EXCLUSIVA)
14 carros 5 tuplas
Observações:
NATURAL JOIN: não precisa identificar quais colunas serão
comparadas, pois ele fará a comparação entre campos com mesmo
nome.
Pode substituir ON por USING quando o nome nas duas tabelas for
idêntico.
SELECT * FROM Marcas INNER JOIN Carros USING (marca);
O uso do INNER é opcional.
SELECT * FROM marcas INNER JOIN Carros USING (marca);
Exercício Fixação
Realizar as seguintes consultas utilizando a sintaxe SQL.
(apresentar também a tabela resultante)
• Listar os nomes de todos os programadores e os nomes de suas respectivas
empresas. Apresentar a consulta de três formas: junção na cláusula where,
conexão interna (inner join) e junção natural.
• Listar os nomes dos programadores que programam em pelo menos uma
linguagem cadastrada no banco, e saber quais são os nomes dessas
linguagens.
• Listar os nomes de todos os programadores e os nomes das linguagens que
eles programam. Observação: se o programador não estiver associado a
nenhuma linguagem de programação, no resultado da consulta deve constar
null no nome da linguagem de programação.
• Listar os nomes de todas as empresas e seus programadores, independente
se a empresa tem ou não programadores.