Excel関数をネストするかのようにSELECT文も同じようにネストすることが出来ます。
スカラ・サブクエリ
サブクエリでご紹介したようにサブクエリはExcel関数で言うところのネストに該当します。
まずスカラ・サブクエリを再度ご紹介します。
SQL2行目の()内のサブクエリは平均値を1つ返すスカラ・サブクエリです。
返ってきた平均値を外側のSQL文のWhere句の条件に組み合わせることで、全体の平均点より上の点数である3行が抽出されました。
では全体の平均点より上ではなく、教科ごとに平均点より上の行を抽出するにはどうした良いでしょうか?
相関サブクエリ
方法の1つとして相関サブクエリを使用する方法があります。
相関サブクエリの構文は以下のとおりです。
select * from as A where 条件式 (select 列名 from as B where A.列名 = B.列名)
相関サブクエリに取り掛かる前に、まずはそれぞれの教科の平均点を確認しておきます。
これから相関サブクエリで実現したいことは、例えば英語であれば55点以上の行を抽出する。
つまり93点の行を抽出する。
それを教科毎に判定を行い、データを抽出します。
上記を実現するSQL文は下記になります。
それぞれの教科の平均点を超えたものだけが抽出されているのがわかります。
相関サブクエリの内容
()内のサブクエリの内容を追っていきます。
相関サブクエリでは「where テーブル.列名 = サブクエリ内テーブル.列名」でデータを区切ります。
2つのテーブルの列名は同じ列を指定します。
教科ごとに平均値を算出します。
教科単位で比較するにはサブクエリ内の「where A.教科 = B.教科」を記載します。
またこの記載をすることで相関サブクエリとしての扱いになり、サブクエリがスカラ・サブクエリでなく複数の値が返ってきていても比較をすることが出来ます。
算数の2名は全体平均を下回っていますが、ちゃんと科目ごとの平均点との比較のためTRUEになっています。
相関サブクエリを利用することでWhere句で単一の値ではない複数の値(教科ごとの平均)と比較することが出来ました。