Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Consultas Avançadas com Joins e 
Subqueries
Apresentação
Existem recursos avançados que podem aprimorar a realização de consultas SQL em bases de 
dados. Esses recursos são conhecidos como joins ou subqueries. Os joins são métodos utilizados 
para junção e cruazemento entre tabelas, enquanto as subqueries são subconsultas colocadas com 
SELECTs para realizar pesquisas especializadas, que, sem esse recurso, teriam um alto grau de 
complexidade, dificultando, assim, sua realização. Logo, tem-se uma instrução SQL no interior de 
outra instrução SQL, para aprimoramento da consulta.
Nesta Unidade de Aprendizagem, você verá o que são joins e subqueries e entender como 
identificá-los, implementá-los e utilizá-los em uma consulta.
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Identificar uma consulta utilizando joins e subqueries.•
Exemplificar uma consulta utilizando joins e subqueries.•
Implementar uma consulta utilizando joins e subqueries.•
Laiane
Desafio
Foi solicilitado a uma empresa de grande porte da área de Tecnologia da Informação que retornasse 
a data máxima de forma descrescente das faturas por fornecedor, a fim de orquestrar melhor a 
gestão dos prazos junto ao departamento financeiro. 
Sendo você o DBA responsável pelo banco de dados, esclareça qual é a melhor forma de realizar 
essa consulta, sabendo que há duas tabelas (tb_fornecedores e tb_faturas) e o objetivo é retornar 
as datas máximas de forma descrescente das faturas por fornecedor. Exemplifique.
*Observação: nas tabelas de faturas, tem-se Id_fornecedor como ID do fornecedor.
Laiane
Padrão de resposta esperadoPara calcular a data máxima de forma decrescente das faturas para cada fornecedor na tabela de fornecedores, é preciso utilizar uma subquerie referenciando a coluna Id_fornecedor presente na tabela de Faturas, em uma consulta externa.Utiliza-se, então, uma subconsulta (subquerie) com o SELECT:SELECT DISTINCT FornecedorNome,(SELECT MAX(DtFatura) FROM FaturasWHERE Faturas.Id_fornecedor = Fornecedores.Id_fornecedor) AS UltimaFaturaFROM FornecedoresORDER BY UltimaFatura DESC;A outra forma de se realizar a consulta é através da junção de tabelas (join). Nesse caso, foi utilizado uma subconsulta (subquerie), mas também seria possível empregar a junção entre tabelas. Logo, é possível demonstrar que tanto as subqueries como os joins são fundamentais para a realização de consultas avançadas. 
Infográfico
As consultas avançadas com joins e subqueries são utilizadas para realizar consultas com 
cruzamento de dados entre tabelas diferentes e para efetuar consultas especializadas entre dados 
de diferentes tabelas, respectivamente. 
Acompanhe, no Infográficoa seguir, como se dá utilização dos joins e das subqueries. 
Laiane
Conteúdo do livro
Os joins e as subqueries são instruções utilizadas em conjunto, ou separadamente, para elaborar 
consultas avançadas em bancos de dados.
No capítulo Consultas avançadas com joins e subqueries, da obra Modelagem e desenvolvimento de 
banco de dados, você vai estudar sobre o surgimento dos joins e das subqueries, que permeiam a 
utilização do comando SQL: SELECT. 
Quando o dado necessário pertence a uma tabela, temos uma consulta simples. Entretanto, ela não 
será sempre uma consulta simples, logo, se fará necessário cruzar dados contidos em tabelas 
diferentes.
Boa leitura.
Laiane
Laiane
Laiane
MODELAGEM E 
DESENVOLVIMENTO 
DE BANCO DE DADOS
Pedro Henrique Chagas Freitas
Consultas avançadas 
com joins e subqueries
Objetivos de aprendizagem
 � Identificar uma consulta utilizando joins e subqueries.
 � Exemplificar uma consulta utilizando joins e subqueries.
 � Implementar uma consulta utilizando joins e subqueries.
