PR

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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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