Saltar a contenido

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:

customer and payment tables

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.