SQLの基本(その2)
行の集計
今回は「データベース基礎中の基礎」の第3回として、前回に続いてSELECT文の使い方を解説します。行の集計とグループ化、2つのテーブルの結合、内部結合と外部結合、副問い合わせ、の各手法を取り上げます。また、行の追加/更新/削除を行うINSERT/UPDATE/DELETEの各命令も解説します。
テーブル内の行の件数を数えたり、列の合計値を求めたりなど、テーブル内のデータを集計したい場面は多いです。SELECT文は、このようにデータを集計したい場面でも利用することができます。
行の集計を実行するためには、SELECT文を以下のように書きます。
---------------------------------------------------
SELECT 関数(列名), 関数(列名), ・・・, 関数(列名)
FROM テーブル名 WHERE 条件
---------------------------------------------------
「関数」のところには、フィールドを集計する方法を指定します。一般的なRDBMSでは、図1-1に示した5つの集計関数を使うことができます。また、「列名」のところで、集計する列の名前を指定します。ただし、例外的に、COUNT関数を使う場合には、列名に「*」を指定します。WHERE句に条件を指定すると、その条件を満たす行だけを集計することができます。
実際にSQL文を書いてみましょう。図1-2のような、テストの成績表テーブル(testテーブル)があるとします。このテーブルを使って、テストを受けた人の数を求めたいとします。テストを受けた人数はテーブルの行数に等しいので、SELECT文は以下のようになります。testテーブルの場合、結果は「6」になります。
---------------------------------------------------
SELECT COUNT(*) FROM test
---------------------------------------------------
次に、同じテーブルを使って、男子の数学の平均点を求めてみましょう。数学(math列)の平均(AVG)なので、関数は「AVG(math)」と書きます。また、男子だけを集計対象にしたいので、WHERE句に「sex = '男'」の条件を指定します。
これらを反映すると、SELECT文は以下のようになります。図1-2のtestテーブルの場合、男子(山田/鈴木/吉田)の数学(math列)の点数は、それぞれ63/72/75なので、結果は「70」(=(63+72+75)÷3)になります。
---------------------------------------------------
SELECT AVG(math) FROM test WHERE sex = '男'
---------------------------------------------------
グループ化した集計
次に、前述のテストの例で、国語の平均点を男女別に集計したいとします。そのためには、まずtestテーブルの各行を性別(sex列)の値でグループに分け、グループごとにjapanese列を集計します。
ある列の値で行をグループに分けて集計するには、SELECT文に「GROUP BY」という句を追加して、グループ化する列名を指定します。書き方は以下のようになります。
---------------------------------------------------
SELECT 関数(列名), 関数(列名), ・・・, 関数(列名)
FROM テーブル名 WHERE 条件
GROUP BY 列名
---------------------------------------------------
前述のケースの通り、testテーブルをsex列でグループ化し、japanese列の平均を求めてみましょう。また、平均点とともに、性別(sex列)も結果に出力します。
この場合、SELECT文を以下のように書きます。結果は図1-3のようになります。
---------------------------------------------------
SELECT sex, AVG(japanese) FROM test GROUP BY sex
---------------------------------------------------
グループ化を行う際にも、WHERE句を使って、集計対象の行を選択することができます。
例えば、男女それぞれで、英語の点数が70点以上の人の人数を求めたいとします。この場合、sex列でグループ化を行い(GROUP BY sex)、「english列の値が70以上」の条件を指定した上で(WHERE english >= 70)、各グループの行の数をカウントします。したがって、SELECT文は以下のように書きます。
---------------------------------------------------
SELECT sex, COUNT(*) FROM test
WHERE english >= 70
GROUP BY sex
---------------------------------------------------
このSELECT文の結果は、図1-4のようになります。
次のページでは、テーブルの結合、内部結合と外部結合について説明します。