💭

SQL ~ゼロからはじめるデータベース操作~ を読んで【④】

2024/05/01に公開

前回の続き。
https://zenn.dev/db_engineer/articles/eb23580efc14c0

第3章 テーブルを集約して検索する

・集約関数

テーブル内のカラムの合計や平均などの集計操作に集約関数を使用します。

集約関数 用途
COUNT テーブルのレコード数(行数)を数える
SUM テーブルの数値列のデータを合計する
AVG テーブルの数値列のデータを平均する
MAX テーブルの任意の列のデータの最大値を求める
MIN テーブルの任意の列のデータの最小値を求める
DISTINCT 重複値を除外する
shop=# -- COUNTを利用して、テーブルのレコード数を検索
shop=# SELECT COUNT(*) FROM Shohin;
 count
-------
     8
(1 row)

shop=#
shop=# -- 仕入単価のレコード数を検索(NULL値はレコード数から除外される)
shop=# SELECT COUNT(shiire_tanka) FROM Shohin;
 count
-------
     6
(1 row)

shop=#
shop=# -- 販売単価と仕入単価、それぞれの合計を計算(NULL値は計算から除外される)
shop=# SELECT SUM(hanbai_tanka), SUM(shiire_tanka) FROM Shohin;
  sum  |  sum
-------+-------
 16780 | 12210
(1 row)

shop=#
shop=# -- 販売単価と仕入単価の平均値を計算(NULL値は計算から除外される、分母値含めて)
shop=# SELECT AVG(hanbai_tanka), AVG(shiire_tanka) FROM Shohin;
          avg          |          avg
-----------------------+-----------------------
 2097.5000000000000000 | 2035.0000000000000000
(1 row)

shop=#
shop=# -- 販売単価の最大値と最小値を検索
shop=# SELECT MAX(hanbai_tanka), MIN(hanbai_tanka) FROM Shohin;
 max  | min
------+-----
 6800 | 100
(1 row)

shop=#
shop=# -- 登録日の最大値と最小値を検索
shop=# SELECT MAX(torokubi), MIN(torokubi) FROM Shohin;
    max     |    min
------------+------------
 2009-11-11 | 2008-04-28
(1 row)

shop=#
shop=# -- 商品分類の種類数を検索(DISTINCTで重複を除外)
shop=# SELECT COUNT(shohin_bunrui), COUNT(DISTINCT shohin_bunrui) FROM Shohin;
 count | count
-------+-------
     8 |     3
(1 row)

shop=#

・グループ切り分け

テーブルをグループ分けする際にGROUP BY句を使用します。

shop=# --商品分類毎にグループ分け
shop=# SELECT shohin_bunrui FROM Shohin GROUP BY shohin_bunrui;
 shohin_bunrui
---------------
 キッチン用品
 衣服
 事務用品
(3 rows)

shop=#
shop=# -- 仕入単価毎の行数
shop=# SELECT shiire_tanka, COUNT(*) FROM Shohin GROUP BY shiire_tanka;
 shiire_tanka | count
--------------+-------
              |     2      <= NULL値もカウントされる
          320 |     1
          500 |     1
         2800 |     2
         5000 |     1
          790 |     1
(6 rows)

shop=#
shop=# -- 商品分類がキッチン用品の登録日の行数
shop=# SELECT torokubi, COUNT(*) FROM Shohin WHERE shohin_bunrui = 'キッチン用品' GROUP BY torokubi;
  torokubi  | count
------------+-------
 2008-04-28 |     1
 2009-01-15 |     1
 2009-09-20 |     2
(3 rows)

shop=#

・グループへの条件指定

グループ分けした結果に対して条件を指定する場合はHAVING句を使用します。

shop=# -- 商品分類がキッチン用品の登録日の行数が1行
shop=# SELECT torokubi, COUNT(*) FROM Shohin WHERE shohin_bunrui = 'キッチン用品' GROUP BY torokubi HAVING COUNT(*) = 1;
  torokubi  | count
------------+-------
 2008-04-28 |     1
 2009-01-15 |     1
                <= 先ほど登録日2009-09-202行が除外される
(2 rows)

shop=#

・検索結果の並び替え

SELECT文で検索の出力結果を並び替える場合はORDER BY句を使用します。
ORDER BY句で指定する列は、別名で「ソートキー」とも呼ばれます。

shop=# -- 販売単価を昇順で並べる(昇順:ASC)※指定なければ自動的に昇順
shop=# SELECT shohin_id, shohin_mei, hanbai_tanka FROM Shohin ORDER BY hanbai_tanka ASC;
 shohin_id |   shohin_mei   | hanbai_tanka
-----------+----------------+--------------
 0008      | ボールペン     |          100
 0006      | フォーク       |          500
 0002      | 穴あけパンチ   |          500
 0007      | おろしがね     |          880
 0001      | Tシャツ        |         1000
 0004      | 包丁           |         3000
 0003      | カッターシャツ |         4000
 0005      | 圧力鍋         |         6800
(8 rows)

shop=#
shop=# -- 販売単価を降順で並べる(降順:DESC)
shop=# SELECT shohin_id, shohin_mei, hanbai_tanka FROM Shohin ORDER BY hanbai_tanka DESC;
 shohin_id |   shohin_mei   | hanbai_tanka
-----------+----------------+--------------
 0005      | 圧力鍋         |         6800
 0003      | カッターシャツ |         4000
 0004      | 包丁           |         3000
 0001      | Tシャツ        |         1000
 0007      | おろしがね     |          880
 0002      | 穴あけパンチ   |          500
 0006      | フォーク       |          500
 0008      | ボールペン     |          100
(8 rows)

shop=#
shop=# -- 仕入単価を昇順で並べる
shop=# SELECT shohin_id, shohin_mei, shiire_tanka FROM Shohin ORDER BY shiire_tanka;
 shohin_id |   shohin_mei   | shiire_tanka
-----------+----------------+--------------
 0002      | 穴あけパンチ   |          320
 0001      | Tシャツ        |          500
 0007      | おろしがね     |          790
 0003      | カッターシャツ |         2800
 0004      | 包丁           |         2800
 0005      | 圧力鍋         |         5000
 0006      | フォーク       |            <= NULL値は順序から除外される
 0008      | ボールペン     |
(8 rows)

shop=#

shop=# -- 仕入単価を昇順で並べる(列の別名:ASの使用)
shop=# SELECT shohin_id, shohin_mei, shiire_tanka AS "仕入単価" FROM Shohin ORDER BY shiire_tanka;
 shohin_id |   shohin_mei   | 仕入単価
-----------+----------------+----------
 0002      | 穴あけパンチ   |      320
 0001      | Tシャツ        |      500
 0007      | おろしがね     |      790
 0003      | カッターシャツ |     2800
 0004      | 包丁           |     2800
 0005      | 圧力鍋         |     5000
 0006      | フォーク       |
 0008      | ボールペン     |
(8 rows)

shop=#

書評

SELECT文を使用して、データの修正操作を実行するコマンドを学んだ。
複数の条件を組み合わせたり、句の順番でルールが定義されていたりと少しずつ複雑な感じになってきた。

Discussion