Subquery
Veja Nesta Quick Subqueries
Introdução ao Sql
Subqueries
Neste artigo irei demonstrar como utilizar uma busca dentro de outra busca. Esse é um recurso avançado e extremamente útil do comando SELECT. Na prática, será colocado um SELECT dentro de outro. Isso quer dizer que serão colocados vários SELECTs internos. Subqueries faz parte do padrão SQL-86, logo todos os bancos de dados relacionados que utilizam SQL devem permitir essa utilização.
Vamos criar algumas tabelas que nos servirá de exemplo:
Tabela Gravadora
|
Codigo_Gravadora |
Integer |
|
Nome_Gravadora |
Varchar(30) |
|
Endereco |
Varchar(40) |
|
|
Varchar(50) |
|
Telefone |
Varchar(10) |
|
Contato |
Varchar(20) |
Tabela CD
|
Codigo_CD |
Integer |
|
Nome_CD |
Varchar(40) |
|
Código_Gravadora |
Integer |
|
Preço_Venda |
Numeric(10,2) |
|
Data_Lancamento |
Date |
|
CD_Indicado |
Integer |
Tabela Musica
|
Codigo_Musica |
Integer |
|
Nome_Musica |
Varchar(40) |
|
Duracao |
Decimal(6,2) |
Tabela Faixa
|
Codigo_Musica |
Integer |
|
Código_CD |
Integer |
|
Numero_Faixa |
Integer |
Há três tipos de subquery:
- de uma linha: o retorno do SELECT interno será uma única linha.
- Subquery de múltiplas linhas: o retorno do SELECT interno será mais de uma linha.
- Subquery de múltiplas colunas: o retorno do SELECT interno conterá mais de uma linha e coluna.
Subquery de uma linha
Neste caso, o resultado do SELECT mais interno servirá de base para o primeiro SELECT. Ao utilizarmos essa forma de busca, poderemos até melhorar o desempenho do banco de dados. Uma alternativa para essa forma de realizar a busca seria fazer uma União regular de tabelas. Dependendo do que queremos buscar nas tabelas, esse comando é mais indicado em virtude da velocidade. Note que fazendo a união regular de tabelas, estamos combinando todas as linhas de ambas as tabelas. Primeiro é feita a busca em uma tabela e, com base no resultado, pesquisada a outra tabela. Veja um exemplo:
SELECT NOME_CD, PRECO_VENDA FROM CD
WHERE PRECO_VENDA > (SELECT AVG(PRECO_VENDA) FROM CD);
Resultado
|
Nome_CD |
Preco_Venda |
|
Mais do Mesmo |
16 |
|
Bate-Boca |
13 |
Aqui é utilizada uma subquery para verificar a média do preço e, com base nesse resultado, é extraído o resultado da busca do primeiro SELECT (nome e preço). Só aparecerá no resultado os registros que o preço seja maior que a média.
Veja o exemplo abaixo:
SELECT CODIGO_GRAVADORA, NOME_CD, PRECO_VENDA FROM CD a
WHERE PRECO_VENDA > (SELECT AVG(PRECO_VENDA) FROM CD
WHERE CODIGO_GRAVADORA = a.CODIGO_GRAVADORA);
Resultado
|
CODIGO_GRAVADORA |
NOME_CD |
PRECO_VENDA |
|
2 |
Bate-Boca |
12 |
|
2 |
A Força que nunca Seca |
13,5 |
Aqui é utilizada uma técnica interessante. Note que são buscados apenas os CDs que tenham preço superior a media de preço da própria gravadora. Isso ocorre porque foi colocado um apelido na tabela CD da primeira busca (a) e este comparado no segundo SELECT com o código da gravadora.
Dessa forma, o segundo SELECT retorna a média de preço de venda dos CDs da gravadora do primeiro SELECT e somente os que tiverem preço de venda maiores que essa média é que aparecerão na listagem. Cuidado ao utilizar esse tipo de construção porque ele tende a consumir muito recurso do banco de dados, pois a cada linha do primeiro SELECT esse tipo de construção vai extrair a media no segundo SELECT. Assim é necessário saber qual a gravadora do primeiro SELECT, para poder calcular o segundo SELECT.
Nota: Para realizar subqueries tenha em mente:
- Coloque as subqueries entre parêntese.
- Coloque a subquery à direita do operador.
- Não coloque a cláusula ORDER BY em uma subquery
- Utilize operadores de linha apenas em buscas que retornem uma única linha.
- utilize operadores de grupo apenas em buscas que potencialmente retornem mais de uma linha.
Veja outro exemplo onde são utilizadas mais de uma subquery:
SELECT CODIGO_GRAVADORA, NOME_CD, PRECO_VENDA FROM CD
WHERE CODIGO_GRAVADORA = (SELECT CODIGO_GRAVADORA FROM CD
WHERE CODIGO_CD = 2 ) AND
PRECO_VENDA > (SELECT PRECO_VENDA FROM CD
WHERE CODIGO_CD = 5);
Resultado
|
CODIGO_GRAVADORA |
NOME_CD |
PRECO_VENDA |
|
2 |
Bate-boca |
12 |
|
2 |
A força que nunca seca |
13,5 |
O CD de código 2 é da gravadora número 2 (resultado do primeiro SELECT aninhado) e o preço de venda do CD código 5 é 10,50(resultado do segundo SELECT aninhado). Os CDs que atendem aos dois requisitos (ser da gravadora 2 e custa mais de 10,5) são aqueles mostrados como resultado.
Conclusão: Podemos perceber que podemos pesquisar dentro da mesma tabela várias vezes dentro do mesmo SELECT, algo muito prático nas construções de nossas instruções SQLs, no próximo artigo, mostrarei como trabalhar com subquery de múltiplas linhas, até lá.
Autor:Rubens Antunes
Autor do Livro: Delphi Faça Uma Aplicação Comercial

Space do autor


0
0
