サブクエリ
サブクエリは副問い合わせともいい、SELECT文をネストして欲しいデータを探します。
下記では、FROMの後に、さらにSELECT文を使っています。
順番としてはまず()内のサブクエリが実行され、その後1行目のSELECT文が実行されます。FROMで参照したいテーブル内容をさらにSELECT文で探してきているということです。
例1
SELECT shohin_bunrui, cnt_shohin
FROM (SELECT shohin_bunrui, COUNT(*) AS cnt_shohin
FROM Shohin
GROUP BY shohin_bunrui) AS Shohinsum;
例2
サブクエリを使わない場合、「一度SELECT文で出金額を出して、それをもう一回SELECT文書いて使う」と二度手間になってしまいます。
SELECT MAX(出金額)
FROM 家計簿;
SELECT 費目, 出金額
FROM 家計簿
WHERE 出金額 = [メモしておいた金額]
↓
サブクエリ使うと、以下のように1つのSQL文で済みます。出金額については()で
MAX額を計算して「出金額」を取得しています。
SELECT 費目, 出金額
FROM 出金額 = (SELECT MAX(出金額)
FROM 家計簿) AS 出金額
サブクエリの3つのパターン
1、単一の値の代わりとして、サブクエリの検索結果を用いる
2、複数の値の代わりとして、サブクエリの検索結果を用いる
3、表のの値の代わりとして、サブクエリの検索結果を用いる
1、単一行サブクエリ
・検索結果が1行1列の値になる。
・SELECT文の選択リストやFROM句、UPDATEのSET句、また1つの値との判定を行うWHERE句の条件式などに使える
SET句
UPDATE 家計簿集計
SET 平均 = (SELECT AVG(出金額)
FROM 家計簿アーカイブ
WHERE 出金額 > 0
AND 費目 = '食費')
WHERE 費目 = '食費';
選択リスト
SELECT 日付, メモ, 出金額,
(SELECT 合計
FROM 家計簿集計
WHERE 費目 = '食費') AS 過去の合計額
FROM 家計簿アーカイブ
WHERE 費目 = '食費'
2、複数行サブクエリ
・検索結果がn行1列の複数の値となる(nは1以上)
・複数の値との判定を行うWHERE句の条件式や、SELECT文のFROM句に記述できる
INを利用
SELECT *
FROM 家計簿
WHERE 費目 IN ('食費', '水道光熱費', '給料');
または以下のようにすることも可能
SELECT *
FROM 家計簿
WHERE 費目 IN (SELECT DISTINCT 費目 FROM 家計簿);
ANYを利用
SELECT *
FROM 費目 = '食費'
AND 出金額 < ANY (SELECT 出金額
FROM 家計簿アーカイブ
WHERE 費目 = '食費');
NULLを除外したい
SELECT *
FROM 家計簿アーカイブ
WHERE 費目 (SELECT 費目 FROM 家計簿
WHERE 費目 IS NOT NULL);
3、表形式
・検索結果がn行n列の表となる(n、mは1以上)
・SELECT文のFROM句やINSERT文などに記述できる
SELECT SUM(SUB, 出金額) AS 出金額合計
FROM (SELECT 日付, 費目, 出金額
FROM 家計簿
UNION
SELECT 日付, 費目, 出金額
FROM 家計簿アーカイブ
WHERE 日付 >= '2018-01-01'
AND 日付 <= '2018-01-31') AS SUB;