LoginSignup
18

More than 5 years have passed since last update.

MySQLで集合の重なりを出す

Posted at

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)

まんま、UNIONUNION ALL がある。

差 (EXCEPT)

MySQLで素直に書けないけど、大抵はLEFT JOINで実現できる。
MySQLで集合差を出す - Qiita

直積 (CROSS JOIN)

CROSS JOINに相当する。

あとは商(DIVIDE BY)か。むむ。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18