SQLの基本(その2)

行の集計 今回は「データベース基礎中の基礎」の第3回として、前回に続いてSELECT文の使い方を解説します。行の集計とグループ化、2つのテーブルの結合、内部結合と外部結合、副問い合わせ、の各手法を取り上げます。また、行の追加/更新/削除を行うINSERT/UPDATE/DELETEの各命令も解説し

藤本 壱

2009年10月20日 20:00

行の集計

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

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

この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30