¿Cómo usar el operador EXISTS de SQL Server?

Resumen: en este tutorial, aprenderás cómo usar el operador EXISTS de SQL Server en la condición WHERE o HAVING para probar la existencia de filas en una subconsulta.
¿Qué es el operador EXISTS de SQL?
El operador EXISTS es un operador lógico que permite verificar si una subconsulta devuelve alguna fila. El operador EXISTS devuelve TRUE si la subconsulta devuelve una o más filas.
A continuación, se muestra la sintaxis del operador EXISTS de SQL Server:
EXISTS (subquery)
En esta sintaxis, la subconsulta es solo una instrucción SELECT. Tan pronto como la subconsulta devuelve filas, el operador EXISTS devuelve TRUE y detiene el procesamiento inmediatamente.
Ten en cuenta que, aunque la subconsulta devuelve un valor NULL, el operador EXISTS aún se evalúa como TRUE.
¿Cómo usar el operador EXISTS de SQL?
SELECT [column_name... | expression1 ]
FROM [table_name]
WHERE [NOT] EXISTS (subquery)
Nombre | Desc. |
---|---|
column_name | Nombre de la columna de la columna. |
expression1 | Expresión formada por una sola constante, variable, función escalar o nombre de columna y también pueden ser piezas de una consulta SQL que comparan valores con otros valores o realizan cálculos aritméticos. |
table_name | Nombre de la columna de la tabla. |
WHERE [NOT] EXISTS |
Valida la subconsulta para la existencia de una o más filas. Si una sola fila satisface la cláusula de subconsulta, devuelve el valor booleano TRUE. |
¿Cómo funciona el operador EXISTS de SQL?
A continuación, te muestro algunos ejemplos para entender cómo funciona el operador EXISTS.
A) Ejemplo de la cláusula EXISTS con una subconsulta que devuelve un NULL
Consulta la siguiente tabla de clientes de la base de datos de ejemplo.
El siguiente ejemplo devuelve todas las filas de la tabla de clientes:
SELECT customer_id, first_name, last_name
FROM sales.customers
WHERE EXISTS (SELECT NULL)
ORDER BY first_name, last_name;
Resultado (primeras 11 filas):
customer_id | first_name | last_name |
---|---|---|
1174 | Aaron | Knapp |
338 | Abbey | Pugh |
75 | Abby | Gamble |
1224 | Abram | Copeland |
673 | Adam | Henderson |
1085 | Adam | Thornton |
195 | Addie | Hahn |
1261 | Adelaida | Hancock |
22 | Adelle | Larsen |
1023 | Adena | Blake |
1412 | Adrien | Hunter |
En este ejemplo, la subconsulta devolvió un conjunto de resultados que contiene valores NULL, lo que hace que el operador EXISTS se evalúe como TRUE. Por lo tanto, la consulta completa devuelve todas las filas de la tabla de clientes.
B) Ejemplo de la cláusula EXISTS con una subconsulta relacionada
Considera las siguientes tablas de clientes y pedidos:
El siguiente ejemplo encuentra todos los clientes que han realizado más de dos pedidos:
SELECT customer_id, first_name, last_name
FROM sales.customers c
WHERE EXISTS (SELECT COUNT (*)
FROM sales.orders o
WHERE customer_id = c.customer_id
GROUP BY customer_id
HAVING COUNT (*) > 2)
ORDER BY first_name, last_name;
Resultado:
customer_id | first_name | last_name |
---|---|---|
20 | Aleta | Shepard |
32 | Araceli | Golden |
64 | Bobbie | Foster |
47 | Bridgette | Guerra |
17 | Caren | Stephens |
5 | Charolette | Rice |
50 | Cleotilde | Booth |
24 | Corene | Wall |
4 | Daryl | Spence |
1 | Debra | Burks |
En este ejemplo, tenemos una subconsulta relacionada que devuelve clientes que han realizado más de dos pedidos, usando el WHERE, GROUP BY y el HAVING.
Si el número de pedidos realizados por el cliente es menor o igual a dos, la subconsulta devuelve un conjunto de resultados vacío que hace que el operador EXISTS se evalúe como FALSE.
Según el resultado del operador EXISTS, el cliente se incluirá en el conjunto de resultados.
C) Ejemplo EXISTS vs IN
La siguiente declaración utiliza el operador IN para encontrar los pedidos de los clientes de la ciudad de San José:
SELECT *
FROM sales.orders
WHERE customer_id IN (
SELECT customer_id
FROM sales.customers
WHERE city = 'San Jose')
ORDER BY customer_id, order_date;
La siguiente instrucción utiliza el operador EXISTS que devuelve el mismo resultado:
SELECT *
FROM sales.orders o
WHERE EXISTS (
SELECT customer_id
FROM sales.customers c
WHERE o.customer_id = c.customer_id
AND city = 'San Jose')
ORDER BY o.customer_id, order_date;
Resultado:
order_id | customer_id | order_status | order_date | required_date | shipped_date | store_id | staff_id |
---|---|---|---|---|---|---|---|
1411 | 109 | 4 | 01/03/2018 | 02/03/2018 | 02/03/2018 | 1 | 2 |
1584 | 109 | 2 | 26/04/2018 | 26/04/2018 | 1 | 3 | |
1275 | 165 | 4 | 29/11/2017 | 01/12/2017 | 30/11/2017 | 1 | 2 |
1591 | 165 | 2 | 27/04/2018 | 27/04/2018 | 1 | 2 | |
156 | 357 | 4 | 03/04/2016 | 06/04/2016 | 05/04/2016 | 1 | 3 |
868 | 868 | 4 | 01/05/2017 | 04/05/2017 | 02/05/2017 | 1 | 3 |
1336 | 904 | 4 | 09/01/2018 | 10/01/2018 | 12/01/2018 | 1 | 2 |
1026 | 1370 | 4 | 26/07/2017 | 28/07/2017 | 29/07/2017 | 1 | 2 |
927 | 1438 | 4 | 03/06/2017 | 05/06/2017 | 06/06/2017 | 1 | 2 |
En este tutorial, aprendiste a usar el operador EXISTS de SQL Server para probar si una subconsulta devuelve filas.