Introdução
Os joins e subqueries são instruções utilizadas em conjunto ou de forma 
separada para elaborar consultas avançadas em bancos de dados.
Neste capítulo, você vai estudar a utilização dos joins e subqueries para 
elaboração de consultas avançadas, além de exemplos que utilizam joins 
e subqueries. Você vai estudar, também, a implementação em consultas 
avançadas com joins e subqueries. 
Conceituando a utilização de consultas 
avançadas com joins e subqueries
Os joins, assim como as subqueries, são utilizados com comandos SQL 
para consulta, no caso os SELECTs, para realizar consultas avançadas 
nas tabelas dos bancos de dados, tendo em vista que, quando o dado 
necessário é pertencente a uma tabela, temos uma consulta simples. Por 
exemplo: 
SELECT nome_campo FROM nome_tabela WHERE condição_esperada 
Nesse caso, temos uma consulta simples, porque estamos referenciando 
um dado (nome_campo) que está em uma tabela (nome_tabela) e atribuímos 
uma condição (WHERE) no retorno dessa consulta. Observe: 
SELECT Nome_Time, Região_Time FROM Times WHERE Nome_Time 
= ‘Flamengo’ 
O surgimento dos joins e subqueries permeia a utilização do comando 
DQL: SELECT, levando-se em conta que, quando realizamos uma consulta, 
não necessariamente essa consulta será uma consulta simples; portanto, 
poderá ser necessário cruzar dados que estão em tabelas diferentes.
Quando realizamos o cruzamento de dados em uma consulta, temos 
uma junção de tabelas para originar o dado esperado pela consulta, ou 
seja, temos um join ( junção). Quando realizamos duas consultas, uma 
dentro da outra, temos uma subquery, ou subconsulta, que também parte 
da ideia de que a consulta que será realizada (SELECT) deverá retornar 
dados de tabelas diferentes entre si. O comando DQL SELECT permite 
ao usuário de um banco de dados realizar uma consulta por meio de uma 
especificação de parâmetro, também conhecido como query.
A especificação da query apresenta a descrição do resultado de retorno 
desejado após a consulta. É importante observar que a derivação dessa consulta 
é um retorno esperado, isto é, quando realizamos uma consulta em uma base 
de dados, estamos realizando uma consulta de algo em algum lugar; logo, 
os parâmetros que envolvem a localização dos dados precisam apresentar 
exatidão conforme a complexidade da consulta. 
Os joins combinados com os selects fazem surgir as consultas avançadas 
por meio do que conhecemos como teoria dos conjuntos, que referencia 
a junção ou cruzamento entre tabelas. Observe a Figura 1 a seguir. 
Consultas avançadas com joins e subqueries2
Figura 1. Teoria dos conjuntos.
Note que estamos fazendo a junção de conjuntos. Essa técnica se confi-
gura por meio dos joins dentro do contexto de banco de dados e é altamente 
necessária frente a algumas consultas que são realizadas, ou seja, caso não 
utilizássemos os joins ou as subqueries, algumas consultas não poderiam ser 
realizadas, dada a sua complexidade.
Dessa forma, os joins trouxeram ganhos à realização das consultas com a 
instrução SQL SELECT, o que, por sua vez, colaborou para difundir o SQL 
como a linguagem mais utilizada atualmente para a intercomunicação com 
bancos de dados.
Para utilização de dois joins, são necessárias pelo menos duas tabelas, entre as quais 
deve haver algum nível de relacionamento para que se possa cruzar os dados. Por 
exemplo: podemos ter um campo comum entre as tabelas.
3Consultas avançadas com joins e subqueries
Já as subqueries são subconsultas ou consultas dentro de consultas. Na 
prática, é realizada uma busca dentro de outra busca com a instrução SQL 
SELECT para consulta. Assim, temos, então, um SELECT dentro de outro 
SELECT, com SELECTs internos. 
A subquery é uma instrução SELECT que está condicionada dentro de 
outras instruções SQL, ou seja, uma subconsulta para criar um retorno de 
um resultado que, por meio de uma consulta simples, teria alta complexidade 
ou até mesmo impossibilidade. Utilizam-se as subqueries introduzidas em 
cláusulas WHERE, FROM, HAVING ou no próprio SELECT. Por exemplo, 
podemos usar uma instrução de uma subconsulta na condição de pesquisa 
com uma cláusula WHERE: 
SELECT NomeCD, Preco FROM Loja
WHERE Preco = (SELECT MAX (Preco) FROM Loja)
Nesse caso,estamos fazendo uma consulta dentro de outra consulta, para 
listar todos os DVDs com o maior preço. Na subquery, buscamos qual o valor 
máximo encontrado na tabela loja, então buscamos todos os NOMES e PRE-
ÇOS dos DVDs que contém preço igual ao máximo encontrado pela subquery.
Exemplificando a utilização de joins 
e subqueries
Considere, por exemplo, as tabelas a seguir: 
Consultas avançadas com joins e subqueries4
Vamos realizar, então, alguns joins. Para realizar um INNER JOIN, faríamos:
SELECT A.NOME “A.NOME”,
 B.VALOR “B.VALOR”
 FROM TABELA_A A
 INNER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
