DBAtlas · Atlas d'exploitation des bases de données

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;

Les opérateurs ensemblistes combinent les jeux de résultats de deux requêtes. UNION élimine les doublons (plus lent), UNION ALL les conserve tous (plus rapide), INTERSECT renvoie les lignes communes, et l'opérateur de différence renvoie les lignes présentes uniquement dans le premier ensemble. Pour la différence, Oracle utilise MINUS au lieu du EXCEPT standard (EXCEPT existe aussi depuis 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 prend entièrement en charge UNION, UNION ALL, INTERSECT et EXCEPT standard (EXCEPT, et non MINUS, pour la différence). La forme ALL de chaque opérateur (INTERSECT ALL, EXCEPT ALL) conserve le nombre de doublons. Le nombre et les types de colonnes doivent être 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;

Pendant longtemps, MySQL n'a pris en charge que UNION / UNION ALL ; INTERSECT et EXCEPT n'ont été ajoutés qu'en MySQL 8.0.31 (MariaDB 10.3). Sur les versions plus anciennes, utilisez INNER JOIN/EXISTS pour l'intersection et LEFT JOIN ... IS NULL ou NOT EXISTS pour la différence.

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 prend en charge UNION, UNION ALL, INTERSECT et EXCEPT standard (2005+) ; l'opérateur de différence est EXCEPT (pas MINUS). INTERSECT/EXCEPT comparent les lignes en traitant les valeurs NULL comme égales.

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
])

L'étape $unionWith de MongoDB 4.4+ combine les résultats de deux collections (comme UNION ALL). Pour éliminer les doublons, dédupliquez ensuite avec $group. INTERSECT/EXCEPT n'ont pas d'équivalent direct ; on les modélise avec $lookup ou des opérateurs ensemblistes ($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 n'a pas de SQL, mais le type de données Set offre des opérations ensemblistes natives : SUNION (union), SINTER (intersection), SDIFF (différence) et leurs variantes STORE qui enregistrent le résultat. Elles portent sur des membres d'ensembles déjà construits, pas sur des résultats de requêtes.

Elasticsearch

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

Elasticsearch n'offre pas UNION/INTERSECT/EXCEPT. Un effet d'union s'obtient en interrogeant plusieurs indices séparés par des virgules ; pour l'intersection et la différence, utilisez les clauses must/should/must_not d'une requête bool ou une logique ensembliste côté application.

Ouvrir dans DBAtlas →