Operadores SQL: verificando resultados com EXISTS e NOT EXISTS - www.cadcobol.com


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

Operadores SQL: verificando resultados com EXISTS e NOT EXISTS

Existem duas outras palavras-chave que podem ser usadas de maneira semelhante: EXISTS e NOT EXISTS.

A palavra-chave SQL EXISTS

A palavra-chave SQL EXISTS é usada para verificar se pelo menos um valor foi encontrado em uma subconsulta.

Não funciona com uma lista literal de valores como a palavra-chave IN.
Portanto, esta cláusula não funcionará: WHERE column EXISTS (value1, value2).
Precisa ser uma subconsulta.

WHERE EXISTS (subconsulta);

A subconsulta é uma consulta SELECT que visa retornar pelo menos um valor.

Se a subconsulta retornar pelo menos um valor, EXISTS será avaliado como TRUE e o registro será exibido.

Se a subconsulta não retornar nenhum valor, EXISTS será avaliado como FALSE e o registro não será exibido.

Vejamos um exemplo.

SELECT id
,      first_name
,      last_name
  FROM customer
 WHERE EXISTS (
       SELECT first_name
         FROM common_names
        WHERE customer.first_name = common_names.first_name );

Para cada um dos registros na tabela customer, isso localizará todos os valores first_name da tabela common_names que correspondam ao primeiro nome do cliente.

Ele executa o mesmo tipo de lógica que a palavra-chave IN.

Mas há algumas diferenças – que explicarei em breve.

A palavra-chave SQL NOT EXISTS

A palavra-chave NOT EXISTS é usada para ver se um valor não é retornado por uma subconsulta.

O NOT EXISTS verificará os resultados de uma subconsulta e retornará TRUE se nenhum resultado for encontrado na subconsulta. É o oposto de EXISTE.

WHERE NOT EXISTS (subconsulta)

Por exemplo:

SELECT id
,      first_name
,      last_name
  FROM customer
 WHERE NOT EXISTS (
       SELECT first_name
         FROM common_names
        WHERE customer.first_name = common_names.first_name );

Esta consulta localizará todas as linhas do cliente em que first_name não está na tabela common_names.

Qual é a diferença entre EXISTS, IN e uma Join?

Portanto, examinamos as palavras-chave IN e EXISTS e suas versões negativas (usando a palavra-chave NOT).

Quais são as diferenças entre IN e EXISTS?

  • IN pode ser executado com valores específicos ou uma subconsulta. EXISTS deve usar uma subconsulta.
  • IN verifica todos os valores para uma correspondência.
    EXISTS apenas verifica se pelo menos um valor é retornado.

A palavra-chave EXISTS destina-se a evitar a verificação de todos os dados e evitar a contagem.

SELECT id
,      first_name
,      address_state
  FROM customer
 WHERE EXISTS (
       SELECT order_id
         FROM order
        WHERE order.customer_id = customer.id );

Isso encontrará clientes que tenham pelo menos um pedido.
É provável que seja mais eficiente do que esta consulta, pois ela precisa verificar todos os registros:

SELECT id
,      first_name
,      address_state
  FROM customer
 WHERE id IN (
       SELECT customer_id
         FROM order );

IN também é melhor se você tiver uma lista específica para usar, pois você pode apenas inserir esses valores e não usar um EXISTS com uma subconsulta.

SELECT id
,      first_name
,      address_state
  FROM customer
 WHERE first_name IN ('John', 'Mary', 'Susan');

E com uma junção (Join)?
O exemplo que vimos anteriormente verifica se os valores do primeiro nome correspondem entre duas tabelas, o que soa como uma junção.

SELECT id
,      first_name
,      last_name
  FROM customer
 INNER JOIN common_names ON customer.first_name = common_names.first_name;

Isso deve retornar os mesmos resultados da consulta IN.
Dependendo do seu banco de dados, eles também devem avaliar o mesmo processo e planejar internamente.

Por que as consultas SELECIONAM valores literais com EXISTS?

Você já viu uma consulta como essa?

SELECT id
,      first_name
,      address_state
  FROM customer
 WHERE EXISTS (
       SELECT 1
         FROM order
        WHERE order.customer_id = customer.id
          AND order_value > 100 );

Observe a cláusula SELECT na subconsulta: ela mostra SELECT 1.

Por que isso estaria lá?

Você pode ter visto isso em exemplos online ou no código do seu projeto.

A razão pela qual isso é feito é melhorar o desempenho e tornar a consulta mais fácil de entender.

Como a subconsulta na cláusula EXISTS verifica apenas se pelo menos um registro foi retornado, ela não se importa com o valor retornado.

Ao contrário da palavra-chave IN, o valor não é usado. Portanto, você pode selecionar qualquer coluna da tabela na subconsulta.

Ou você pode selecionar um valor literal como este exemplo. Isso selecionará o valor literal de 1 em vez de uma coluna do banco de dados.

É uma coisa a menos que o banco de dados precisa fazer.

Mais informações

Aqui estão mais alguns artigos sobre EXISTS:


Copyright de Ben Brumm - DatabaseStar