前回の記事に続き、サンプルデータベースworldを使って、いろいろなSQLを実行してみましょう。なお、worldに格納される表やその構造については、前回の記事に記載しておりますので、そちらを参照してください。
アジア大陸の人口の合計を求める
SELECT SUM(Population) FROM country WHERE Continent = 'Asia';
SUM(Population) 3705025700
さて前回までの検索でアジアの人口の多さが際立っていることが見えてきたのではないでしょうか。アジア大陸の国の総人口や平均を求めるような場合は集約関数を使用します。今回は、合計を示すSUM関数を使って、アジア大陸の全ての国の人口の合計を求めています。3兆7億人という途方もない数が表示されました。
日本の都市の人口の最小値を求める
SELECT MIN(Population) FROM city WHERE CountryCode = 'JPN';
MIN(Population)
91170
再び、日本国内に目を向け、日本の都市の人口の最小値を求めてみます。結果、約9万人が最小となりました。では、それはどの都市なのでしょうか。どのようにSQLを書けば求められるのか、一度考えて確かめて見てください。
大陸ごとの国数を求める
SELECT Continent,COUNT(*) FROM country GROUP BY Continent;
| Continent | COUNT(*) |
|---|---|
| North America | 37 |
| Asia | 51 |
| Africa | 58 |
| Europe | 46 |
| South America | 14 |
| Oceania | 28 |
| Antarctica | 5 |
ここで新しくGROUP BY句が出てきました。GROUP BY句は、抽出された行を、指定された列の値が同じ行ごとにグループ化するために使用されます。上記のように記述するれば、大陸ごとの国数を求められます。
大陸ごとの人口と全大陸の合計人口を求める
SELECT Continent, SUM(Population) FROM country GROUP BY Continent WITH ROLLUP;
| Continent | SUM(Population) |
|---|---|
| Asia | 3705025700 |
| Europe | 730074600 |
| North America | 482993000 |
| Africa | 784475000 |
| Oceania | 30401150 |
| Antarctica | 0 |
| South America | 345780000 |
| NULL | 6078749450 |
同じように、GROUP BY句により、大陸ごとにグループ化し、それぞれの人口の合計を求めています。
WITH ROLLUPで合計行を取得できます。最後のNULLがWITH ROLLUPで取得した値であり、全大陸の合計を示しています。
大陸ごとに人口を集計し、2億人以上の大陸を人口の多い順に並べる
SELECT Continent, SUM(Population) AS TotalPop FROM country GROUP BY Continent HAVING TotalPop >= 200000000 ORDER BY TotalPop DESC;
| Continent | TotalPop |
|---|---|
| Asia | 3705025700 |
| Africa | 784475000 |
| Europe | 730074600 |
| North America | 482993000 |
| South America | 345780000 |
最後に、大陸ごとに人口を集計し、2億人以上の大陸を人口の多い順に並べてみましょう。HAVING句には、GROUP BY句によってグループ化された後の行に対する抽出条件を指定します。この場合、大陸でグループ化し、合計2億人以上の大陸のみを検索対象とするようHAVING句で絞っています。やはり、アジアの人口の多さは圧倒的です。
