本記事では、サブクエリについて解説します。
前回はCONCATなどの関数について解説しました。
今回では、サブクエリ(クエリの中に他のクエリを入れる)についてみていきましょう。
SQLのサブクエリとは?
サブクエリ(副問合せ)とは、クエリの中に入っているクエリのことを言います。
クエリの中でクエリを実行することで、より複雑な処理をすることが可能です。
サブクエリ(副問合せ)はWHEREの中で使うこともできますし、SELECTやFROM内で使うときもあります。
ただ、最も多いのはWHEREで使うときでしょう。
WHERE内でサブクエリを使うことで、今まではできなかった条件でレコードを絞り込むことが可能です。
SQLのサブクエリの使い方
サブクエリ(副問合せ)の具体的な使い方についてみていきましょう。
次の項目に従って解説していきます。
- サブクエリをWHEREで使う
- サブクエリをSELECTで使う
- サブクエリをHAVINGで使う
- サブクエリを使う場合の注意点
なお、今回は『SQL入門編1』で作成したテーブルを使って解説します。『SQL入門編1』で演習用のテーブルを作っていない方は、【SQL入門編1】初心者必見!SQLのクエリの書き方を学ぼうを読んで予め作成してくださいね。
サブクエリをWHEREで使う
サブクエリをWHERE句で使う方法を解説します。
まずこちらのコードをごらんください。
○コード例
SELECT TestScore FROM TEST.Student WHERE name = "渡辺";
○実行結果
このSQL文では、nameが「渡辺」の人のTestScoreを出力していますね。
こちらのSQL文を他のSQL文の中に入れてみましょう。
○コード例
SELECT name FROM TEST.Student WHERE TestScore <
(
SELECT TestScore FROM TEST.Student WHERE name = "渡辺"
)
;
○実行結果
上記のコードはサブクエリとなっています。
先程のSQL文が()の中に入っていることがおわかり頂けるでしょう。
上記のコードはTestScoreが「渡辺」のTestScoreよりも低い人のみを出力しています。
サブクエリの場合は、まず()内のSQL文が実行されます。
()内のSQL文は「50」という数値を出力します。
その後WHERE句により、TestScoreが50未満のレコードのみ抽出しています。
これがサブクエリの基本形となります。
WHERE句でサブクエリを使うことで、「他の人のTestScoreと比べてどうか?」でレコードを抽出できるようになりました。
サブクエリをSELECTで使う
サブクエリをSELECTで使う方法を解説します。
○コード例
SELECT gender,AVG(TestScore) AS 性別ごと,
(
SELECT AVG(TestScore) FROM TEST.Student
) AS 全体
FROM TEST.Student GROUP BY gender;
○実行結果
上記のコードは、性別ごとの平均点と、全体の平均点を横に並べて出力しています。
「SELECT AVG(TestScore) FROM TEST.Student」によって、全体の平均点を取得し、それを、SELECT文で全ての列に表示しています。
このように、別々の集計データを同時に出力する際も、サブクエリが便利ですね。
SELECT文でも同じようにサブクエリが使えます。
サブクエリをHAVINGで使う
最後にサブクエリをHAVINGで使う方法をみていきましょう。
HAVINGで使うのも、WHEREと基本的なやり方は一緒です。
○コード例
SELECT age,AVG(TestScore) FROM TEST.Student GROUP BY age having AVG(TestScore) >
(
SELECT AVG(TestScore) FROM TEST.Student
)
ORDER BY age
;
○実行結果
上記のコードではまず、年齢ごとのTestScoreの平均点を集計しています。
その後HAVINGによって、全体の平均よりも大きい場合のみ絞り込んでいます。
「SELECT AVG(TestScore) FROM TEST.Student」によって、全体の平均点を算出し、HAVINGによって、年齢ごとの平均点と比較しています。
このように、HAVING内でもサブクエリは使えます。
サブクエリを使う場合の注意点
サブクエリを使うにあたって注意点がいくつかあります。
それは、サブクエリの方のSQLには「;」を付ける必要はないということです。
上記のSQL文にも「;」はついていません。
ただし、サブクエリではない方のSQLには必ず「;」を付けないといけません。
まとめ
本記事では、サブクエリついて解説しました。
サブクエリによって高度な処理ができることが、お分かり頂けたかと思います。
SQL文の中でSQL文を使うのは慣れないと難しいかもしれませんが、使い慣れると便利なものです。
次回は、UNIONを解説していきます。