|
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
|