El operador EXISTS
es un operador booleano que comprueba la existencia de filas en una subconsulta.
Esta es la sintaxis básica del operador EXISTS
:
EXISTS (subquery)
Normalmente, el operador EXISTS
se utiliza en la cláusula WHERE
de una sentencia SELECT
:
SELECT
select_list
FROM
table1
WHERE
EXISTS(
SELECT
select_list
FROM
table2
WHERE
condition
);
Si la subconsulta devuelve al menos una fila, el operador EXISTS
devuelve true
. Si la subconsulta no devuelve ninguna fila, el operador EXISTS
devuelve false
.
Tenga en cuenta que si la subconsulta devuelve NULL
, el operador EXISTS
devuelve true
.
El resultado del operador EXISTS
depende de si la subconsulta devuelve alguna fila, y no del contenido de la fila. Por lo tanto, las columnas que aparecen en la select_list
de la subconsulta no son importantes.
Por esta razón, la convención común de codificación es escribir EXISTS
de la siguiente forma:
SELECT
select_list
FROM
table1
WHERE
EXISTS(
SELECT
1
FROM
table2
WHERE
condition
);
Para negar el operador EXISTS
, se utiliza el operador NOT EXISTS
:
NOT EXISTS (subquery)
El operador NOT EXISTS
devuelve true
si la subconsulta no devuelve ninguna fila o false
si la subconsulta devuelve al menos una fila.
En la práctica, a menudo se utiliza el operador EXISTS
junto con el operador correlated subqueries.
Ejemplos de EXISTS en PostgreSQL¶
Utilizaremos las siguientes tablas customer
y payment
en la base de datos de ejemplopara la demostración:
Ejemplo básico del operador EXISTS¶
El siguiente ejemplo utiliza el operador EXISTS
para comprobar si el valor del pago es cero existe en la tabla payment
:
SELECT
EXISTS(
SELECT
1
FROM
payment
WHERE
amount = 0
);
Salida:
exists
--------
t
(1 row)
Uso del operador EXISTS para comprobar la existencia de una fila¶
El siguiente ejemplo utiliza el operador EXISTS
para buscar clientes que hayan pagado al menos un alquiler con un importe superior a 11:
SELECT
first_name,
last_name
FROM
customer c
WHERE
EXISTS (
SELECT
1
FROM
payment p
WHERE
p.customer_id = c.customer_id
AND amount > 11
)
ORDER BY
first_name,
last_name;
La consulta devuelve el siguiente resultado:
first_name | last_name
------------+-----------
Karen | Jackson
Kent | Arsenault
Nicholas | Barfield
Rosemary | Schmidt
Tanya | Gilbert
Terrance | Roush
Vanessa | Sims
Victoria | Gibson
(8 rows)
En este ejemplo, para cada cliente de la tabla customer
, la subconsulta comprueba la tabla payment
para averiguar si ese cliente realizó al menos un pago (p.customer_id = c.customer_id
) y el importe es superior a 11 ( amount > 11
)
Ejemplo de NOT EXISTS¶
El siguiente ejemplo utiliza el operador NOT EXISTS
para encontrar clientes que no hayan realizado ningún pago superior a 11.
SELECT
first_name,
last_name
FROM
customer c
WHERE
NOT EXISTS (
SELECT
1
FROM
payment p
WHERE
p.customer_id = c.customer_id
AND amount > 11
)
ORDER BY
first_name,
last_name;
Este es el resultado:
first_name | last_name
-------------+--------------
Aaron | Selby
Adam | Gooch
Adrian | Clary
Agnes | Bishop
Alan | Kahn
...
Ejemplo de EXISTS y NULL¶
El siguiente ejemplo devuelve todas las filas de la tabla customers
porque la subconsulta del operador EXISTS
devuelve NULL
:
SELECT
first_name,
last_name
FROM
customer
WHERE
EXISTS(
SELECT NULL
)
ORDER BY
first_name,
last_name;
Salida:
first_name | last_name
-------------+--------------
Aaron | Selby
Adam | Gooch
Adrian | Clary
Agnes | Bishop
...
Resumen¶
- Utilice la función
EXISTS
de PostgreSQL para comprobar la existencia de filas en una subconsulta.