6.15. Expressões de subconsulta

Esta seção descreve as expressões de subconsulta em conformidade com o padrão SQL disponíveis no PostgreSQL. Todas as formas das expressões documentadas nesta seção retornam resultados booleanos (verdade/falso).

6.15.1. EXISTS

EXISTS ( subconsulta )

O argumento do EXISTS é uma declaração SELECT arbitrária, ou uma subconsulta. A subconsulta é avaliada para determinar se retorna alguma linha. Se retornar pelo menos uma linha, o resultado de EXISTS é "verdade"; se a subconsulta não retornar nenhuma linha, o resultado de EXISTS é "falso".

A subconsulta pode fazer referência às variáveis da consulta que a envolve, que atuam como constantes durante a avaliação da subconsulta.

A subconsulta geralmente só é executada até ser determinado se pelo menos uma linha é retornada, e não até o fim. Não é sensato escrever uma subconsulta que tenha efeitos colaterais (tal como chamar uma função de seqüência); se o efeito colateral ocorrerá ou não pode ser difícil de saber.

Uma vez que o resultado depende apenas do fato de alguma linha ser retornada, e não do conteúdo desta linha, normalmente não há interesse no conteúdo da saída da subconsulta. Uma convenção usual de codificação, é escrever todos os testes de EXISTS na forma EXISTS(SELECT 1 WHERE ...). Entretanto, existem exceções para esta regra, como as subconsultas que utilizam INTERSECT.

Este exemplo simples é como uma junção interna em col2, mas produz no máximo uma linha de saída para cada linha de tab1, mesmo que existam muitas linhas correspondentes em tab2:

SELECT col1 FROM tab1
    WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

6.15.2. IN (forma escalar)

expressão IN (valor[, ...])

O lado direito desta forma do IN é uma lista de expressões escalares entre parênteses. O resultado é "verdade" se o resultado da expressão à esquerda for igual a qualquer uma das expressões à direita. Esta é uma notação abreviada para

expressão = valor1
OR
expressão = valor2
OR
...

Quando a expressão à esquerda for nula, ou não havendo nenhum valor igual à direita, e pelo menos uma expressão à direita for nula, o resultado da construção IN será nulo, e não falso. Isto está de acordo com as regras normais do SQL para as combinações booleanas de valores nulos.

Nota: Esta forma do IN não é uma expressão de subconsulta de verdade, mas parece melhor ser documentada no mesmo local da subconsulta IN.

6.15.3. IN (forma de subconsulta)

expressão IN (subconsulta)

O lado direito desta forma do IN é uma subconsulta entre parênteses, que deve retornar exatamente uma coluna. A expressão à esquerda é avaliada e comparada com cada linha do resultado da subconsulta. O resultado do IN é "verdade" se uma linha igual for encontrada no resultado da subconsulta. O resultado é "falso" se nenhuma linha igual for encontrada (incluindo o caso especial onde a subconsulta não retorna nenhuma linha).

Quando a expressão à esquerda for nula, ou não havendo nenhum valor igual à direita, e pelo menos uma das linhas à direita for nula, o resultado da construção IN será nulo, e não falso. Isto está de acordo com as regras normais do SQL para as combinações booleanas de valores nulos.

Da mesma forma que em EXISTS, não é sensato supor que a subconsulta será executada até o fim.

(expressão [, expressão ...]) IN (subconsulta)

O lado direito desta forma do IN é uma subconsulta entre parênteses, que deve retornar tantas colunas quantas forem as expressões existentes na lista do lado esquerdo. As expressões do lado esquerdo são avaliadas e comparadas com cada linha do resultado da subconsulta. O resultado do IN é "verdade" se for encontrada alguma linha igual na subconsulta. O resultado é "falso" se nenhuma linha igual for encontrada (incluindo o caso especial onde a subconsulta não retorna nenhuma linha).

Como usual, os valores nulos nas expressões ou nas linhas da subconsulta são combinados conforme as regras normais do SQL para expressões booleanas. Duas linhas são consideradas iguais se todos os membros correspondentes forem iguais e não nulos; as linhas não são iguais se algum membro correspondente for diferente e não nulo; caso contrário, o resultado da comparação da linha é desconhecido (nulo). Se os resultados de todas as linhas forem diferentes ou nulos, com pelo menos um nulo, então o resultado do IN é nulo.

