Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Linguagem SQL
Junção e União
de Tabelas
SQL - Junção e União de Tabelas
17/12/2019 1
Juntando Várias Tabelas
• A junção de várias tabelas permite consultar, em um único
SELECT, informações contidas em diferentes tabelas.
• Para se fazer uma junção é necessário que as tabelas estejam
relacionadas.
• A junção entre duas tabelas é realizada através da ligação entre a
chave estrangeira de uma tabela e a respectiva chave primária
referenciada.
• Pode-se obter um produto cartesiano entre duas tabelas, mesmo
que elas não estejam relacionadas. Nesse caso, cada linha de uma
tabela estará associada a todas as linhas da outra tabela.
SQL - Junção e União de Tabelas 17/12/2019 2
Juntando Várias Tabelas
• Junção Interna: exibe apenas as linhas que participam do
relacionamento, ou seja, apenas os registros em que exista
ligação entre as tabelas serão exibidos.
A B C D
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
E F G H
30 31 32 33
34 35 36 37
38 39 40 41
42 43 44 45
46 47 48 49
50 51 52 53
54 55 56 57
58 59 60 61
SQL - Junção e União de Tabelas 17/12/2019 3
Juntando Várias Tabelas
Junção Interna: Resultado
A B C D E F G H
1 2 3 4 30 31 32 33
1 2 3 4 34 35 36 37
9 10 11 12 38 39 40 41
9 10 11 12 46 47 48 49
13 14 15 16 50 51 52 53
13 14 15 16 58 59 60 61
SQL - Junção e União de Tabelas 17/12/2019 4
Juntando Várias Tabelas
• Junção Externa Esquerda: exibe todas as linhas da tabela da
esquerda e apenas os registros correspondentes na tabela da
direita. Para as linhas onde não haja correspondência será exibido
NULL.
A B C D
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
E F G H
30 31 32 33
34 35 36 37
38 39 40 41
42 43 44 45
46 47 48 49
50 51 52 53
54 55 56 57
58 59 60 61
SQL - Junção e União de Tabelas 17/12/2019 5
Juntando Várias Tabelas
Junção Externa Esquerda: Resultado
A B C D E F G H
1 2 3 4 30 31 32 33
1 2 3 4 34 35 36 37
5 6 7 8 N N N N
9 10 11 12 38 39 40 41
9 10 11 12 46 47 48 49
13 14 15 16 50 51 52 53
13 14 15 16 58 59 60 61
17 18 19 20 N N N N
SQL - Junção e União de Tabelas 17/12/2019 6
Juntando Várias Tabelas
• Junção Externa Direita: exibe todas as linhas da tabela da direita
e apenas os registros correspondentes na tabela da esquerda.
Para as linhas onde não haja correspondência será exibido NULL.
A B C D
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
E F G H
30 31 32 33
34 35 36 37
38 39 40 41
42 43 44 45
46 47 48 49
50 51 52 53
54 55 56 57
58 59 60 61
SQL - Junção e União de Tabelas 17/12/2019 7
Juntando Várias Tabelas
Junção Externa Direita: Resultado
A B C D E F G H
1 2 3 4 30 31 32 33
1 2 3 4 34 35 36 37
9 10 11 12 38 39 40 41
N N N N 42 43 44 45
9 10 11 12 46 47 48 49
13 14 15 16 50 51 52 53
N N N N 54 55 56 57
13 14 15 16 58 59 60 61
SQL - Junção e União de Tabelas 17/12/2019 8
Juntando Várias Tabelas
• Junção Externa Completa: exibe todas as linhas da tabela da
direita e da esquerda, mesmo que existam linhas que não se
relacionam. Para as linhas onde não haja correspondência será
exibido NULL.
A B C D
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
E F G H
30 31 32 33
34 35 36 37
38 39 40 41
42 43 44 45
46 47 48 49
50 51 52 53
54 55 56 57
58 59 60 61
SQL - Junção e União de Tabelas 17/12/2019 9
Juntando Várias Tabelas
Junção Externa Completa: Resultado
A B C D E F G H
1 2 3 4 30 31 32 33
1 2 3 4 34 35 36 37
5 6 7 8 N N N N
9 10 11 12 38 39 40 41
9 10 11 12 46 47 48 49
N N N N 42 43 44 45
13 14 15 16 50 51 52 53
13 14 15 16 58 59 60 61
17 18 19 20 N N N N
N N N N 54 55 56 57
SQL - Junção e União de Tabelas 17/12/2019 10
Juntando Várias Tabelas
• Pode-se unir várias tabelas em um único SELECT, mas a ligação é
sempre feita entre duas tabelas de cada vez.
PK
+
FK
PK
PK
+
FK
RESULTADO
SQL - Junção e União de Tabelas 17/12/2019 11
Junção Interna com Duas Tabelas
Sintaxe:
SELECT <lista de colunas>
FROM <tabela1> [alias1]
[INNER] JOIN <tabela2> [alias2]
ON <condição de relacionamento>
SELECT <lista de colunas>
FROM <tabela1> [alias1], <tabela2> [alias2]
WHERE <condição de relacionamento>
• O formato da condição de relacionamento é:
PK da tabela1 = FK da tabela 2 ou
PK da tabela 2 = FK da tabela 1
SQL - Junção e União de Tabelas 17/12/2019 12
Junção Interna com Duas Tabelas
Exemplo 1: Exibir o código de cada pedido e o nome do cliente que
realizou cada um deles, ordenados pelo código do pedido.
SELECT pedido.idpedido AS [pedido], cliente.nome
FROM cliente INNER JOIN pedido
ON cliente.idcliente = pedido.idcliente
ORDER BY pedido.idpedido
SELECT pedido.idpedido AS [pedido], cliente.nome
FROM cliente, pedido
WHERE cliente.idcliente = pedido.idcliente
ORDER BY ‘
SQL - Junção e União de Tabelas 17/12/2019 13
Junção Interna com Duas Tabelas
Exemplo 2: Exibir para cada funcionário, código e nome do
funcionário, sigla e nome do setor onde trabalha, ordenados pela
sigla do setor e nome do funcionário.
SELECT fu.idfuncionario, fu.nome AS [funcionário],
se.idsetor, se.nome [setor]
FROM funcionario AS [fu] JOIN setor AS [se]
ON se.idsetor = fu.idsetor
ORDER BY se.idsetor, fu.nome
SELECT fu.idfuncionario, fu.nome AS [funcionário],
se.idsetor, se.nome [setor]
FROM funcionario AS [fu], setor AS [se]
WHERE se.idsetor = fu.idsetor
ORDER BY se.idsetor, fu.nome
SQL - Junção e União de Tabelas 17/12/2019 14
Junção Interna com Duas Tabelas
Exemplo 3: Exibir a quantidade, a média dos preços de venda
e de custo dos produtos de cada tipo, mostrando o código e o
nome do tipo do produto.
SELECT ti.idtipo, ti.nome [tipo],
COUNT(pr.idproduto) [quantidade],
AVG(venda) [venda], AVG(pr.custo) [custo]
FROM produto [pr] JOIN tipo [ti]
ON ti.idtipo = pr.idtipo
GROUP BY ti.idtipo, ti.nome
SQL - Junção e União de Tabelas 17/12/2019 15
Junção Interna Com Mais de Duas Tabelas
Sintaxe:
SELECT <lista de colunas>
FROM <tabela1> [alias1]
[INNER] JOIN <tabela2> [alias2]
ON <condição de relacionamento1>
[INNER] JOIN <tabela3> [alias3]
ON <condição de relacionamento2> ...
[INNER] JOIN <tabelaN> [aliasN]
ON <condição de relacionamentoN>
SQL - Junção e União de Tabelas 17/12/2019 16
Junção Interna Com Mais de Duas Tabelas
Sintaxe:
SELECT <lista de colunas>
FROM <tabela1> [alias1], <tabela2> [alias2],
<tabela3> [alias3], <tabelaN> [aliasN]
WHERE <condição de relacionamento1> AND
<condição de relacionamento2> AND
<condição de relacionamentoN>
SQL - Junção e União de Tabelas 17/12/2019 17
Junção Interna Com Mais de Duas Tabelas
Exemplo 1: Exibir o código dos pedidos, a via de transporte de cada
um deles, o nome do cliente e o nome do vendedor, ordenados pelo
código do pedido.
SELECT pe.idpedido [pedido], pe.via,
cl.nome [cliente], fu.nome [vendedor]
FROM pedido [pe] JOIN cliente [cl]
ON cl.idcliente = pe.idcliente
JOIN funcionario [fu]
ON fu.idfuncionario = pe.idvendedor
ORDER BY pe.idpedido
SQL - Junção e União de Tabelas 17/12/2019 18
Junção Interna Com Mais de Duas Tabelas
Exemplo 2: Exibir a lista dos pedidos, a via de transporte de cada um
deles, o nome do cliente e o nome do vendedor, ordenados pelo
código do pedido.
SELECT pe.idpedido [pedido], pe.via,
cl.nome [cliente], fu.nome [vendedor]
FROM pedido [pe], cliente [cl], funcionario [fu]
WHERE cl.idcliente = pe.idcliente and
fu.idfuncionario = pe.idvendedor
ORDER BY pe.idpedido
SQL - Junção e União de Tabelas 17/12/2019 19
Junção Interna Com Mais de Duas Tabelas
Exemplo 3: Exibir o código dos pedidos, com o nome de cada
produto, o preço pelo qual cada um foi vendido, a quantidade
vendida de cada produto em cada pedido, o valor do desconto e o
valor de cada item, ordenando pelo código do pedido e pelo nome
do produto em ordem ascendente.
SELECT pe.idpedido, pr.nome, it.preco, it.quant,
(it.preco*it.quant)*(1-it.desconto/100) [valor]
FROM pedido [pe] JOIN itens [it]
ON pe.idpedido = it.idpedido
JOIN produto [pr]
ON pr.idproduto = it.idproduto
ORDER BY pe.idpedido, pr.nome
SQL - Junção e União de Tabelas 17/12/2019 20
Junção Interna Com Mais de Duas Tabelas
Exemplo 4: Exibir o código dos pedidos, com o nome de cada
produto, o preço pelo qual cada um foi vendido, a quantidade
vendida de cada produto em cada pedido e o valor de cada item,
ordenando pelo código do pedido e pelo nome do produto em
ordem ascendente.
SELECT pe.idpedido, pr.nome, it.preco, it.quant,
it.preco*it.quant*(1-it.desconto/100) [valor]
FROM pedido [pe], itens [it], produto [pr]
WHERE pe.idpedido = it.idpedido and
pr.idproduto = it.idproduto
ORDER BY pe.idpedido, pr.nome
SQL - Junção e União de Tabelas 17/12/2019 21
Junção Interna Com Mais de Duas Tabelas
Exemplo 5: Exibir o nome do funcionário, o nome da cidade onde
reside, o nome da cidade e o nome do país onde nasceu, ordenados
pelo nome do funcionário em ordem ascendente.
SELECT fu.nome [funcionário], c1.nome [reside],
c2.nome [nasceu], pa.nome [país]
FROM funcionario [fu] JOIN cidade [c1]
ON c1.idcidade = fu.idreside
JOIN cidade [c2] ON c2.idcidade = fu.idnatural
JOIN pais [pa] ON pa.idpais = c2.idpais
ORDER BY fu.nome
SQL - Junção e União de Tabelas 17/12/2019 22
Junção Interna Com Mais de Duas Tabelas
Exemplo 6: Exibir o nome do país e a quantidade de clientes
existente em cada um deles, ordenando pelo nome do país em
ordem ascendente.
SELECT pa.nome, COUNT(cl.idcliente) [quantidade]
FROM cliente [cl] JOIN cidade [ci]
ON ci.idcidade = cl.idcidade
JOIN pais [pa] ON pa.idpais = ci.idpais
GROUP BY pa.nome
ORDER BY pa.nome
SQL - Junção e União de Tabelas 17/12/2019 23
Junção Interna Com Mais de Duas Tabelas
Exemplo 7: Exibir os nomes dos países estrangeiros e a quantidade
de pedidos realizados pelos clientes de cada um deles, mostrando
apenas os países para os quais houve mais de 10 pedidos,
ordenando pelo nome do país em ordem ascendente.
SELECT pa.nome, COUNT(pe.idpedido) [quantidade]
FROM cliente [cl] JOIN pedido [pe]
ON cl.idcliente = pe.idcliente
JOIN cidade [ci] ON ci.idcidade = cl.idcidade
JOIN pais [pa] ON pa.idpais = ci.idpais
WHERE pa.nome <> 'Brasil'
GROUP BY pa.nome
HAVING COUNT(pe.idpedido) > 10
ORDER BY pa.nome
SQL - Junção e União de Tabelas 17/12/2019 24
Junção Externa
• A junção externa exibe linhas que não participam de
relacionamentos, diferentemente da ligação interna, onde só são
exibidas as linhas que se relacionam.
• É útil para exibir dados de relacionamentos opcionais.
• Permite que todas as linhas de uma tabela sejam exibidas, ainda
que existam linhas que não se relacionam com a outra tabela
ligada pela junção.
• Há três tipos de junções externas:
• Junção externa esquerda
• Junção externa direita
• Junção externa completa
SQL - Junção e União de Tabelas 17/12/2019 25
Junção Externa Esquerda
Sintaxe:
SELECT <lista de colunas>
FROM <tabela1> [alias1]
LEFT [OUTER] JOIN <tabela2> [alias2]
ON <condição de relacionamento>
SQL - Junção e União de Tabelas 17/12/2019 26
Junção Externa Esquerda
Exemplo 1: Exibir o código e o nome da função com o nome do
funcionário que exerce cada uma delas, exibindo também as funções
que não tenham funcionário, ordenando pelo nome da função e
pelo nome do funcionário em ordem ascendente.
SELECT fn.idfuncao, fn.nome [Função],
fu.nome [Funcionário]
FROM funcao [fn] LEFT JOIN funcionario [fu]
ON fn.idfuncao = fu.idfuncao
ORDER BY fn.nome, fu.nome
SQL - Junção e União de Tabelas 17/12/2019 27
Junção Externa Direita
Sintaxe:
SELECT <lista de colunas>
FROM <tabela1> [alias1]
RIGHT [OUTER] JOIN <tabela2> [alias2]
ON <condição de relacionamento>
SQL - Junção e União de Tabelas 17/12/2019 28
Junção Externa Direita
Exemplo 1: Exibir o código e o nome dos tipos de produto com os
respectivos nomes dos produtos existentes para cada tipo,
exibindo também os tipos que não tenham produto, ordenando
pelo nome do tipo e nome do produto em ordem ascendente.
SELECT ti.idtipo, ti.nome [Tipo],
pr.nome [Produto]
FROM produto [pr] RIGHT JOIN tipo [ti]
ON ti.idtipo = pr.idtipo
ORDER BY ti.nome, pr.nome
SQL - Junção e União de Tabelas 17/12/2019 29
Junção Externa Completa
Sintaxe:
SELECT <lista de colunas>
FROM <tabela1> [alias1]
FULL [OUTER] JOIN <tabela2> [alias2]
ON <condição de relacionamento>
SQL - Junção e União de Tabelas 17/12/2019 30
Junção Externa Completa
Exemplo 1: Exibir o código e o nome das funções com o nome do
funcionário que exercem cada uma delas, exibindo também as
funções sem funcionário e os funcionários sem função, ordenando
pelo nome da função e pelo nome do funcionário em ordem
ascendente.
SELECT fn.idfuncao, fn.nome [Função],
fu.nome [Funcionário]
FROM funcao [fn] FULL JOIN funcionario [fu]
ON fn.idfuncao = fu.idfuncao
ORDER BY fn.nome, fu.nome
SQL - Junção e União de Tabelas 17/12/2019 31
Consulta Usando Auto-Relacionamento
Exemplo 1: Exibir a sigla e o nome dos setores da empresa com o
nome do setor hierarquicamente superior, ordenando pela sigla do
setor em ordem ascendente. Exiba também os setores que não
tenham setor superior.
SELECT s1.idsetor, s1.nome [setor],
s2.nome [superior]
FROM setor [s1] LEFT JOIN setor [s2]
ON s2.idsetor = s1.idsuperior
ORDER BY s1.idsetor
SQL - Junção e União de Tabelas 17/12/2019 32
Consulta Usando Auto-Relacionamento
Exemplo 2: Exibir a sigla e o nome dos setores da empresa com o
nome do chefe do setor e o nome do setor hierarquicamente
superior, ordenando pela sigla do setor em ordem ascendente. Exiba
também os setores que não tenham setor superior.
SELECT s1.idsetor, s1.nome [setor],
fu.nome [chefe], s2.nome [superior]
FROM setor [s1] LEFT JOIN setor [s2]
ON s2.idsetor = s1.idsuperior
JOIN funcionario [fu]
ON fu.idfuncionario = s1.idchefe
ORDER BY s1.idsetor
SQL - Junção e União de Tabelas 17/12/2019 33
Consulta Usando Auto-Relacionamento
Exemplo 3: Exibir a sigla e o nome dos setores da empresa com o
nome do chefe do setor, o nome do setor hierarquicamente
superior e o nome do chefe do setor superior, ordenando pela sigla
do setor em ordem ascendente.
SELECT s1.idsetor, s1.nome [setor],
f1.nome [chefe], s2.nome [superior],
f2.nome [chefe superior]
FROM setor [s1] LEFT JOIN setor [s2]
ON s2.idsetor = s1.idsuperior
LEFT JOIN funcionario [f1]
ON f1.idfuncionario = s1.idchefe
LEFT JOIN funcionario [f2]
ON f2.idfuncionario = s2.idchefe
ORDER BY s1.idsetor
SQL - Junção e União de Tabelas 17/12/2019 34
Consulta com Criação de Tabela
Sintaxe:
SELECT <lista de colunas>
INTO <nome da nova tabela>
FROM <tabela>
WHERE ...
GROUP BY ...
ORDER BY ...
SQL - Junção e União de Tabelas 17/12/2019 35
Consulta com Criação de Tabela
Exemplo 1: Criar uma nova tabela que contenha o código do
pedido, o nome do cliente e o nome do vendedor que atendeu
cada um deles, ordenando pelo código do pedido em ordem
ascendente.
SELECT pe.idpedido, cl.nome [cliente],
fu.nome [vendedor]
INTO #compras
FROM pedido [pe] JOIN cliente [cl]
ON cl.idcliente = pe.idcliente
JOIN funcionario [fu]
ON fu.idfuncionario = pe.idvendedor
ORDER BY pe.idpedido
SQL - Junção e União de Tabelas 17/12/2019 36
União de Duas Tabelas
• A união combina as linhas de duas tabelas em uma única.
• As duas tabelas devem possuir a mesma estrutura:
• devem possuir o mesmo número de colunas;
• cada par correspondente de colunas deve possuir o mesmo
domínio.
• O número de colunas na tabela resultante é o mesmo das duas
tabelas iniciais. Nenhuma coluna é adicionada.
• As linhas repetidas são excluídas do resultado.
• O número máximo de linhas é a soma dos números de linhas das
duas tabelas, menos as linhas repetidas.
SQL - Junção e União de Tabelas 17/12/2019 37
União de Duas Tabelas
Tabela A
A B C D E
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
UNION
Tabela B
F G H I J
21 22 23 24 25
26 27 28 29 30
6 7 8 9 10
31 32 33 34 35
A UNION B
A B C D E
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
B UNION A
F G H I J
21 22 23 24 25
26 27 28 29 30
6 7 8 9 10
31 32 33 34 35
1 2 3 4 5
11 12 13 14 15
16 17 18 19 20
SQL - Junção e União de Tabelas 17/12/2019 38
Unindo Duas Tabelas
Sintaxe:
SELECT <lista de colunas>
FROM <tabela1>
UNION [ALL]
SELECT <lista de colunas>
FROM <tabela2>
Exemplo 1: Criar a tabela temporária #CLIENTE1 contendo o nome, o
tipo e o cargo dos clientes das cidades 13 e 14.
SELECT nome, tipo, cargo
INTO #cliente1
FROM cliente
WHERE idcidade IN (13,14)
SQL - Junção e União de Tabelas 17/12/2019 39
Unindo Duas Tabelas
Exemplo 2: Criar a tabela temporária #CLIENTE2 contendo o nome
com o título “cliente”, o tipo com o título “categoria” e o cargo com o
título “função” dos clientes que não tenham fax.
SELECT nome [cliente], tipo [categoria],
cargo [função]
INTO #cliente2
FROM cliente
WHERE fax IS NULL
SQL - Junção e União de Tabelas 17/12/2019 40
Unindo Duas Tabelas
Exemplo 3: Unir as tabelas #CLIENTE1 e #CLIENTE2 ordenando pelo
cargo e nome do cliente em ordem ascendente.
SELECT *
FROM #cliente1
UNION
SELECT *
FROM #cliente2
ORDER BY cargo, nome
SQL - Junção e União de Tabelas 17/12/2019 41
Unindo Duas Tabelas
Exemplo 4: Unir as tabelas #CLIENTE2 e #CLIENTE1 ordenando pelo
cargo e nome do cliente em ordem ascendente.
SELECT *
FROM #cliente2
UNION
SELECT *
FROM #cliente1
ORDER BY função, cliente
SQL - Junção e União de Tabelas 17/12/2019 42
Unindo Duas Tabelas
Exemplo 5: Unir as tabelas #CLIENTE2 e #CLIENTE1 ordenando pelo
cargo e nome do cliente em ordem ascendente, exibindo também as
linhas repetidas
SELECT *
FROM #cliente2
UNION ALL
SELECT *
FROM #cliente1
ORDER BY função, cliente
SQL - Junção e União de Tabelas 17/12/2019 43
Copyright © 2019 Nilton Freire Santos.
Todos os direitos reservados.
SQL - Junção e União de Tabelas 17/12/2019 44