Saltar a contenido

Al igual que los operadores UNION e INTERSECT, el operador EXCEPT devuelve filas comparando los conjuntos de resultados de dos o más consultas.

El operador EXCEPT devuelve filas distintas de la primera consulta (izquierda) que no están en la segunda consulta (derecha).

A continuación se ilustra la sintaxis del operador EXCEPT.

SELECT select_list
FROM A
EXCEPT 
SELECT select_list
FROM B;

Las consultas que implican el EXCEPT tienen que seguir estas reglas:

  • El número de columnas y su orden deben ser los mismos en las dos consultas.
  • Los tipos de datos de las columnas respectivas deben ser compatibles.

El siguiente diagrama de Venn ilustra el operador EXCEPT:

PostgreSQL EXCEPT

Si desea ordenar las filas de los conjuntos de resultados combinados, debe colocar la cláusula ORDER BY después de la segunda consulta:

SELECT select_list
FROM A
EXCEPT 
SELECT select_list
FROM B
ORDER BY sort_expression;

Creación de tablas de ejemplo

Crearemos las tablas top_rated_films y most_popular_films para demostración:

CREATE TABLE top_rated_films(
  title VARCHAR NOT NULL, 
  release_year SMALLINT
);

CREATE TABLE most_popular_films(
  title VARCHAR NOT NULL, 
  release_year SMALLINT
);

INSERT INTO top_rated_films(title, release_year) 
VALUES 
   ('The Shawshank Redemption', 1994), 
   ('The Godfather', 1972), 
   ('The Dark Knight', 2008),
   ('12 Angry Men', 1957);

INSERT INTO most_popular_films(title, release_year) 
VALUES 
  ('An American Pickle', 2020), 
  ('The Godfather', 1972), 
  ('The Dark Knight', 2008),
  ('Greyhound', 2020);

SELECT * FROM top_rated_films;
SELECT * FROM most_popular_films;

El contenido de la tabla top_rated_films:

          title           | release_year
--------------------------+--------------
 The Shawshank Redemption |         1994
 The Godfather            |         1972
 The Dark Knight          |         2008
 12 Angry Men             |         1957
(4 rows)

El contenido de la tabla most_popular_films:

       title        | release_year
--------------------+--------------
 An American Pickle |         2020
 The Godfather      |         1972
 The Dark Knight    |         2008
 Greyhound          |         2020
(4 rows)

Ejemplos del operador EXCEPT de PostgreSQL

Veamos algunos ejemplos de uso del operador `EXCEPT

Ejemplo básico del operador EXCEPT

La siguiente sentencia utiliza el operador EXCEPT para encontrar las películas mejor valoradas que no son populares:

SELECT * FROM top_rated_films
EXCEPT 
SELECT * FROM most_popular_films;

Salida:

          title           | release_year
--------------------------+--------------
 The Shawshank Redemption |         1994
 12 Angry Men             |         1957
(2 rows)

Uso del operador EXCEPT con la cláusula ORDER BY

La siguiente sentencia utiliza la cláusula ORDER BY en la consulta para ordenar por títulos el conjunto de resultados devuelto por el operador EXCEPT:

SELECT * FROM top_rated_films
EXCEPT 
SELECT * FROM most_popular_films
ORDER BY title;

Salida:

          title           | release_year
--------------------------+--------------
 12 Angry Men             |         1957
 The Shawshank Redemption |         1994
(2 rows)

Observe que hemos colocado la cláusula ORDER BY después de la segunda consulta para ordenar las películas por títulos.

Resumen

  • Utilice el operador EXCEPT de PostgreSQL para combinar filas de dos conjuntos de resultados y devolver un conjunto de resultados que contenga filas del primer conjunto de resultados que no aparezcan en el segundo conjunto de resultados.