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;集合演算子は 2 つのクエリの結果セットを結合する。UNION は重複を除去し(低速)、UNION ALL はすべてを保持し(高速)、INTERSECT は共通の行を、差集合の演算子は最初の集合にのみ存在する行を返す。差集合に Oracle は標準の EXCEPT ではなく MINUS を使用する(21c 以降は EXCEPT も存在する)。
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 は標準の UNION、UNION ALL、INTERSECT、EXCEPT を完全にサポートする(差集合は MINUS ではなく EXCEPT)。各演算子の ALL 形式(INTERSECT ALL、EXCEPT ALL)は重複の数を保持する。列数と型は互換である必要がある。
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;MySQL は長い間 UNION / UNION ALL のみをサポートしていた。INTERSECT と EXCEPT が追加されたのは MySQL 8.0.31(MariaDB 10.3)になってから。古いバージョンでは積集合に INNER JOIN/EXISTS を、差集合に LEFT JOIN ... IS NULL または NOT EXISTS を使用する。
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 は標準の UNION、UNION ALL、INTERSECT、EXCEPT(2005+)をサポートする。差集合の演算子は EXCEPT(MINUS ではない)。INTERSECT/EXCEPT は NULL 値を等しいとみなして行を比較する。
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
])MongoDB 4.4+ の $unionWith ステージは 2 つのコレクションの結果を結合する(UNION ALL に類似)。重複を除去するには、その後 $group で重複排除する。INTERSECT/EXCEPT に直接相当するものはなく、$lookup や集合演算子($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 # differenceRedis には SQL はないが、Set データ型がネイティブの集合演算を提供する: SUNION(和集合)、SINTER(積集合)、SDIFF(差集合)と、結果を保存する STORE 版。これらはクエリ結果ではなく、事前に構築された集合のメンバーに対して動作する。
Elasticsearch
# There is no direct set operator.
# For a union, search multiple indices in one query:
GET customer,supplier/_search
{ "query": { "match_all": {} } }Elasticsearch は UNION/INTERSECT/EXCEPT を提供しない。和集合の効果は、カンマ区切りの複数のインデックスをクエリすることで得られる。積集合と差集合には bool クエリの must/should/must_not 句、またはアプリケーション側の集合ロジックを使用する。