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