- 5.1. SELECT によるデータの参照
- 5.2. 条件付き参照
- 1. 不等式を使った述語
- 2. ブール演算子を使った述語
- 5.3. 特殊演算子
- 1. IN 演算子
- 2. BETWEEN 演算子
- 3. LIKE 演算子
- 4. IS NULL 演算子
- 5.4. 集約関数
- 5.5. グループ化
- 1. GROUP BY 句
- 2. HAVING 句
- 5.6. 並べ替えと名前付け
5.5. グループ化
SQL におけるグループ化とは、同列内の値の中で、同じ値を持つデータごとに集合化することをいいます。グループ化には GROUP BY 句を用います。また、グループ化された情報に対して条件を設定し、その条件に合致するものだけを抽出することもできます。これには、GROUP BY 句でグループ化する列名を指定した後、HAVING 句を続けて抽出条件を記述します。
5.5.1. GROUP BY 句
GROUP BY 句を用いれば,ある列の値の部分集合を定義して,それに集約関数を適用することができます。この部分集合とは、共通の集約が適用される対象として、ある列に値を持つかのように定義されたグループのことです。例えば、受注表で顧客コードに対する受注個数の最大値を求める場合は次のように書けます。
-- sample.15-1 --/* グループ化 */ SELECT 顧客コード , MAX(受注個数) FROM 受注表 GROUP BY 顧客コード ;
/* 実行結果 */ 顧客コード MAX(受注個数) ──────── ────── 001 30 002 20 003 20
GROUP BY 句で顧客コード別に新しいテーブルを一度作成し、それぞれのテーブルの中で受注個数の最大値を集約関数で抽出し、その結果を顧客コード別に表示している、というようなイメージです。
GROUP BY 句は複数の列に使用することもできます。次のサンプルでは、各顧客コードの受注個数の最大値を商品コード別に参照したい場合のものです。
-- sample.15-2 --/* グループ化 */ SELECT 顧客コード , 商品コード , MAX(受注個数) FROM 受注表 GROUP BY 顧客コード , 商品コード ;
/* 実行結果 */ 顧客コード 商品コード MAX(受注個数) ──────── ───────── ────────── 001 0101 15 001 0102 30 001 0103 15 002 0101 20 002 0102 20 003 0101 15 003 0103 20
5.5.2. HAVING 句
sample.15-2 で 20 以上の最大受注個数 (MAX(受注個数)) のみを参照したい場合のように、GROUP BY 句によりグループ化された情報に対して条件を設定する場合は、HAVING 句を用います。実際には次の sample.15-3 のように書きます。
-- sample.15-3 --/* グループ化 */ SELECT 顧客コード , 商品コード , MAX(受注個数) FROM 受注表 GROUP BY 顧客コード , 商品コード HAVING MAX(受注個数) >=20;
/* 実行結果 */ 顧客コード 商品コード MAX(受注個数) ──────── ───────── ────────── 001 0102 30 002 0101 20 002 0102 20 003 0103 20
WHERE 句と HAVING 句は条件を設定するという観点からは非常に似たようなもののように見えます。しかし、WHERE 句と HAVING 句とは全く異なるものです。WHERE 句は SELECT 文が行を選ぶときの条件を指定するものですが、HAVING 句は WHERE 句が指定する条件で呼び出された行から、グループを選ぶための条件を与えているのです。ですから行を選ぶ WHERE 句には集約関数を置くことはできませんが、HAVING 句では集約関数を置くことができます。
実習課題1
表に示すテーブル「employee」から、それぞれの事務所の男性の人数を求めるための SQL 文を記述しなさい。表示する列は、「office」及び「男性の人数」である。gender列で、'0' は女性、'1' は男性を表す。
e_num | e_name | year | gender | office |
---|---|---|---|---|
101 | Ichihara Etsuo | 1972 | 1 | 20 |
102 | Nishida Toshiko | 1978 | 0 | 10 |
103 | Nishikino Akiko | 1980 | 0 | 30 |
104 | Yamaguchi Tomohito | 1985 | 1 | 10 |
105 | Oda Yuko | 1988 | 0 | 10 |
106 | Matsushima Nanao | 1995 | 1 | 20 |
107 | Hirosue Ryotaro | 1999 | 1 | 30 |