LoginSignup
1
2

More than 3 years have passed since last update.

SQL サブクエリ編

Last updated at Posted at 2019-09-14

サブクエリ

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2