DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

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)

e-mail

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:

 

  1. de uma linha: o retorno do SELECT interno será uma única linha.
  2. Subquery de múltiplas linhas: o retorno do SELECT interno será mais de uma linha.
  3. 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:

 

  1. Coloque as subqueries entre parêntese.
  2. Coloque a subquery à direita do operador.
  3. Não coloque a cláusula ORDER BY em uma subquery
  4. Utilize operadores de linha apenas em buscas que retornem uma única linha.
  5. 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

 





    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!



Publicidade
Autor
Rubens Antunes

Programador Delphi desde de 2004 e Autor do Livro Delphi - Faça Uma Aplicação Comercial


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
0   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03