EXISTS
SELECT *
FROM users
WHERE EXISTS
( SELECT id
FROM orders
WHERE users.id = user_id
AND orders.created >= '2019-06');
- usersテーブルはメインテーブル、ordersテーブルはサブテーブル
- このメインテーブルのidをサブクエリで参照する事を相関サブクエリと呼ぶ
- メインテーブル×サブテーブルのレコード数を比較対象とする
- 条件に一致するレコードが見つかった場合その時点で処理は終了する
- 見つからなかった場合、メインテーブル×サブテーブルのレコード数を比較しに行く
- レコード数が増えればその分比較対象となるレコード数も増える
INNER JOIN
SELECT *
FROM users
INNER JOIN
( SELECT DISTINCT user_id
FROM orders
WHERE orders.created >= '2019-06') AS sub
ON sub.user_id = users.id;
- 実行順序によりINNER JOIN句のサブクエリから実行される
- サブクエリの実行でSELECTに指定したカラムの重複削除とWHERE句の条件によって絞り込みが行われる
- その結果をINNER JOINでメインテーブルに結合する
実行速度
-
EXISTS
- 45~50ms
-
INNER JOIN
- 15~20ms