8-8 SQL(2)グループ化、整列

グループ化と集合関数

 SQLでは、指定した列をグループ化することができます。グループごとの合計、件数、平均、最大、最小も計算できます。
 グループ化を行うためには、GROUP BY句にグループ化したい列を列挙します。

           平均を求める集合関数
例 SELECT 部署コード,AVG(基本給) AS 平均給与
    FROM 社員
      GROUP BY 部署コード 部署コードでグループ化

集合関数

COUNT(*)件数を求める
SUM(列名)合計値を求める
AVG(列名)平均値を求める
MAX(列名)最大値を求める
MIN(列名)最小値を求める

なお、COUNT(氏名)のように集合関数COUNTのカッコ内に”*”でなく具体的な列名を指定した場合、その列の値がNULLでない行の件数が求められます。また、その際に列名の前にDISTINCTを含めると、列の値が重複している行はまとめて1行に数えられます。

 

グループの選択

 グループ化した行から、特定のグループのみを選択することができます。その際にはGROUP BY句の直後にHAVING句を指定します。
 HAVING句の条件には、集合関数を用いた式も指定できます。例えば、次のSELECT文は、社員表から「2名以上の社員が属する部署」の平均給与を抽出するための問い合わせです。

例 SELECT 部署コード,AVG(基本給) AS 平均給与
    FROM 社員
      GROUP BY 部署コード
      HAVING COUNT(*) >= 2

 集合関数を用いた条件を使いたい場合は、HAVING句をもちいなくてはなりません。なぜならWHERE句には集合関数を指定できないためです。

 

グループ化のルール

 グループ化を行う場合は次のルールを守る必要があります。

GROUP BY句には、SELECT句やHAVING句に指定した「集合関数の引数以外の列」をすべて指定する

 逆にいえば、「ある列をSELECTの結果やHAVING句の条件に含めたい場合は、冗長であったとしても、その列をGROUP BY句に指定しておかなければならない」ということになります。

例 SELECT 部署.部署コード部署.部署名 AVG(基本給) AS 平均給与
    FROM 社員,部署
      WHERE 社員.部署コード=部署.部署コード
      GROUP BY 部署.部署コード部署.部署名


  SELECTの後の列名とGROUP BY句の後ろの列名は一致しなければならない!

 

結果の整列

 SELECT文では、結果はどのような順序で並ぶかについては保証されていません。整列した結果を得たい場合は、ORDER BY句で、整列順を明示します。
 ORDER BY句では、列名の後にASC(昇順・小さい順)またはDESC(降順・大きい順)を指定します。

ORDER BY <列名1>[ASC|DESC], <列名2>[ASC|DESC]・・・・

 複数の列名を指定した場合は、まず先頭に指定した第1整列キー順に並べられ、続いて第2整列キー、第3整列キーの順に整列されます。

ORDER BY句では、列名の代わりに、SELECT句で指定した列を左から「1、2、3・・・」とみなし、その整数を用いて、
   ORDER BY 2 DESC
のように指定することもできます。