データベース初心者必見!入門編その9〜行のグループ化、集計関数、結果をソート〜
2015/08/05
はじめに
今回は、入門編その1、入門編その2、入門編その3、入門編その4、入門編その5、入門編その6、入門編その7、入門編その8の続きです。
今回は行のグループ化、集計関数を使用する方法と結果をソートして取得する方法について紹介します。
行のグループ化
行のグループ化について紹介します。
まず、次のSQLを発行して下さい。
[shell]SELECT ctg_id FROM goods[/shell]
実行結果
特に難しいSQLではありません。一つのテーブルに対するSELECT文で、射影のみを行っています。
ここで、ctg_id列の値に注目してみると、同じ値が複数存在していることがわかります。これを、同じ値のものをグループにまとめて結果セットを取得するというのが行のグループ化です。グループ化をするにはGROUP BY句でグループ化したい列を指定します。また、GROUP BYを使ったSQLでは、SELECTの後ろに列名のリストには、グループ化したい列か集計関数(後述します)を使用した列しか記述できません。
実際に実行してみます。
[shell]SELECT ctg_id FROM goods GROUP BY ctg_id[/shell]
実行結果
グループ化した結果セットを見てみると。ctg_d列の値に重複したものがありません。
これがグループ化の働きです。
goodsテーブルのctg_ig列にどのような値があるか参照したいとき、値をグループ化して整理した結果セットを取得するときに使えます。
複数の列をグループ化する
次のように複数の列をグループ化することもできます。
[shell]SELECT ctg_id,mkr_id FROM goods GROUP BY ctg_id,mkr_id[/shell]
実行結果
複数の列を指定してグループ化を行った場合には、列の値の組み合わせが同じものがグループ化して表示されます。今回取得した結果セットはあまり有用のないものとはいえませんが、このような方法があることも覚えておきましょう。
グループ化した列で条件を絞り込む
グループ化した列に条件を指定して絞り込むためにはHAVING句を使用します。WHERE句ではエラーになるので注意しましょう。
[shell]SELECT ctg_id goods GROUP BY ctg_id HAVING ctg>=id[/shell]
実行結果
HAVING句を使って、グループ化したctg_id列の値が3以上の行を結果セットに取得しました。
集計関数を使用する
グループ化した列の全ての行に対して、何らかの演算をする機能を持つ関数を集計関数と呼びます。SQLにはいくつかの集計関数が定義されています。
表:主な集計関数
集計関数 | 説明 |
AVG() | グループ化した列の値の平均値を求める |
COUNT() | グループ化した列の行数をカウントする(数える) |
MAX() | グループ化した列の値の最大値を求める |
MIN() | グループ化した列の最小値を求める |
SUM() | グループ化した列の合計を求める |
AVG関数を使って、グループ化した列の平均値を求めるSQLを発行してみましょう。
[shell]SELECT AVG(gds_price) 平均値 FROM goods[/shell]
実行結果
gds_price列の平均値を取得することが出来ました。しかし、SQL文では列のグループ化を行っていません。この場合には、テーブル全体が一つのグループとしてみなされて結果セットが取得されます。
続いてもう一つのSQLを発行します。
[shell]SELECT ctg_id, COUNT(ctg_id) FROM goods GROUP BY ctg_id[/shell]
実行結果
今度は、ctg_id列の値でグループ化して、いくつかのctg_id列をグループ化したかをcount()関数を使って取得しました。
結果をソートして取得する
これまでのSQL文では、取得した結果セットの行の並び順を特に指定してませんでした。
この時の行の並び順は不定で、いつも同じ結果がいつも同じ結果が帰ってくるとは限りません。
ここからは、結果セットの行をソートして取得するSQL文を紹介します。
ソートとは
ソートとは、データにある一定の規則に基づいて並び替えることです。SQLでは並び替えの基準となる列をORDER BY句で指定することによって結果セットをソートすることができます。
早速試してみましょう。
[shell]SELECT * FROM goods ORDER BY gds_price[/shell]
実行結果
ORDER BY句の後に並び替えで使用できる列名が記述します。
今回の実行結果ではgds_price列の昇順(小さい順)にソートしました。
昇順でソートする
降順(大きい順)にソートするにはDESCキーワードを記述します。
[shell]SELECT * FROM goods ORDER BY gds_price DESC[/shell]
実行結果
先程とは逆の順で並び替えられました。ORDER BY句にDESCキーワードを記述しない場合には、暗黙的には昇順でソートされます。昇順でソートすることを明示的に記述したい場合にはASCキーワードを用います。
複数の列でソートする
ORDER BY句には複数の列をカンマ区切りで記述することができます。
[shell]SELECT gds_name, ctg_id FROM goods ORDER BY ctg_id ASC,goodsprice DESC[/shell]
実行結果
今回のSQL文では、まず、ctg_idの値で照準にソートされ、次にctg_is列の値がおなじものいついてはgds_price列の値の順に降順にソートされています。
このようにORDER BY句に複数の列を記述した場合には、左側に記述した列から順にソートされていきます。
さいごに
今回は行のグループ化、集計関数を使用する方法と結果をソートして取得する方法について紹介します。 次回は、シリーズで紹介する中で最も難易度の高い問い合わせ方法である副問い合わせについて紹介いたします。