概要: このチュートリアルでは、SQL INTERSECT演算子について説明し、2つ以上のクエリの共通部分を取得する方法を示します。
SQL INTERSECT演算子の概要
INTERSECT演算子は、SELECTステートメントから得られる2つ以上の結果セットの重複しない行を返す集合演算子です。
例えば、A(1,2)とB(2,3)の2つのテーブルがあるとします。
次の図は、AとBのテーブルの共通部分を示しています。

紫色の部分は、緑と青の結果セットの共通部分です。
UNION演算子と同様に、INTERSECT演算子は最終的な結果セットから重複する行を削除します。
次のステートメントは、INTERSECT演算子を使用して2つの結果セットの共通部分を見つける方法を示しています。
SELECT
id
FROM
a
INTERSECT
SELECT
id
FROM
b;
Code language: SQL (Structured Query Language) (sql)
INTERSECT演算子を使用するには、SELECTステートメントの列が次のルールに従う必要があります。
- 列のデータ型は互換性がある必要があります。
- SELECTステートメントの列数とその順序は同じでなければなりません。
SQL INTERSECT演算子の例
次のSELECTステートメントは、テーブルAから行を返します。
SELECT
id
FROM
A;
Code language: SQL (Structured Query Language) (sql)

そして、次のステートメントはテーブルBからデータを取得します。
SELECT
id
FROM
B;
Code language: SQL (Structured Query Language) (sql)

次のステートメントは、INTERSECT演算子を使用して両方のクエリの共通部分を取得します。
SELECT
id
FROM
a
INTERSECT
SELECT
id
FROM
b;
Code language: SQL (Structured Query Language) (sql)

SQL INTERSECTとORDER BYの例
INTERSECT演算子によって返される結果セットをソートするには、すべてのステートメントの最後にORDER BY句を配置します。
例えば、次のステートメントは、INTERSECT演算子をAテーブルとBテーブルに適用し、結合された結果セットをid列で降順にソートします。
SELECT
id
FROM
a
INTERSECT
SELECT
id
FROM
b
ORDER BY id DESC;
Code language: SQL (Structured Query Language) (sql)

INNER JOIN句を使用したSQL INTERSECT演算子のエミュレート
ほとんどのリレーショナルデータベースシステムは、Oracle Database、Microsoft SQL Server、PostgreSQLなどのINTERSECT演算子をサポートしています。ただし、MySQLのようにINTERSECT演算子を提供しないデータベースシステムもあります。
SQL INTERSECT演算子をエミュレートするには、INNER JOIN句を次のように使用できます。
SELECT
a.id
FROM
a
INNER JOIN b ON b.id = a.id
Code language: SQL (Structured Query Language) (sql)
これは、Bテーブルに一致する行を持つAテーブルの行を返し、INTERSECT演算子と同じ結果を生成します。
これで、SQL INTERSECT演算子を十分に理解し、複数のクエリの共通部分を見つけるためにそれを使用する方法を知っているはずです。