ITとdesign エンジニアのブログ by エンジ庭

IT業界のトレンドなどIT分野について学んだ事を書いていきます。プログラミング技術などについて現在Qiitaメインに書いてますので、そちらを参照ください。  https://qiita.com/kota_sho

SQL 集約と並べ替え編

2019-08-25

集約と並べ替え

 

集約関数

 

行数を数える 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句

--△ ソートに時間がかかり処理が遅くなる
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句は最後なので認識される)