MySQLで集合差を出す - Qiita
これと似たようなところで、集合同士の重なり(intersect)を出す方法。
ぱっといい例が思いつかないので適当だけど、
CREATE TABLE a (
id INT NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE b (
id INT NOT NULL,
PRIMARY KEY(id)
);
aとbに共通する部分を抜き出したいとする。
-- イメージ的にはこうしたいんよ
a INTERSECT b
もちろんこんな機能はMySQLにはない。
INを使う方法
素直に書くとINになると思う。が、大抵遅いので推奨されない。
SELECT a.id
FROM a
WHERE a.id IN (
SELECT b.id
FROM b
)
;
EXISTS + 相関サブクエリ
相関サブクエリを使って、合致する行が一行でもあれば、という書き換えもできる。
SELECT a.id
FROM a
WHERE EXISTS (
SELECT 1
FROM b
WHERE a.id = b.id
LIMIT 1
)
;
INNER JOIN
今回のケースだとこれが一番単純だと思う。
SELECT a.id
FROM a INNER JOIN b
ON a.id = b.id
SELECT句で絞込が発生するのがちょっと嫌な所かな。
その他の集合演算
他の処理は、、だいたい何とかなりそう。
射影 (project)
SELECT id, name
みたいに取ってくる句を絞り込む操作が射影にあたる。
制限 (restrict)
WHERE
句に相当する。
和 (UNION)
まんま、UNION
と UNION ALL
がある。
差 (EXCEPT)
MySQLで素直に書けないけど、大抵はLEFT JOINで実現できる。
MySQLで集合差を出す - Qiita
直積 (CROSS JOIN)
CROSS JOIN
に相当する。
あとは商(DIVIDE BY)か。むむ。