O resultado seria: 
5Consultas avançadas com joins e subqueries
Nesse exemplo, temos como resultado do INNER JOIN o retorno somente 
das linhas que são comuns nas duas tabelas. 
Um exemplo de utilização de subquery poderia ser para verificar a média 
de preço: temos como base uma tabela de um gravador de CDs, por exemplo, 
na qual queremos retornar o nome e o preço no primeiro SELECT mostrando 
só os resultados em que o preço é maior que o preço médio. 
Teríamos, portanto:
SELECT CODIGO_GRAVADORA, NOME_CD, PRECO_VENDA FROM CD
WHERE PRECO_VENDA > (SELECT AVG(PRECO_VENDA) FROM CD
WHERE CODIGO_GRAVADORA = a.CODIGO_GRAVADORA);
Supondo que a média fosse 10, teríamos o código do CD, o nome do CD 
e o preço médio de venda, como mostra a Figura 2:
Figura 2. Exemplo de subquery.
ravadora
Implementando joins e subqueries
Considere, por exemplo, duas tabelas: tabela X e tabela Y. Pode-se realizar 
um join para unir tabelas por meio de um campo em comum; no caso, poderia 
ser o campo nome.
CREATE TABLE tabelaX (
 Nome varchar ( ) NULL 
)
CREATE TABLE tabelaY (
 Nome varchar ( ) NULL 
)
Agora vamos inserir dados nessas tabelas para realizarmos os joins 
(junções):
Consultas avançadas com joins e subqueries6
INSERT INTO tabelaX VALUES (‘Fernanda’)
INSERT INTO tabelaX VALUES (‘Josefa’)
INSERT INTO tabelaX VALUES (‘Luiz’)
INSERT INTO tabelaX VALUES (‘Fernando’)
INSERT INTO tabelaY VALUES (‘Carlos’) 
INSERT INTO tabelaY VALUES (‘Manoel’)
INSERT INTO tabelaY VALUES (‘Luiz’)
INSERT INTO tabelaY VALUES (‘Fernando’)
Após inseridos os valores, vamos realizar os joins. Caso quiséssemos os 
registros em comum as duas tabelas, utilizaríamos o inner join, como você 
pode observar a seguir:
SELECT a.Nome, b.Nome
FROM tabelaX as A
INNER JOIN tabelaY as B
on a.Nome = b.Nome
Teremos, então, dois resultados de nomes (registros) em comum nas duas 
tabelas, como você pode ver na Figura 3.
Figura 3. Exemplo de registros com inner join.
Temos, também, o left join, que é utilizado para articular e apresentar como 
resultado todos os registros que estão na tabela X (mesmo que não estejam na 
tabela Y) e os registrados na tabela Y em comum com a tabela X.
Faríamos o seguinte:
7Consultas avançadas com joins e subqueries
SELECT a.Nome, b.Nome
FROM tabelaX as A
LEFT JOIN tabelaY as B
on a.Nome = b.Nome
Nesse caso, atribuiríamos que a consulta utilizaria as variáveis a.Nome 
e b.Nome para realizar a junção, como no exemplo anterior, mas utilizando, 
agora, o left join. A Figura 4 apresenta o resultado. 
Figura 4. Exemplo de registros com left join.
Como temos o left join, temos também o right join. Neste caso, teremos 
como resultado todos os registros da tabela Y, mesmo os que não estejam na 
tabela X, e os registros da tabela X que são comuns à tabela Y. 
Faríamos:
SELECT a.Nome, b.Nome
FROM tabelaX as A
RIGHT JOIN tabelaY as B
on a.Nome = b.Nome
Observe o resultado na Figura 5.
Consultas avançadas com joins e subqueries8
Figura 5. Exemplo de registros com right join.
Temos também o outer join ou full outer join, que tem como objetivo 
mostrar todos os registros que estão na tabela X e na tabela Y. 
Faríamos:
SELECT a.Nome, b.Nome
FROM tabelaX as A
FULL OUTER JOIN tabelaY as B
on a.Nome = b.Nome
Observe o resultado na Figura 6.
Figura 6. Exemplo de registros com full outer join.
9Consultas avançadas com joins e subqueries
Temos o left excluding join, que retorna todos os registros que estão da 
tabela X e que não estão na tabela Y.
SELECT a.Nome, b.Nome
FROM tabelaX as A
LEFT JOIN tabelaY as B
on a.Nome = b.Nome
WHERE b.Nome is null
Observe o resultado na Figura 7.
Figura 7. Exemplo de registros com left excluding join.
Como temos o left excluding join, temos também o right excluding join, 
que é utilizado para retornar todos os registros que estão na tabela Y e que 
não estejam na tabela X. 
SELECT a.Nome, b.Nome
FROM tabelaX as A
RIGHT JOIN tabelaY as B
on a.Nome = b.Nome
WHERE a.Nome is null
Observe o resultado na Figura 8. 
Consultas avançadas com joins e subqueries10
Figura 8. Exemplo de registros com right excluding join.
Por fim, temos o outer excluding join. Neste caso, teremos como resultado 
todos os registros que estão na tabela Y, mas que não estejam na tabela X, e 
todos os registros que estão na tabela X, mas que não estão na tabela Y.
SELECT a.Nome, b.Nome
FROM tabelaX as A
FULL OUTER JOIN tabelaY as B
on a.Nome = b.Nome
WHERE a.Nome is null or b.Nome is null
Observe o resultado na Figura 9.
Figura 9. Exemplo de registros com outer excluding join.
Vejamos então um exemplo de utilização de subqueries para realizar uma 
consulta dentro de outra consulta: 
11Consultas avançadas com joins e subqueries
SELECT DISTICT NomeFornecedor,
(SELECT MAX (DtFatura) FROM Faturas 
WHERE Faturas.Id_Fornecedor = Fornecedores.Id_Fornecedor) AS 
UltimaFatura FROM Fornecedores
ORDER BY UltimaFatura DESC;
Nesse caso, mostramos uma subquery (subconsulta) no SELECT por meio 
de uma correlação, ou seja, utilizamos o SELECT como subconsulta para, 
dentro da consulta, calcular a data máxima (DtFatura) das faturas para cada 
fornecedor na tabela fornecedores, referenciando a coluna Id_fornecedor 
presente na tabela Faturas. 
Podemos, na maioria dos casos, substituir uma subquery (subconsulta) por um join 
(junção), porque os joins são mais simples de entender, ler e executar. 
Caso utilizássemos um join em vez da subquery, teríamos: 
SELECT NomeFornecedor, MAX (DtFatura) AS UltimaFatura
FROM
Fornecedores LEFT JOIN Faturas ON Faturas.Id_fornecedor = Forne-
cedores.Id_Fornecedor 
GROUP BY NomeFornecedor
ORDER BY UltimaFatura DESC;
Essa consulta faz a junção ou o cruzamento das tabelas de Fornecedores 
e Faturas, agrupando as linhas por NomeFornecedor e, em seguida, usa a 
função MAX para calcular a data máxima da fatura para cada fornecedor. 
Como é possível verificar, essa consulta é mais simples e fácil de ser lida do 
que a anterior com a subconsulta. Além disso, essa consulta é executada de 
forma mais rápida, considerando que, por meio da junção ( join), é realizada 
a busca uma única vez, mas, quando utilizamos subconsultas, é feita uma 
varredura para cada linha em execução, consumindo mais recursos do sistema 
gerenciador de banco de dados (SGBD). 
Consultas avançadas com joins e subqueries12
Podemos, também, codificar uma subconsulta dentro de outra subconsulta, o que 
obviamente aumentaria a complexidade do SELECT; todavia, essa não é uma boa 
prática, apesar de ser possível. Nesse caso, temos uma leitura da instrução SQL mais 
complicada e uma diminuição do desempenho da consulta.
Há quatro formas de criar uma subconsulta em uma instrução SELECT: 
 � Por meio de uma cláusula WHERE como condição de pesquisa;
 � Por meio de uma cláusula HAVING como condição de pesquisa;
 � Por meio de uma cláusula FROM para especificação da tabela;
 � Por meio de um SELECT para especificação de uma coluna.
