前回の記事に続き、サンプルデータベース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;
ContinentCOUNT(*)
North America37
Asia51
Africa58
Europe46
South America14
Oceania28
Antarctica5

ここで新しくGROUP BY句が出てきました。GROUP BY句は、抽出された行を、指定された列の値が同じ行ごとにグループ化するために使用されます。上記のように記述するれば、大陸ごとの国数を求められます。

大陸ごとの人口と全大陸の合計人口を求める

SELECT Continent, SUM(Population) FROM country
GROUP BY Continent WITH ROLLUP;
ContinentSUM(Population)
Asia3705025700
Europe730074600
North America482993000
Africa784475000
Oceania30401150
Antarctica0
South America345780000
NULL6078749450

同じように、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;
ContinentTotalPop
Asia3705025700
Africa784475000
Europe730074600
North America482993000
South America345780000

最後に、大陸ごとに人口を集計し、2億人以上の大陸を人口の多い順に並べてみましょう。HAVING句には、GROUP BY句によってグループ化された後の行に対する抽出条件を指定します。この場合、大陸でグループ化し、合計2億人以上の大陸のみを検索対象とするようHAVING句で絞っています。やはり、アジアの人口の多さは圧倒的です。