SELECT文②(Group by句/Having/複数の句の結合)



SELECT文②(Group by/Having/複数の句の結合)

今回は。Group By句、Having句、複数の句の結合について説明します。

1.Group by句

Group By句を使うと、列の値に従って行をグループ化することができます。
まず、SUM関数を使って、地域テーブルの店舗面積を求めてみます。

SELECT * FROM 地域;

全件全項目の結果

SELECT SUM(店舗面積) FROM 地域;

面積の合計

そして、地域毎の店舗面積の合計を求めるには以下のようにします。

SELECT 地域,SUM(店舗面積) FROM 地域 GROUP BY 地域;

結果は以下のようになります。

Group By句は、指定された列の値が等しい行をグループします。そして、そのグループ毎に、SELECT句で指定された集計関数を実行します。
Group By句を使うと、いろいろなクエリーを記述することができます。例えば、各地域に支店がいくつあるか、さらに各地域の店舗面積を同時に出力させたい場合は以下のようにします。

SELECT 地域,SUM(店舗面積),COUNT(支店名) FROM 地域 GROUP BY 地域;

結果は以下のようになります。

2.Having

HAVING句を使うと、GROUP BY句によってグループ化されたデータに検索条件を設定し、データを絞り込むことができます。一般にWHERE句とGROUP BY句を指定すると、検索条件が実行されてからグループ化されますが、GROUP BY句とHAVING句を指定すると、グループ化が行われてから検索条件が実行されます。

SELECT 地域,AVG(店舗面積) FROM 地域 GROUP BY 地域;

結果は以下のようになります。

次に、店舗面積が700未満の地域を求めてみます。HAVING句を使って以下のようにします。

SELECT 地域,AVG(店舗面積) FROM 地域 GROUP BY 地域 HAVING AVG(店舗面積) < 700;

結果は以下のようになります。

HAVING句は、WHERE句と同じように、論理演算子を使って複数の条件を組み合わせることができます。次の例では、支店の平均社員数が80人より多く、かつ平均店舗面積が500より広い地域を選びます。AND演算子を使って、これら2つの条件を組み合わせています。

SELECT 地域,AVG(店舗面積),AVG(社員数) FROM 地域 GROUP BY 地域 HAVING AVG(店舗面積) > 500 AND AVG(社員数) > 80 ;

結果は以下のようになります。

IN述語を使って、検索条件に使うこともできます。次の例は、「地域1」と「地域3」について、それぞれの地域の平均店舗面積を求めています。

SELECT 地域,AVG(店舗面積) FROM 地域 GROUP BY 地域 HAVING 地域 IN (‘地域1’,’地域3’);

結果は以下のようになります。

3.複数の句の結合

ここでは、複数の句を組み合わせて使う方法を見ていきます。まず、社員数が60人未満の支店を抽出し、さらにその中から店舗面積で並べ替えてみます。SQLは以下のようになります。

SELECT 支店名,社員数,店舗面積 FROM 地域 WHERE 社員数 < 60 ORDER BY 店舗面積;

結果は以下のようになります。

次に、社員数が50人以上で、支店名に”新”がつく支店名を抽出し社員数で並べ替えます。SQLは以下のようになります。

SELECT 支店名,社員数,店舗面積 FROM 地域 WHERE 社員数 >= 50 AND 支店名 LIKE ‘%新%’ ORDER BY 社員数;

結果は以下のようになります。

最後に複数の句を組み合わせる場合は、使用する句の評価順位に注意する必要があります。つまり、どの句が先に処理され、どのタイミングで行が絞り込まれるかを考慮しながらクエリーの動作を考えることが必要になります。次のSQLと結果について考えてみます。

SELECT 地域,SUM(店舗面積) 面積合計,COUNT(支店名) 支店数
FROM 地域
WHERE 店舗面積 < 800 GROUP BY 地域 HAVING SUM(店舗面積) > 2000;

結果は以下のようになります。

このSQLは、FROM句のあと、句の優先順位に従ってWHERE句、GROUP BY句、HAVING句という順で処理されています。最初のWHERE句によって、店舗面積が800未満の支店は除外されています。つまり、GROUP BY句の前に店舗面積が800以上の支店は処理対象外となっています。そのあと「GROUP BY 地域」によって地域毎に支店がグループ化されます。さらに「HAVING SUM(店舗面積) > 2000」によって地域毎の合計店舗面積が2,000より広いかどうかが比較されます。しかし、ここで注意しないといけないことがあります。それは、この時点では既に地域毎のグループには店舗面積が800より広い支店は含まれていないということです。その為、この比較は店舗面積が800より狭い支店だけを対象にしているということを考えなければいけません。
今回の記事はこれで終了です。次回は、表の結合について説明します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です