以下の書籍でSQLを基礎から学び直したので、ちゃんと理解せずに使っちゃってたなと思った部分をまとめます。
https://amzn.asia/d/8RJlRP4
項目
- サブクエリ
サブクエリについて
サブクエリ
サブクエリは「使い捨てのビュー」のようなものです。
※ビューはよく使うSELECT文を保存しておき、実際にあるテーブルと同じようにVIEW名で使えるようにしたもの。
select A, B from view_name
サブクエリはビューをそのままFROM句に持ち込むような形で表現します。
SELECT
shohin_category,
count
FROM (
// FROM句の中でSELECTを使用する
SELECT
shohin_category,
COUNT(*) AS count
FROM
shohin
GROUP BY
shohin_category
);
このように入れ子構造にしてSELECT文を作ることができます。
このSQLではまずFROM句の中のSELECTが実行され、その後に外側のSELECT文が実行される、という順序になっています。
スカラ・サブクエリ
「スカラ」とは「単一の」という意味で、その名の通り、必ず1行だけの戻り値を返すという制約をつけたサブクエリのことです。
// 販売単価が全体の販売単価の平均よりも高い商品を抽出する
SELECT
*,
FROM
shohin
WHERE
hanbai_tanka > (SELCT AVG(hanbai_tanka) FROM shohin);
スカラ・サブクエリは単一の結果しか返さないので、上記のようにFROM句以外の場所でも使うことができます。
相関サブクエリ
相関サブクエリはテーブル全体ではなく、テーブルの一部のレコード集合に限定した比較をしたい時に使います。
// 商品カテゴリごとに商品の平均販売単価を出して、それよりも販売単価が高い商品を抽出する
SELECT
*
FROM
shohin AS s1
WHERE
hanbai_tanka > (
SELECT
AVG(hanbai_tanka)
FROM
shohin AS s2
WHERE
s1.shohin_category = s2.shohin_category
);
それぞれの商品カテゴリのなかで平均販売単価が計算され、それが商品テーブルの各レコードと比較されるため、相関サブクエリはレコードに対して実質的に1行しか返していない、とみなされます。