ELMASRI, R.; NAVATHE, S. B. Sistemas de banco de dados. 6. ed. São Paulo: Pearson, 
2010.
KORTH, H. F.; SILBERSHATZ, A.; SUDARSHAN, S. Sistema de banco de dados. 6. ed. Rio 
de Janeiro: Campus, 2012.
HEUSER, C. A. Projeto de banco de dados. 6. ed. Porto Alegre: Bookman, 2010. (Série 
Livros Didáticos Informática UFRGS, v.4).
RAMAKRISHNAN, R. Sistemas de gerenciamento de banco de dados. 3. ed. Porto Alegre: 
Penso, 2009.
SETZER, V. W. Banco de dados: conceitos, modelos, gerenciadores,projeto lógico, 
projeto físico. 3. ed. São Paulo: Blücher, 2002.
Leituras recomendadas
13Consultas avançadas com joins e subqueries
 
Dica do professor
Os joins, assim como as subqueries, são utilizados em conjunto com os comandos SQL para 
realizar consultas avançadas.
Nesta Dica do Professor, você verá a implementação de consultas com joins e subqueries, a fim de 
verificar demandas de um negócio de dois times e de uma loja de comércio eletrônico.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/81e26d4f4b3612de56414a5d9978ba1d
Exercícios
1) Um join em uma instrução SQL é um(a): 
A) Junção.
B) Restrição.
C) Exclusão.
D) Inserção.
E) Alteração.
2) Uma subquerie em uma instrução SQL é uma:
A) Pré-consulta.
B) Pós-consulta.
C) Subconsulta.
D) Alteração de consulta.
E) Exclusão de consulta.
3) Com qual comando de consulta SQL os joins e subqueries são utilizados?
A) ALTER.
B) DELETE.
C) INSERT.
D) UPDATE.
E) SELECT.
4) Qual instrução é conhecida por representar um cruzamento entre tabelas?
Laiane
Laiane
Laiane
Laiane
Joins e subqueries são utilizados para consultas através do cruzamento de tabelas ou de consultas dentro de consultas, logo, são usados para seleção de dados (SELECT). 
Laiane
Uma subquerie é uma subconsulta, ou seja, uma consulta dentro de outra consulta.
Laiane
Um join é um cruzamento entre tabelas, assim, é representado por uma junção entre tabelas.
A) Subquerie.
B) Join.
C) Insert.
D) Revoke.
E) Update.
5) Qual tipo de join apresenta os resultados comuns entre duas tabelas?
A) FULL OUTER JOIN.
B) RIGHT JOIN.
C) LEFT JOIN.
D) INNER JOIN.
E) JOIN.
Laiane
Laiane
Laiane
Somente a instrução JOIN, sem uma delimitação quanto ao seu tipo. INNER JOIN, LEFT JOIN, RIGHT JOIN, etc. não geram nenhum resultado. INNER JOIN apresenta os resultados em comum entre duas tabelas; LEFT JOIN apresenta todos os resultados de uma tabela – mesmo que estes não estejam em outra tabela – mais todos os dados comuns entre as duas, fazendo a verificação da primeira para a segunda tabela; RIGHT JOIN retorna todos os resultados de uma tabela – mesmo que estes não estejam em outra tabela – mais os resultados comuns entre as duas, fazendo a verificação da segunda para a primeira tabela; e FULL OUTER JOIN é utilizado para retornar todos os resultados excludentes de uma tabela para outra. 
Laiane
Join é uma instrução conhecida por representar um cruzamento ou junção entre tabelas, enquanto subquerie é uma instrução reconhecida por realizar subconsultas. Já Insert é uma instrução para inserir dados em uma tabela; Revoke retira o acesso a uma tabela; e Update atualiza dados em uma tabela.
Na prática
No dia a dia, é comum a utilização de joins (junções) e subqueries (subconsultas). Apesar dos dados 
serem armazenados em tabelas, às vezes, a informação necessária vem do cruzamento entre elas. 
Logo, uma informação pode ser oriunda da junção de tabelas ou de consultas em mais de uma 
tabela.
Saiba +
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor:
Subconsultas (subqueries) com tabelas derivadas
Este vídeo aborda o uso de subconsultas no SQL com SQL server, explicando o seu funcionamento.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
JOINS e INNER JOIN - Selecionar dados de duas ou mais 
tabelas
Este vídeo mostra como é possível combinar dados de duas ou mais tabelas relacionadas em uma 
consulta utilizando a cláusula INNER JOIN, além de outros tipos de JOINS, no SQL Server.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
SELECT com LEFT JOIN no SQL Server 2012
Este vídeo ensina a utilizar o LEFT JOIN no SQL Server 2012, fazendo uso de três tabelas: 
tblPessoa, tblPessoaTelefone e tblPessoaEndereco.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://www.youtube.com/embed/vXq85AhvMDU
https://www.youtube.com/embed/4nbECYDlAwc
https://www.youtube.com/embed/f5DmoEpqJCs

Mais conteúdos dessa disciplina