MariaDB(MySQL)の生態系に迫る!第3回:集約関数に慣れてみる

スポンサーリンク
DB
スポンサーリンク

==== スタジオ ====

「「「 インターネッツ!!大海原! 」」」♪♪

ジャッカル
ジャッカル

皆さんこんばんは。ディスカバリーチャンネル「インターネッツ!大海原!!」

MCを務めるのは毎度おなじみジャッカルと、

ジェシー
ジェシー

ジェシーよ~♪

インターネットという大海に生息する高度な精度を誇るOSSにクローズアップし、どんなものなのかを触れ合うことで理解するシリーズ、それが「インターネッツ!!大海原!」。

MariaDB(MySQL)シリーズ第3回目です。

前回ではMariaDBにMySQLのサンプルデータを入れて少しSQLを触ってみました。

前回までの記事のリンクは一番下に一覧で載せてあります。

今回は集約関数に触れてみて、そして慣れるところまで行きたいなー、なんて思ってます。

ジェシー
ジェシー

現地と中継がつながっているわ~

現場の現地スタッフー!お願いねーーー!!!

==== 現地 =====

現地スタッフ兼ナレーション
現地スタッフ兼ナレーション

はーい。ジェーシー、ここからは私が引き取るよー

現地スタッフ兼ナレーション
現地スタッフ兼ナレーション

おっと、いましたね。野生のMariaDBです。早速近づいて見てみましょう

まずは入ります。

$ sudo mysql -u root

そして、テーブルを指定します。

MariaDB [(none)]> USE world;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [world]>

集約関数

COUNT

MariaDB [world]> SELECT COUNT(Name) FROM city;
+-------------+
| COUNT(Name) |
+-------------+
|        4079 |
+-------------+

SUM

MariaDB [world]> SELECT SUM(Population) FROM city;
+-----------------+
| SUM(Population) |
+-----------------+
|      1429559884 |
+-----------------+

なんか少ないですね。。。14億人です。

このテーブルTokyoの人口798万人だったんすよね。。。いつの値をとってきたのか。。。

他にも平均値を求めるAVE関数や最大値を求めるMAX関数や最小値を求めるMIN関数などあるので試してみてください。

DISTINCT(重複しているものを外す)

元のテーブルのレコードを見ると以下のようにAFGが複数、NLDが複数…というように一つの国(CountryCode)に対して複数の都市名が記録されていることが分かります。

MariaDB [world]> SELECT * FROM city;
+------+------------------------------------+-------------+------------------------+------------+
| ID   | Name                               | CountryCode | District               | Population |
+------+------------------------------------+-------------+------------------------+------------+
|    1 | Kabul                              | AFG         | Kabol                  |    1780000 |
|    2 | Qandahar                           | AFG         | Qandahar               |     237500 |
|    3 | Herat                              | AFG         | Herat                  |     186800 |
|    4 | Mazar-e-Sharif                     | AFG         | Balkh                  |     127800 |
|    5 | Amsterdam                          | NLD         | Noord-Holland          |     731200 |
|    6 | Rotterdam                          | NLD         | Zuid-Holland           |     593321 |
|    7 | Haag                               | NLD         | Zuid-Holland           |     440900 |
|    8 | Utrecht                            | NLD         | Utrecht                |     234323 |
|    9 | Eindhoven                          | NLD         | Noord-Brabant          |     201843 |
|   10 | Tilburg                            | NLD         | Noord-Brabant          |     193238 |
|   11 | Groningen                          | NLD         | Groningen              |     172701 |
|   12 | Breda                              | NLD         | Noord-Brabant          |     160398 |
|   13 | Apeldoorn                          | NLD         | Gelderland             |     153491 |
|   14 | Nijmegen                           | NLD         | Gelderland             |     152463 |
|   15 | Enschede                           | NLD         | Overijssel             |     149544 |
|   16 | Haarlem                            | NLD         | Noord-Holland          |     148772 |
|   17 | Almere                             | NLD         | Flevoland              |     142465 |
|   18 | Arnhem                             | NLD         | Gelderland             |     138020 |
|   19 | Zaanstad                           | NLD         | Noord-Holland          |     135621 |

