ITとdesign エンジニアのブログ by エンジ庭

IT業界のトレンドなどIT分野について学んだ事を書いていきます。プログラミング技術などについて現在Qiitaメインに書いてますので、そちらを参照ください。  https://qiita.com/kota_sho

SQL サブクエリ編

2019-08-25

サブクエリは副問い合わせともいい、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;