DBAtlas · データベース運用アトラス

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    # difference

Redis には 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 句、またはアプリケーション側の集合ロジックを使用する。

DBAtlas で開く →