Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

UNID 4.2 - Consultas Avançadas Com Joins e Subqueries

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 25

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.

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.

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.


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.
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:
2 Consultas avançadas com joins e subqueries

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 subqueries 3

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.
4 Consultas 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 subqueries 5

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:
6 Consultas 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:

ravadora

Figura 2. Exemplo de subquery.

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 subqueries 7

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:
8 Consultas 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 subqueries 9

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.


10 Consultas 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 subqueries 11

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:
12 Consultas 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 subqueries 13

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.

Leituras recomendadas

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.
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.

Conteúdo interativo disponível na plataforma de ensino!

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?

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.

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 MAIS

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.
Conteúdo interativo disponível na plataforma de ensino!

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.

Conteúdo interativo disponível na plataforma de ensino!

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.

Conteúdo interativo disponível na plataforma de ensino!

Você também pode gostar