20190622のSQLに関する記事は1件です。

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

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む