つまり上記でいうとKabul, Qandaha, HeratはCountryCodeにおいてAFGとして重複しています。

この重複を除くのがDISTINCTです。

以下の処理ではCountryCodeで重複しているものを除いてCOUNTしてくれっていう指示をSQLで実施しているためCountryCodeの種類のカウント数が出力されています。

MariaDB [world]> SELECT COUNT(DISTINCT CountryCode) FROM city;
+-----------------------------+
| COUNT(DISTINCT CountryCode) |
+-----------------------------+
|                         232 |
+-----------------------------+

GROUP BY

テーブルを幾つかのグループに切り分けて集約してみます。「●●ごと」という分け方をしてみることです。この時使うのがGPOUP BYになります。

上記のDISTINCTのところでCountryCodeの全種類数を表示しました。

今回はCountryCodeの種類ごとにカウントを行いたいと思います。以下のようにSQLをうってみてください。するとContryCodeごとのカウント数が表示されます。

MariaDB [world]> SELECT CountryCode, COUNT(*) FROM city GROUP BY CountryCode;
+-------------+----------+
| CountryCode | COUNT(*) |
+-------------+----------+
| ABW         |        1 |
| AFG         |        4 |
| AGO         |        5 |
| AIA         |        2 |
| ALB         |        1 |
| AND         |        1 |
| ANT         |        1 |
| ARE         |        5 |
| ARG         |       57 |
| ARM         |        3 |
| ASM         |        2 |
| ATG         |        1 |
| AUS         |       14 |
| AUT         |        6 |
| AZE         |        4 |
| BDI         |        1 |
| BEL         |        9 |
| BEN         |        4 |
| BFA         |        3 |
| BGD         |       24 |
| BGR         |       10 |
| BHR         |        1 |
| BHS         |        1 |
| BIH         |        3 |
| BLR         |       16 |
| BLZ         |        2 |
・・・【略】・・・

HAVING句

上記GROUP BY句によってグループ分けした結果を表示しました。

そのグループに対してさらに条件制限を与えることができます。

この時使うのがHAVING句です。

ここで注意なのがグループ分けした結果に対する条件指定でWHERE句は使えません。WHERE句はあくまでレコードに対してのみ有効だからです。

では上記のGROUP BYで試したグループ分けした結果にさらに条件指定してみましょう。

上記のGROUP BYのSQLに対してさらにCOUNT数が3個以上のものを表示するように制限をかけてみます。

以下のようにSQLをうってみましょう。上記のGROUP BYのSQLに「HAVING COUNT(*) >= 3」を加えただけです。するとCOUNT数が3個以上のものが表示されました。

MariaDB [world]> SELECT CountryCode, COUNT(*) FROM city GROUP BY CountryCode HAVING COUNT(*) >= 3;
+-------------+----------+
| CountryCode | COUNT(*) |
+-------------+----------+
| AFG         |        4 |
| AGO         |        5 |
| ARE         |        5 |
| ARG         |       57 |
| ARM         |        3 |
| AUS         |       14 |
| AUT         |        6 |
| AZE         |        4 |
| BEL         |        9 |
| BEN         |        4 |
| BFA         |        3 |
| BGD         |       24 |
| BGR         |       10 |
| BIH         |        3 |
| BLR         |       16 |
| BOL         |        8 |
| BRA         |      250 |
| CAN         |       49 |
| CHE         |        5 |
| CHL         |       29 |
| CHN         |      363 |
| CIV         |        5 |
| CMR         |        7 |
| COD         |       18 |
| COL         |       38 |
| CUB         |       14 |
| CZE         |       10 |

まとめ

はい、今回は集約関数を軽く触れてみました。

触れてみる事で理解が深まるのでぜひ実際にSQLをうってみて表示されたものをみて納得するという流れが大事ですね。

ジェーシーとジャッカル、なんかオープニング挨拶だけになっちまったな。。。

なんかもっと登場させたいですよね!ここら辺も気を付けて次は記事を書いていきたいです。

過去のMariaDBの記事

第1回
https://apao-m-appare99999.com/?p=435
第2回
https://apao-m-appare99999.com/?p=494

参考:「SQL 第2版 ゼロからはじめるデータベース操作」

タイトルとURLをコピーしました