17.12.2019 Views

BD1 - SQL-Junção e União de Tabelas

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


Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!