初詣合格祈願SQL講座

SQL講座 複数の表の連携5

目指せ!SQL

初詣合格祈願SQL講座 複数の表の連携5

グループ化されたデータから条件にあったグループを抽出

GROUP BY句を使用した場合はWHERE句とHAVING句の2か所で抽出条件を指定することができます。この違いは、WHERE句はグループ化前のレコードに対して、抽出条件を指定します。それに対して、HAVING句はグループ化後のグループ化されたレコードに対して抽出条件を設定します。

記述形式
SELECT 列名1,列名2, 〜列名n ・・・ グループごとに結果が1つになる列や関数を記述する
FROM 表名1,表名2,〜表名n
WHERE 抽出条件 ← 抽出条件(グループ化前におこなう)
GROUP BY 列名1,列名2 ・・・ ここで指定された列の値でグループ化がおこなわれる
HAVING 抽出条件 ← 抽出条件(グループ化後におこなう)

<例題>
売上明細と商品表から売上Noごとの売上金額合計を求め、売上金額が3000以上の行を抽出する。売上金額は単価*数量で計算する。

商品表(主キー:商品コード)
商品CD商品名単価
10鉛筆30
20消しゴム50
30シャープペン250
40ボールペン150
50色鉛筆700
60ノート100

売上No日付顧客CD
12001/05/27105
22001/05/27101
32001/05/27103
42001/06/27102
52001/06/27104

売上明細(主キー:売上No,連番)
売上No連番商品CD数量
111010
12307
136025
212015
22403
31308
324030
335012
346050
412021
424021
511017
52205

顧客表(主キー:顧客CD)
顧客CD顧客名
101二島商店
102姫路商事
103大阪物産
104神戸商店
105福岡商事

SELECT 売上No,SUM(単価*数量) ← 売上Noと売上金額合計を表示
FROM 商品表, 売上明細
WHERE 商品表.商品CD=売上明細.商品CD ← 商品表の商品CDと売上明細の商品CDが一致する行を結合
GROUP BY 売上No ← 売上Noでグループ化をおこなう
HAVING SUM(単価*数量) >=3000 ← 売上金額が3000以上の行を抽出する

売上No
14550
319900
43600

商品表の単価*数量が3000以上のレコードが表示されている

例題のSQL文の実行順序は次のとおりです

  1. FROM句で指定された「商品表」と「売上明細」を読み込む
  2. WHERE句で指定した条件「商品表.商品CD=売上明細.商品CD」に基づいて、商品表の商品CDと売上明細の商品CDが一致する行を抽出する
  3. GROUP BY句で指定された「売上No」でグループ化をおこなう
  4. グループ化されたレコードからHAVING句で指定された「SUM(単価*数量) >=3000」で抽出する
  5. SELECT句で指定された「売上No」と「SUM(単価*数量)」を表示する

<例題>
売上明細と商品表から売上Noごとの売上金額合計を求め、売上金額が3000以上の行を抽出する。売上金額は単価*数量で計算する。売上金額の降順で表示する。

SELECT 売上No,SUM(単価*数量) ← 売上Noと売上金額合計を表示
FROM 商品表, 売上明細
WHERE 商品表.商品CD=売上明細.商品CD ← 商品表の商品CDと売上明細の商品CDが一致する行を結合
GROUP BY 売上No ← 売上Noでグループ化をおこなう
HAVING SUM(単価*数量) >=3000 ← 売上金額が3000以上のレコードを抽出する
ORDER BY SUM(単価*数量) DESC ← 売上金額の降順にソートする

実行結果
売上No
319900
14550
43600



初詣合格祈願SQL講座ページTOPに戻る