集約と並べ替え
集約関数
行数を数える COUNT関数
SELECT COUNT(引数)
FROM テーブル名
全行数えるなら(*)を利用。
SELECT COUNT(*)
FROM shohin;
NULLの行を除外したい場合、対象とする列を限定して引数に書く。
SELECT COUNT(shiire_tanka)
FROM Shohin;
合計を求める SUM関数
NULLがあった場合、無視されますので影響ありません。
SELECT SUM(hanbai_tanka), SUM(shiire_tanka)
FROM Shohin;
平均値を求める AVG関数
SUM関数と同様、NULLは含まれません。
300, 500, NULLの場合、(300 + 500) / 2 = 400となります。
SELECT AVG(hanbai_tanka)
FROM Shohin;
最大値・最小値を求める MAX関数・MIN関数
SELECT MAX(hanbai_tanka), MIN(shiire_tanka)
FROM Shohin;
グループ分けする GROUP BY句
SELECT 列名1, 列名2, 列名3
FROM テーブル名
GROU BY 列名1, 列名2, 列名3
グループ分けして、そのグループごとに計算して表示することができます。
下記、shohin_bunruiごとに行数を数えます。
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui;
例えば、shohin_bunruiに衣服、事務用品、キッチン用品があった場合、それぞれ何行あるかを計算して表示できます。
shohin_bunrui count
衣服 2
事務用品 4
キッチン用品 5
WHERE句で条件を指定できます。
SELECT shiire_tanka, COUNT(*)
FROM Shohin
WHERE shohin_bunrui = '衣服'
GROUP BY shiire_tanka;
NULLがあった場合、NULLとして1つのグループに分類されます。
注意1:
GROUP BYでSELECT分に書けるのは、
・定数
・集約関数
・GROUP BY句で指定した列名(つまり集約キー)
注意2:
GROUP BY句に列の別名(AS)はつけれない
注意3:
GROUP BY句を使って結果を選択した時、表示される結果の順番はランダム
注意4:
GROUP BY句のGROUP BYリストに使用される式内では集計、またはサブクエリは使えない
集約した結果に条件を指定する HAVING句
GROUP BYを使って集約した際、更に条件を指定して絞り込みたい時はHAVING句を使います。
SELECT 列名1, 列名2, 列名3
FROM テーブル名
GROU BY 列名1, 列名2, 列名3
HAVING グループの値に対する条件
shohin_bunruiごとに集約をし、集約された値に対し更に2500(円)以上のもののみ取得するという条件をつけると
SELECT shohin_bunrui, AVG(hanbai_tanka)
FROM Shohin
GROUP BY shohin_bunrui
HAVING AVG(hanbai_tanka) >= 2500;
WHERE と HAVINGについて
「集約キーに対する条件」は WHERE句、HAVING句それぞれに書くことはできますが、その違いは何なのか。取得できる結果は同じですが、集約キーに対する条件はソートに掛かる時間の関係上WHERE句に書く方がいいそうです。
WHERE句
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
WHERE shohin_bunrui = '衣服'
GROUP BY shohin_bunrui;
HAVING句
--△ ソートに時間がかかり処理が遅くなる
```sql
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui
HAVING shohin_bunrui = '衣服';
注意:
集計がHAVING句または選択リスト内にある場合、及び集計する列が外部参照の場合にだけWHERE句に集計を含めることができる。
検索結果を並べ替える ORDER BY句
ASC: 昇順(小さい順)
DESC: 降順(大きい順)
※指定しなければ自動的にASCになる
ORDER BY句は最後に書きます。
SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM shohin
ORDER BY hanbai_tanka;
--何も指定しなければASC(昇順:小さい順)
・NULLを含む列は先頭または末尾にまとめられて表示されます。
・GROUP BYと違い列の別名が使える
(処理の順番的にGROUP BYの時はまだ別名が認識されていないがORDER BY句は最後なので認識される)