今回は サブクエリ について解説します。
サブクエリ とは、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 :これで平均を出します!
その平均と比較して欲しいデータを抽出できます
合わせてINやFROMでの使い方も見ていきましょう
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文です
外側クエリに条件やテーブルを渡せますが、複雑になるので実行処理が遅くなります
しなくてもいい時はその方が実行が早いので臨機応変で書いていきましょう
コメント