Subqueries
- comando select embutindo em outro select
- retorna um conjunto de linhas para a query principal
- pode ser usado: no where, como uma expressão (coluna), no lugar de
uma tabela, no comando IN e no comando EXISTS
#no IN
SELECT numero
FROM nfe
WHERE numero IN (
SELECT numero
FROM item_nfe
WHERE quantidade >= 10
);
#como tabela (caso raro de acontecer)
SELECT cidade.idcidade, cidade.nome, TB.qtde_bairro
FROM cidade
JOIN (
SELECT idcidade, COUNT(*) as qtde_bairro
FROM bairro
GROUP BY idcidade
) as TB
ON (cidade.idcidade = TB.idcidade);
#como uma coluna(expressão)
SELECT descricao, valor_unitario (
SELECT AVG(valor_unitario)
FROm produto
) as media
FROM produto;
Subquery correlata
- subquery que faz referência a colunas da query principal
- executa 1 vez para cada linha da query principal (nested loop join)
#como coluna
SELECT numero, data, (
SELECT SUM(quantidade * valor_unitario)
FROM item_nfe
JOIN produto
ON (item_nfe.idproduto = produto.idproduto)
WHERE item_nfe.numero = nfe.numero
) as total
FROM nfe;
#no EXISTS
SELECT *
FROM bairro
WHERE EXISTS(
SELECT 1
FROM ceps
WHERE ceps.idbairro = bairro.idbairro
AND auxiliar IS NOT NULL
);
EXISTS
- vê se a relação devolve alguma linha
SELECT 1
- seta o valor 1 para cada linha retornada
- usado quando você não se importa com os dados em si
- você pode trocar o 1 por qualquer outra coisa
CASE
- retorna dados para uma coluna
Having
- filtra valores das resultantes das funções de grupo (já que o where
não funciona)
- espécie de where para funções de grupo
- aparece depois do GROUP BY
- pode ser usado com os operadores do WHERE também, como o AND, OR,
NOT, IS NOT NULL, BETWEEN, etc.
SELECT numero, SUM(quantidade) as qtde
FROM item_nfe
GROUP BY numero
HAVING qtde > 10;