-
Nós podemos trabalhar
com a ideia de subconsultas,
-
e essas consultas podem
retornar várias linhas.
-
Quando isso ocorre, não podemos
usar os mesmos operadores
-
que utilizamos quando
trabalhamos com subconsultas
-
que nos retornam apenas uma linha,
que são os operadores relacionais.
-
Para subconsultas
que nos retornam várias linhas,
-
os operadores que nós podemos utilizar
são o "IN", o "NOT IN", o "ANY", e o "ALL".
-
Portanto, vamos trabalhar alguns exemplos
-
e observar como utilizar esses operadores
-
em subconsultas que nos
retornam várias linhas.
-
Iremos apresentar um exemplo
onde iremos utilizar uma subconsulta
-
que retornará várias linhas.
-
Para que possamos utilizar
todas essas linhas
-
como um mecanismo
de condição de validação
-
através da cláusula where
na consulta principal,
-
iremos apresentar o exemplo
utilizando o operador IN,
-
que vai avaliar todos os valores
-
recuperados através da subconsulta
-
no momento da cláusula where
que nós temos na consulta principal.
-
Vamos ver o exemplo proposto?
-
A subconsulta irá recuperar
o código do projeto
-
onde a data de início
seja abril de 2012
-
ou outubro de 2013.
-
Vejamos então
a execução da subconsulta.
-
Nós observamos aqui que essa
subconsulta retornou duas linhas,
-
então nós temos dois valores.
-
Portanto, esses dois valores,
que são os projetos 10002 e 10003,
-
serão utilizados como base
de validação da cláusula where
-
da nossa consulta principal,
ou, consulta externa.
-
Então nós iremos recuperar todas
as implantações que ocorreram
-
para os projetos 10002 ou 10003,
-
porque estamos utilizando
aqui o operador IN.
-
O operador IN avalia todos
os elementos da lista.
-
Vejamos a execução completa.
-
Portanto, aqui nós temos
todas as implantações
-
referente aos projetos 10002 e 10003,
-
e qual é o funcionário,
através do número de matrícula,
-
que participou ou que ainda
participa dessas implantações.
-
Então veja que aqui nós
temos a subconsulta.
-
A subconsulta vai retornar duas linhas.
-
Como ela retorna duas linhas, eu
não posso usar qualquer operador.
-
Eu preciso utilizar operadores
que entendam várias linhas.
-
O IN é um deles, que permite
que eu avalie uma lista de valores.
-
Portanto, essa lista de valores
será utilizada como meio de condição
-
da consulta principal,
ou, consulta externa.
-
Então observe que o grande ponto de atenção
quando trabalhamos com subconsultas
-
que nos devolvem várias
linhas, duas ou mais,
-
é o operador que eu posso utilizar.
-
Porque se eu tentar usar
um operador relacional,
-
essa consulta resultará em erro.
-
Então, muita atenção, os operadores
que podem ser utilizados,
-
dependendo da necessidade
de recuperação que eu vou ter,
-
são o IN, o NOT IN, o ANY, e o ALL.
-
Vamos trabalhar um outro exemplo,
agora utilizando o NOT IN,
-
ou seja, tudo que não faz parte
-
dos elementos que estão
declarados naquela lista.
-
Vamos ver o exemplo?
-
A minha consulta interna, ou, subconsulta,
-
irá recuperar o código do projeto
-
que teve início em abril de 2012
ou outubro de 2013.
-
Vamos executar esse trechinho.
-
Temos o projeto 10002 e 10003.
-
A ideia agora é recuperar
todas as implantações
-
que não são dos projetos 10002 e 10003.
-
Esta é a ideia do NOT IN,
-
todos os elementos que não fazem parte,
-
que não atendem os elementos
que estão na lista.
-
Vamos executar.
-
Veja que nós trouxemos as implantações
-
dos projetos 10005, 10004, 10001,
-
ou seja, todos os projetos
que não são 10002 e 10003,
-
e respectivos funcionários que implantam
-
ou já implantaram esses projetos.
-
Veja então que é possível eu
trabalhar sempre com os operadores
-
que conseguem afetar um número
grande de linhas, duas ou mais.
-
Neste caso, o NOT IN, que vai trazer
tudo que não faz parte da lista,
-
tudo que não atende aos elementos
que estão declarados na minha lista.
-
E a lista é preenchida
através da subconsulta
-
quando nós colocamos nessa subconsulta
-
aquilo que nós queremos recuperar.
-
A validação é feita, e, portanto,
-
são recuperados através
da consulta principal
-
todos os projetos que não são
aqueles declarados na lista.
-
Vamos trabalhar um exemplo
utilizando o operador ANY.
-
O operador ANY vai avaliar,
no momento da condição,
-
cada um dos valores retornados
através da subconsulta.
-
Vamos ver um exemplo?
-
A nossa subconsulta irá recuperar
-
a média salarial
agrupada por departamento.
-
Veja que nós temos aqui
-
a média 3770, 2720,
-
2934, 3412, 3700,
-
ou seja, a média salarial
de cada um dos departamentos
-
que nós temos cadastrado.
-
Aqui, quando utilizamos o ANY,
vamos fazer uma validação
-
considerando cada um desses valores.
-
Então eu vou recuperar
através da consulta externa
-
todos os funcionários
que tenham um salário mensal
-
menor que cada um desses valores.
-
Vejamos a execução completa.
-
Dos 15 funcionários
que nós temos cadastrados,
-
9 funcionários atendem a condição,
-
ou seja, possuem um salário mensal
menor que cada um dos valores
-
que foi informado, que foi
recuperado, através da subconsulta.
-
É importante verificar aqui
-
qual operador que deve ser utilizado.
-
Veja que a subconsulta
devolve várias linhas,
-
portanto, o uso do ANY é quando
eu preciso de uma comparação
-
com cada um dos valores que foram
recuperados através da subconsulta.
-
Portanto, caso você
tenha essa necessidade,
-
e na sua subconsulta você
recuperou várias linhas,
-
o operador que deve
ser utilizado será o ANY.
-
Nós podemos utilizar
também o operador ALL.
-
A ideia do operador ALL, quando
a subconsulta recupera várias linhas,
-
é fazer uma validação que envolva
todos os valores recuperados
-
através da subconsulta.
-
Vamos ver um exemplo?
-
No nosso exemplo, a subconsulta
-
recupera o salário mensal
-
de todos os nossos departamentos.
-
Então agrupamos por departamento
-
e calculamos a média de cada
um desses departamentos.
-
Na subconsulta principal, nós
recuperamos todos os funcionários
-
cujo salário mensal seja maior que todos
esses valores que foram obtidos.
-
Então, realizando a consulta,
-
nós observamos que os funcionários
que foram recuperados
-
foram todos aqueles
que atendem o salário mensal
-
maior a todos os valores recuperados.
-
Portanto, nesse exemplo,
onde nós temos também
-
uma recuperação de várias
linhas através da subconsulta,
-
você vai utilizar o operador ALL quando
a sua necessidade for fazer uma avaliação
-
onde tenham que ser considerados
todos os resultados devolvidos
-
através dessa subconsulta,
e a sua validação precisa recuperar
-
algo maior, menor ou igual,
por exemplo, a esse resultado.
-
Nós podemos trabalhar também
-
com subconsultas correlacionadas.
-
Quando nós trabalhamos
com consultas correlacionadas,
-
a subconsulta e a consulta
externa se conversam
-
de modo que utilizamos
-
ou o apelido, ou a tabela, ou o campo,
-
que está associado
à consulta principal,
-
a tabela ou as tabelas que estiverem
na consulta principal.
-
Então é um tipo de consulta e subconsulta
-
em que não conseguimos executar
um trechinho para ver o resultado
-
e depois o resultado como um todo.
-
Só conseguimos executar
se executarmos o comando todo.
-
Por quê?
-
Porque elas estão correlacionadas.
-
Elas possuem uma dependência
entre elas no momento da execução,
-
porque ela faz referência
à tabela e ao campo
-
que estão na consulta
externa, por exemplo.
-
Então é um tipo de consulta que é
um pouquinho mais difícil para ser executada,
-
e, caso tenha um erro, também é um pouquinho
mais complicado de ele ser encontrado.
-
Muitas vezes, uma consulta desse tipo
-
pode ser equivalente a uma junção.
-
Mas vamos trabalhar a ideia
de subconsulta correlacionada
-
para que você possa entender
a sintaxe, a execução,
-
e aquilo que é recuperado através
de uma subconsulta correlacionada.
-
No nosso exemplo, nós
trabalhamos a subconsulta,
-
e veja que, na subconsulta,
nós temos uma referência
-
à consulta principal.
-
Veja que eu estou comparando
o número de matrícula da implantação
-
com o número de matrícula
da tabela funcionário.
-
Veja que nós temos o "F", que é
o apelido da tabela, fazendo a referência.
-
Com isso, não é possível
executar apenas este trecho.
-
Daria erro pois ele não
conseguiria identificar
-
a origem desta coluna
que nós estamos especificando.
-
Então, para ter a ideia
do resultado total,
-
é necessário executar o comando inteiro.
-
Aqui, quando nós temos "WHERE EXISTS",
-
nós estamos querendo obter
os funcionários que existem
-
no resultado da consulta
à tabela implantação.
-
Então veremos a execução.
-
Só é possível executar o comando inteiro.
-
Veja então que são recuperados
todos os funcionários
-
onde implantações foram encontradas
associadas a esse funcionário.
-
Veja que aqui nós estamos
comparando a matrícula,
-
o número de matrícula
que vem da tabela funcionário,
-
com o número de matrícula
que vem da tabela implantação.
-
Quando fazemos isso, é como
se estivéssemos fazendo uma junção,
-
comparando chave primária
com chave estrangeira,
-
para poder trazer o que é
comum às duas tabelas.
-
Então, o que foi feito aqui tem
exatamente esse mesmo efeito,
-
como se eu estivesse fazendo uma junção,
-
só que baseada em subconsulta,
subconsulta correlacionada,
-
que utiliza a tabela
e o campo da tabela externa
-
como comparação da subconsulta.
-
Dentro da mesma linha de pensamento,
-
nós podemos também recuperar
através da subconsulta correlacionada
-
elementos que não existem.
-
Vamos ver o exemplo?
-
Veja que aqui nós temos
a subconsulta correlacionada,
-
ou seja, nós temos a referência
da matrícula da tabela funcionário
-
com a matrícula que nós
temos aqui na tabela implantação.
-
Então estamos correlacionando
essa subconsulta à consulta principal.
-
Só que agora a ideia é
trazer os funcionários
-
que não foram encontrados
associados à tabela implantação.
-
Vamos ver a execução?
-
Veja então que nós
recuperamos os funcionários
-
que não estão participando
de nenhuma implantação.
-
Perceba que quando utilizamos
uma subconsulta correlacionada
-
realizando a validação
dos que não existem,
-
é equivalente a uma junção externa,
onde eu quero, por exemplo,
-
saber quais funcionários que não
participam de implantações.
-
Então, a subconsulta correlacionada
é uma alternativa à junção,
-
também podendo ser
recuperada desta maneira.