DBAtlas · Atlas de operaciones de bases de datos

UNION / UNION ALL / INTERSECT / EXCEPT (MINUS)

Oracle

-- Union without duplicates
SELECT city FROM customer
UNION
SELECT city FROM supplier;

-- Intersection and difference (MINUS instead of EXCEPT in Oracle)
SELECT city FROM customer INTERSECT SELECT city FROM supplier;
SELECT city FROM customer MINUS SELECT city FROM supplier;

Los operadores de conjuntos combinan los conjuntos de resultados de dos consultas. UNION elimina duplicados (más lento), UNION ALL los conserva todos (más rápido), INTERSECT devuelve las filas comunes y el operador de diferencia devuelve las filas que solo están en el primer conjunto. Para la diferencia, Oracle usa MINUS en lugar del EXCEPT estándar (EXCEPT también existe desde 21c).

PostgreSQL

SELECT city FROM customer
UNION
SELECT city FROM supplier;

SELECT city FROM customer INTERSECT SELECT city FROM supplier;
SELECT city FROM customer EXCEPT SELECT city FROM supplier;

PostgreSQL admite plenamente UNION, UNION ALL, INTERSECT y EXCEPT estándar (EXCEPT, no MINUS, para la diferencia). La forma ALL de cada operador (INTERSECT ALL, EXCEPT ALL) conserva el número de duplicados. El número y los tipos de columnas deben ser compatibles.

MySQL

SELECT city FROM customer
UNION
SELECT city FROM supplier;

-- INTERSECT/EXCEPT arrive with MySQL 8.0.31+ and MariaDB 10.3+
SELECT city FROM customer INTERSECT SELECT city FROM supplier;

Durante mucho tiempo MySQL solo admitió UNION / UNION ALL; INTERSECT y EXCEPT no se añadieron hasta MySQL 8.0.31 (MariaDB 10.3). En versiones anteriores use INNER JOIN/EXISTS para la intersección y LEFT JOIN ... IS NULL o NOT EXISTS para la diferencia.

SQL Server

SELECT city FROM customer
UNION
SELECT city FROM supplier;

SELECT city FROM customer INTERSECT SELECT city FROM supplier;
SELECT city FROM customer EXCEPT SELECT city FROM supplier;

SQL Server admite UNION, UNION ALL, INTERSECT y EXCEPT estándar (2005+); el operador de diferencia es EXCEPT (no MINUS). INTERSECT/EXCEPT comparan las filas tratando los valores NULL como iguales.

MongoDB

// Closest equivalent: $unionWith (MongoDB 4.4+)
db.customer.aggregate([
  { $project: { city: 1, _id: 0 } },
  { $unionWith: { coll: "supplier",
      pipeline: [ { $project: { city: 1, _id: 0 } } ] } },
  { $group: { _id: "$city" } }  // UNION (distinct) effect
])

La etapa $unionWith de MongoDB 4.4+ combina los resultados de dos colecciones (como UNION ALL). Para eliminar duplicados, deduplique después con $group. INTERSECT/EXCEPT no tienen un equivalente directo; se modelan con $lookup u operadores de conjuntos ($setIntersection, $setDifference).

Redis

# Set operations with the Set data type:
SUNION city_customer city_supplier    # union
SINTER city_customer city_supplier    # intersection
SDIFF  city_customer city_supplier    # difference

Redis no tiene SQL, pero el tipo de datos Set ofrece operaciones de conjuntos nativas: SUNION (unión), SINTER (intersección), SDIFF (diferencia) y sus variantes STORE, que guardan el resultado. Operan sobre miembros de conjuntos ya construidos, no sobre resultados de consultas.

Elasticsearch

# There is no direct set operator.
# For a union, search multiple indices in one query:
GET customer,supplier/_search
{ "query": { "match_all": {} } }

Elasticsearch no ofrece UNION/INTERSECT/EXCEPT. El efecto de unión se logra consultando varios índices separados por comas; para la intersección y la diferencia use las cláusulas must/should/must_not de una bool query o lógica de conjuntos en la aplicación.

Abrir en DBAtlas →