SQLの基本(その2)

2009年10月20日(火)
藤本 壱

行の集計

 今回は「データベース基礎中の基礎」の第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のようになります。

 次のページでは、テーブルの結合、内部結合と外部結合について説明します。

1969年生まれ。神戸大学工学部電子工学科卒。ソフトメーカー勤務後、フリーライターとして独立。現在では、パソコン関係およびマネー関係の書籍を中心に執筆活動を行っている。ブログ「The blog of H.Fujimoto」は、Movable TypeやWordPressの情報を中心に毎日更新している(http://www.h-fj.com/blog/)。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています