技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

情報処理技術者試験対策「SQL(重複排除と集計)」

今回は重複排除(distinct句)と集計(group by)の紹介です。
どちらも挙動が似ているのでまとめて紹介します。
実務で使うだけでなく、どちらも試験頻出です。
 
【機能説明】
・重複排除
 select文の結果について、重複を排除することができる。
 
・集計
 指定したカラムで集計を行うことができる。
 (結果として重複排除もされる)
 select文で集計関数を使用することができるようになる。
 (該当行数を返すCOUNT関数、最大値を返すMAX関数、最小値を返すMIN関数等)
 なお、having句でgroup byで集計した結果に対して条件で抽出することができる。
 (where句も同じように抽出を行うが、
  where句は集計前に、having句は集計後に抽出する違いがある)
 
【文法】
・重複排除
 select distinct…
 
・集計
 select…
 from…
 (where…)
 group by 集計を行うカラム名(,集計を行うカラム名…)
 (having 条件)
 (order by…)
 
【対象テーブル例】
・ご意見
  +--------+--------+----------+
  | 店舗ID | 商品ID | ご意見   |
  +--------+--------+----------+
  | 1      | 4      | ほげ14 |
  | 1      | 4      | NULL     |
  | 1      | 5      | ほげ15 |
  | 3      | 2      | ほげ32 |
  +--------+--------+----------+
 
【使用例】
asは省略可能である。

・重複排除(distinct句)
select distinct 店舗ID,
                商品ID
from            ご意見
order by        店舗ID,商品ID;

  +--------+--------+
  | 店舗ID | 商品ID |
  +--------+--------+
  | 1      | 4      |
  | 1      | 5      |
  | 3      | 2      |
  +--------+--------+
 ※店舗ID=1、商品ID=4の行は2行存在するが、重複排除され1行のみ出力された。
 
・重複排除(group by句)
select   店舗ID,
         商品ID
from     ご意見
group by 店舗ID,商品ID
order by 店舗ID,商品ID;

  +--------+--------+
  | 店舗ID | 商品ID |
  +--------+--------+
  | 1      | 4      |
  | 1      | 5      |
  | 3      | 2      |
  +--------+--------+
 ※distinct句とorder by句のどちらで重複排除すべきか下記ページで考察されている。
  重複行のまとめ方はGROUP BY?DISTINCT? - Qiita
  https://qiita.com/tori076/items/ef7ac4301f9c20491bae


 
・集計(count関数)
select   店舗ID,
         商品ID,
         count(*) as ご意見件数
from     ご意見
group by 店舗ID,商品ID
order by 店舗ID,商品ID;

  +--------+--------+------------+
  | 店舗ID | 商品ID | ご意見件数 |
  +--------+--------+------------+
  | 1      | 4      | 2          |
  | 1      | 5      | 1          |
  | 3      | 2      | 1          |
  +--------+--------+------------+
 ※count関数の引数にカラム名を指定すると、そのカラムがNULLではない件数を返す。
  例えば、count(ご意見件数)なら、店舗ID=1、商品ID=4の行のご意見件数は1になる。
 
・集計(having句での抽出)
select   店舗ID,
         商品ID
from     ご意見
group by 店舗ID,商品ID
order by 店舗ID,商品ID
having   店舗ID = 1;

  +--------+--------+
  | 店舗ID | 商品ID |
  +--------+--------+
  | 1      | 4      |
  | 1      | 5      |
  +--------+--------+

 
---------------------
目次

https://1drv.ms/b/s!AivF3bzWXOzuhG1Xk5hscKYqkLkM