6.15.4. NOT IN (forma escalar)

expressão NOT IN (valor[, ...])

O lado direito desta forma do NOT IN é uma lista de expressões escalares entre parênteses. O resultado é "verdade" se o resultado da expressão à esquerda for diferente de todas às expressões à direita. Esta é uma notação abreviada para

expressão <> valor1
AND
expressão <> valor2
AND
...

Quando a expressão à esquerda for nula, ou não havendo nenhum valor igual à direita, e pelo menos uma expressão à direita for nula, o resultado da construção NOT IN será nulo, e não verdade como poderia ser esperado. Isto está de acordo com as regras normais do SQL para as combinações booleanas de valores nulos.

Dica: x NOT IN y equivale a NOT (x IN y) em todos os casos. Entretanto, os valores nulos têm muito mais chances de enganar os novatos quando trabalham com NOT IN em vez de IN. É melhor expressar a condição na forma positiva, quando possível.

6.15.5. NOT IN (forma de subconsulta)

expressão NOT IN (subconsulta)

O lado direito desta forma do NOT IN é uma subconsulta entre parênteses, que deve retornar exatamente uma coluna. A expressão do lado esquerdo é avaliada e comparada com cada linha do resultado da subconsulta. O resultado do NOT IN é "verdade" se somente linhas diferentes forem encontradas no resultado da subconsulta (incluindo o caso especial onde a subconsulta não retorna nenhuma linha). O resultado é "falso" se qualquer linha igual for encontrada.

Quando a expressão à esquerda for nula, ou não havendo nenhum valor igual à direita, e pelo menos uma linha da direita for nula, o resultado da construção NOT IN será nulo, e não verdade. Isto está de acordo com as regras normais do SQL para as combinações booleanas de valores nulos.

Do mesmo modo que no EXISTS, não é sensato supor que a subconsulta será executada até o fim.

(expressão [, expressão ...]) NOT IN (subconsulta)

