今回は重複排除(distinct句)と集計(group by)の紹介です。
どちらも挙動が似ているのでまとめて紹介します。
【機能説明】
・重複排除
select文の結果について、重複を排除することができる。
・集計
指定したカラムで集計を行うことができる。
(結果として重複排除もされる)
select文で集計関数を使用することができるようになる。
(該当行数を返すCOUNT関数、最大値を返すMAX関数、最小値を返すMIN関数等)
なお、having句でgroup byで集計した結果に対して条件で抽出することができる。
(where句も同じように抽出を行うが、where句は集計前に、having句は集計後に抽出する違いがある)
【文法】
・重複排除
1 |
select distinct… |
・集計
1 2 3 4 5 6 |
select… from… (where…) group by 集計を行うカラム名(,集計を行うカラム名…) (having 条件) (order by…) |
【対象テーブル例】
・ご意見
1 2 3 4 5 6 7 8 |
+--------+--------+----------+ | 店舗ID | 商品ID | ご意見 | +--------+--------+----------+ | 1 | 4 | ほげ14 | | 1 | 4 | NULL | | 1 | 5 | ほげ15 | | 3 | 2 | ほげ32 | +--------+--------+----------+ |
【使用例】
asは省略可能である。
・重複排除(distinct句)
1 2 3 4 |
select distinct 店舗ID, 商品ID from ご意見 order by 店舗ID,商品ID; |
↓
1 2 3 4 5 6 7 |
+--------+--------+ | 店舗ID | 商品ID | +--------+--------+ | 1 | 4 | | 1 | 5 | | 3 | 2 | +--------+--------+ |
※店舗ID=1、商品ID=4の行は2行存在するが、重複排除され1行のみ出力された。
・重複排除(group by句)
1 2 3 4 5 |
select 店舗ID, 商品ID from ご意見 group by 店舗ID,商品ID order by 店舗ID,商品ID; |
↓
1 2 3 4 5 6 7 |
+--------+--------+ | 店舗ID | 商品ID | +--------+--------+ | 1 | 4 | | 1 | 5 | | 3 | 2 | +--------+--------+ |
※この例のように、order by句でdistinct句と同じように重複排除を実現できる。
しかし、本来、order by句は後述の集計で使うので、重複排除のために使うのであればdistinct句の方が意図は伝わりやすい。
また、distinct句とorder by句で実行時間に差が出る場合もある。
・集計(count関数)
1 2 3 4 5 6 |
select 店舗ID, 商品ID, count(*) as ご意見件数 from ご意見 group by 店舗ID,商品ID order by 店舗ID,商品ID; |
↓
1 2 3 4 5 6 7 |
+--------+--------+------------+ | 店舗ID | 商品ID | ご意見件数 | +--------+--------+------------+ | 1 | 4 | 2 | | 1 | 5 | 1 | | 3 | 2 | 1 | +--------+--------+------------+ |
※count関数の引数にカラム名を指定すると、そのカラムがNULLではない件数を返す。
例えば、count(ご意見件数)なら、店舗ID=1、商品ID=4の行のご意見件数は1になる。
・集計(having句での抽出)
1 2 3 4 5 6 |
select 店舗ID, 商品ID from ご意見 group by 店舗ID,商品ID order by 店舗ID,商品ID having 店舗ID = 1; |
↓
1 2 3 4 5 6 |
+--------+--------+ | 店舗ID | 商品ID | +--------+--------+ | 1 | 4 | | 1 | 5 | +--------+--------+ |
いかがでしたでしょうか。
今回は、SQLでの重複排除と集計について記事を書きました。
SQLではこのような操作も簡単に書くことができます。
特に、運用作業でデータ加工する時に重宝すると思います。
次回は、SQLを入れ子で実行する副問合せ・相関副問合せについて取り上げたいと思います!
コメント