【さぶくえり】

サブクエリ(副問合せ) とは?

💡 SQLの中に入れ子で書く「もう一つのSELECT文」
📌 このページのポイント
サブクエリ ― SQLの中にSQLを書く 外側のクエリ(メインクエリ) SELECT name, salary FROM employees WHERE salary > ( サブクエリ: SELECT AVG(salary) FROM employees ); 実行の流れ 1. サブクエリ 平均給与を計算 2. 結果を渡す 例: 450万円 3. メインクエリ 条件で絞り込み
サブクエリのイメージ
ひよこ ひよこ

サブクエリってどんなときに使うの?

ペンギン先生 ペンギン先生

例えば「平均年齢より上のユーザーだけ取得したい」とき。「SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users)」のように、内側のSELECTで平均を計算してその結果を外側の条件に使える。

ひよこ ひよこ

JOINとサブクエリはどう使い分けるの?

ペンギン先生 ペンギン先生

結果的に同じデータを取得できることが多い。ただ、サブクエリは「一時的な結果を条件として使う」場面に向いていて、JOINは「2つのテーブルを横につなげる」場面に向いている。パフォーマンスはケースバイケースだからEXPLAINで比較するのが確実。

ひよこ ひよこ

サブクエリのIN句とEXISTS句って何が違うの?

ペンギン先生 ペンギン先生

「WHERE id IN (SELECT user_id FROM orders)」は内側の結果リストにidが含まれるかチェックする。「WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id)」は条件に合うレコードが1件でもあればtrue。小さいリストならIN、大きいテーブルの存在チェックならEXISTSが速いことが多い。

ひよこ ひよこ

相関サブクエリってなに?

ペンギン先生 ペンギン先生

外側のクエリの値を参照するサブクエリのこと。さっきのEXISTSの例で「orders.user_id = users.id」と外側テーブルを参照しているのがまさに相関サブクエリ。外側の1行ごとに内側が実行されるから、行数が多いと非常に遅くなるリスクがある。JOINに書き換えるだけで劇的に速くなることもあるけど、書き換えが難しいケースもあって判断が意外と難しいんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
サブクエリって出てきたら「SQLの中に入れ子で書くSELECT文で、複雑な条件を1つのSQLで表現する方法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Subquery」 = 副(Sub)問合せ(Query)
💬 「Sub(下位の)」+「Query(問合せ)」で、クエリの中にあるクエリという意味
← 用語集にもどる