O lado direito desta forma do NOT IN é uma subconsulta entre parênteses, que deve retornar tantas colunas quantas forem as expressões existentes na lista do lado esquerdo. As expressões do lado esquerdo são avaliadas e comparadas com cada linha do resultado da subconsulta. O resultado do NOT IN é "verdade" se somente linhas diferentes forem encontradas na subconsulta (incluindo o caso especial onde a subconsulta não retorna nenhuma linha. O resultado é "falso" se uma linha igual for encontrada.

Como usual, os valores nulos nas expressões ou nas linhas da subconsulta são combinados conforme as regras normais do SQL para expressões booleanas. Duas linhas são consideradas iguais se todos os membros correspondentes forem iguais e não nulos; as linhas não são iguais se algum membro correspondente for diferente e não nulo; caso contrário, o resultado da comparação da linha é desconhecido (nulo). Se todos os resultados das linhas forem diferentes ou nulos, com pelo menos um nulo, então o resultado de NOT IN é nulo.

6.15.6. ANY/SOME

expressão operador ANY (subconsulta)
expressão operador SOME (subconsulta)

O lado direito desta forma do ANY é uma subconsulta entre parênteses, que deve retornar exatamente uma coluna. A expressão à esquerda é avaliada e comparada com cada linha do resultado da subconsulta utilizando o operador fornecido, que deve produzir um valor booleano como resultado. O resultado do ANY é "verdade" se qualquer resultado verdade for obtido. O resultado é "falso" se nenhum resultado verdade for obtido (incluindo o caso especial onde a subconsulta não retorna nenhuma linha).

SOME é um sinônimo de ANY. IN equivale ao = ANY.

Não havendo nenhum êxito, e pelo menos uma linha da direita produzir nulo para o resultado do operador, o resultado da construção ANY será nulo, e não falso. Isto está de acordo com as regras normais do SQL para as combinações booleanas de valores nulos.

Do mesmo modo que no EXISTS, não é sensato supor que a subconsulta será executada até o fim.

(expressão [, expressão ...]) operator ANY (subconsulta)
(expressão [, expressão ...]) operator SOME (subconsulta)

O lado direito desta forma do ANY é uma subconsulta entre parênteses, que deve retornar tantas colunas quantas forem as expressões existentes na lista do lado esquerdo. As expressões do lado esquerdo são avaliadas e comparadas com cada linha do resultado da subconsulta, utilizando o operador fornecido. Atualmente, somente os operadores = e <> são permitidos em consultas ANY linha por linha. O resultado do ANY é "verdade" se for encontrada alguma linha igual ou diferente, respectivamente. O resultado é "falso" se não for encontrada nenhuma linha deste tipo (incluindo o caso especial onde a subconsulta não retorna nenhuma linha).

Como usual, os valores nulos nas expressões ou nas linhas da subconsulta são combinados conforme as regras normais do SQL para expressões booleanas. Duas linhas são consideradas iguais se todos os membros correspondentes forem iguais e não nulos; as linhas não são iguais se algum membro correspondente for diferente e não nulo; caso contrário, o resultado da comparação da linha é desconhecido (nulo). Havendo pelo menos um resultado de linha nulo, então o resultado de ANY não poderá ser falso; será verdade ou nulo.

6.15.7. ALL

expressão operador ALL (subconsulta)

O lado direito desta forma do ALL é uma subconsulta entre parênteses, que deve retornar exatamente uma coluna. A expressão à esquerda é avaliada e comparada com cada linha do resultado da subconsulta utilizando o operador fornecido, que deve produzir um valor booleano como resultado. O resultado do ALL é "verdade" se o resultado para todas as linhas for verdade (incluindo o caso especial onde a subconsulta não retorna nenhuma linha). O resultado é "falso" se algum resultado falso for encontrado.

NOT IN equivale ao <> ALL.

Não havendo nenhuma falha, mas pelo menos uma linha da direita produzir nulo para o resultado do operador, o resultado da construção ALL será nulo, e não verdade. Isto está de acordo com as regras normais do SQL para as combinações booleanas de valores nulos.

Do mesmo modo que no EXISTS, não é sensato supor que a subconsulta será executada até o fim.

(expressão [, expressão ...]) operador ALL (subconsulta)
   

O lado direito desta forma do ALL é uma subconsulta entre parênteses, que deve retornar tantas colunas quantas forem as expressões existentes na lista do lado esquerdo. As expressões do lado esquerdo são avaliadas e comparadas com cada linha do resultado da subconsulta, utilizando o operador fornecido. Atualmente, somente os operadores = e <> são permitidos em consultas ALL linha por linha. O resultado do ALL é "verdade" se todas as linhas da subconsulta forem iguais ou diferentes, respectivamente (incluindo o caso especial onde a subconsulta não retorna nenhuma linha). O resultado é "falso" se for encontrada alguma linha diferente ou igual, respectivamente.

Como usual, os valores nulos nas expressões ou nas linhas da subconsulta são combinados conforme as regras normais do SQL para expressões booleanas. Duas linhas são consideradas iguais se todos os membros correspondentes forem iguais e não nulos; as linhas não são iguais se algum membro correspondente for diferente e não nulo; caso contrário, o resultado da comparação da linha é desconhecido (nulo). Havendo pelo menos um resultado de linha nulo, então o resultado de ALL não poderá ser verdade; será falso ou nulo.

6.15.8. Comparação linha por linha

(expressão [, expressão ...]) operador (subconsulta)
(expressão [, expressão ...]) operador (expressão [, expressão ...])
   

O lado esquerdo é uma lista de expressões escalares. O lado direito pode ser tanto uma lista de expressões escalares do mesmo comprimento, uma uma subconsulta entre parênteses, que deve retornar tantas colunas quantas forem as expressões existentes na lista do lado esquerdo. Além disso, a subconsulta não pode retornar mais de uma linha (Se não retornar nenhuma linha, o resultado é considerado como sendo nulo). O lado esquerdo é avaliado e comparado linha por linha com a única linha do resultado da subconsulta, ou com a lista de expressões à direita. Atualmente, somente os operadores = e <> são permitidos em comparação linha por linha. O resultado será "verdade" se as duas linhas forem iguais ou diferentes, respectivamente.

Como usual, os valores nulos nas expressões ou nas linhas da subconsulta são combinados conforme as regras normais do SQL para expressões booleanas. Duas linhas são consideradas iguais se todos os membros correspondentes forem iguais e não nulos; as linhas não são iguais se algum membro correspondente for diferente e não nulo; caso contrário, o resultado da comparação da linha é desconhecido (nulo).