- 投稿日:2019-06-22T15:14:11+09:00
SQL EXISTSとJOIN
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
参考