読者です 読者をやめる 読者になる 読者になる

Blank?=False

「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々

SQL ゼロから始めるデータベース操作 第3章 集約と並び替え その1

今回から、途中ですが「SQL ゼロから始めるデータベース操作」を勉強した結果をまとめていきます。
なお、書籍ではPostgreSQLを使っていますが、本ブログではMySQLを使用しています。
SQLをしっかり体系的に学んだことはないので、今後Web系などでデータベースと通信する
ソフトウェアの案件が増えてくる前にしっかりと基本を捉えていきます。

CD付 SQL ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

CD付 SQL ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

集約と並び替えとは?

テーブルの各レコードを集計、またはグループ化して抽出を行うこと。 日本語で説明する場合、グループ化は〜ごとに集計する、などと表現する。

集約関数

集約関数は1つのフィールドを対象に様々な計算を行う。

すべてのレコード数を取得

 mysql> SELECT COUNT(*) FROM footbl;

Col1フィールドの最大レコード

mysql> SELECT MAX(Col1) FROM footbl;

Col1フィールドの最小レコード

mysql> SELECT MIN(Col1) FROM footbl;

Col1フィールドの各値の合計

mysql> SELECT SUM(Col1) FROM footbl;

Col1フィールドの各値の平均値

mysql> SELECT AVG(Col1) FROM footbl;

実例

例として、以下のようなfooテーブルがあるとする。 id0003のNAMEはNULL値としている。 NULL値の表記は、RDBMSによって異なり、MySQLはNULLと表示される。

mysql> SELECT * FROM foo;
+------+------+
| id   | Name |
+------+------+
| 0001 | Bar  |
| 0002 | Baz  |
| 0003 | NULL |
+------+------+

COUNT(*), COUNT(id), COUNT(NAME)でレコードの個数を数えてみると、

mysql> SELECT Count(*), Count(id),Count(Name) FROM foo;
+----------+-----------+-------------+
| Count(*) | Count(id) | Count(Name) |
+----------+-----------+-------------+
|        3 |         3 |           2 |
+----------+-----------+-------------+


*及びidでは、結果が3になる事に対し、Nameでは2となる。
これは、Nameで実際に入力されているレコードはBar,Bazの2つのレコードのため。
NULLの場合の処理は各集約関数によって異なるため、それぞれの集約関数の動作を把握する必要がある。


他の集約関数でも、NULLに関しては特性がある。
さきほどのfooテーブルにVALUEフィールドを追加した。

mysql> SELECT * FROM foo;
+------+------+-------+
| id   | Name | VALUE |
+------+------+-------+
| 0001 | Bar  |    10 |
| 0002 | Baz  |  NULL |
| 0003 | NULL |    30 |
+------+------+-------+


このテーブルに対し、SUM関数,AVG関数を使ってみる。

mysql> SELECT SUM(VALUE), AVG(VALUE) FROM foo;
+------------+------------+
| SUM(VALUE) | AVG(VALUE) |
+------------+------------+
|         40 |    20.0000 |
+------------+------------+


SUM関数ではNULLのレコードは除いて集計され、10+30で40となる。
AVG関数では10+30の結果40に対し、有効なレコード数2で割るため、20となる。
ただ、総レコード数(ここでは3)での平均値を算出したいこともある。
その場合、COALESCE(コアレス)関数でNULLを0に変換してしまえばいい。

mysql> SELECT SUM(VALUE), AVG(COALESCE(VALUE, 0)) FROM foo;
+------------+-------------------------+
| SUM(VALUE) | AVG(COALESCE(VALUE, 0)) |
+------------+-------------------------+
|         40 |                 13.3333 |
+------------+-------------------------+