LoginSignup
19
15

More than 3 years have passed since last update.

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

参考

19
15
0

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
19
15