【サブクエリについて】

今回は サブクエリ について解説します。

サブクエリ とは、SQL文の中に書かれる別のSELECT文 のことです。
外側のクエリ(メインクエリ)に値やテーブルを渡す役割を持ち、条件式や集計の一部として使われます。

例えば、あるテーブルから平均以上のデータのみを抽出したい時
一度平均を出して、その後にその平均以上で抽出するのは面倒ですね
サブクエリを使えば一度で抽出することができます

早速ですが以下のデータからその抽出をしてみましょう

データ(purchases )

購入ID 購入者名 金額 カテゴリ
1 A 60000 家電
2 B 40000 衣類
3 C 55000 家電
4 D 30000 食品
5 A 15000 食品
6 B 25000 家電

コード

SELECT 購入ID, 購入者名, 金額
FROM purchases
WHERE 金額 > (
  SELECT AVG(金額) 
  FROM purchases
);

【実行結果】

購入ID 購入者名 金額
1 A 60000
3 C 55000

【解説】
SELECT文を()の中、コードの途中で使います
SELECT AVG(金額) FROM purchases :これで平均を出します!
その平均と比較して欲しいデータを抽出できます

合わせてINFROMでの使い方も見ていきましょう

INのサブクエリ

SELECT 購入ID, 購入者名, 金額, カテゴリ
FROM purchases
WHERE 購入者名 IN (
  SELECT DISTINCT 購入者名
  FROM purchases
  WHERE カテゴリ = '家電'
);

【実行結果】

購入ID 購入者名 金額 カテゴリ
1 A 60000 家電
3 C 55000 家電
5 A 15000 食品
6 B 25000 家電

【解説】
今回は家電カテゴリで購入した人の全購入履歴の表示をします
DISTINCTは重複するもを除いて表示する関数ですが今回はなくても変わりません
サブクエリの中は(A, C, B)となるのでそこからIN取り出します

FROMのサブクエリ

SELECT 購入者名, SUM(金額) AS 合計金額
FROM purchases
GROUP BY 購入者名
HAVING SUM(金額) >= (
  SELECT AVG(合計)
  FROM (
    SELECT SUM(金額) AS 合計
       FROM purchases
       GROUP BY 購入者名
  ) AS t
)
ORDER BY 合計金額 DESC;

【実行結果】

購入者名 合計金額
A 75000
C 55000

【解説】
一つずつ見てみましょう

SELECT SUM(金額) AS 合計 FROM purchases GROUP BY 購入者名
SELECT AVG(合計) FROM(①) AS t
SELECT 購入者名, SUM(金額) AS 合計金額 FROM purchases GROUP BY 購入者名 HAVING SUM(金額) >= (③)

①:購入者ごとの合計を出します
②:その合計のテーブルから平均を出します、つまり購入者の購入合計額平均ですね
③:②の購入者ごとの購入合計額平均よりも高い方を抽出します、そしてそれを高い順に並び替えします

FROMでサブクエリを使うことで、価格の平均ではなく購入者の購入データの平均を出すことができます
実際にも一つ踏み込んで抽出できるので使えると便利です!

【まとめ】
サブクエリはSQL文の中に書く別のSELECT文です
外側クエリに条件やテーブルを渡せますが、複雑になるので実行処理が遅くなります
しなくてもいい時はその方が実行が早いので臨機応変で書いていきましょう

コメント

タイトルとURLをコピーしました