情報処理技術者試験の午前問題対策のホームページです。
趣 旨 

当ホームページのアクセス数No.1の『SQL講座』です。
マイクロソフトのAccessというデータベースソフトを利用して、10回の講義形式で、SQLを学んでいきます。

初級シスアドから目指すSQLというコンセプトのもと、なるべく分かりやすく、かつ、注意すべき点などを随所に盛り込みながら、解説していきます。

SQL講座のTopへ戻る

MENU
第5時限目:GROUP BY と HAVING

MS-AccessでSQL
基本SELECT文
関係関数指定
集合関数指定
GROUP BY と HAVING
並べ換え
表の結合
挿入・更新・削除
副問合せ
練習問題






第4時限目で説明した集合関数と一緒に使われる GROUP BY 句を見ていきましょう。

GROUP BY 句とは、ある表の行を条件ごとにグルーピングして扱います。

GROUP BY句を使用する場合は、SELECT句で抽出する列が制限されますので、注意が必要です。

<注意>
 SELECT句の後ろには、グループ化で指定した列(GROUP BY句の後ろに記述する列名)と集合関数しか
 記述できません。⇒ソフトウェア開発技術者試験の午後対策でもあります。


■ GROUP BY 句


 SELECT ( <SQL 集合関数> ) FROM <テーブル名リスト>
 GROUP BY <列名リスト>


 テーブル名リストから列名リストでグルーピングして集合関数の値を返します。

/* ch05-1 */

SELECT COUNT ( * ) AS 在籍支社ごとの社員数 , 在籍支社
FROM 社員
GROUP BY 在籍支社 ;



 テーブル「社員」を在籍支社ごとにグルーピングして、その人数をカウントします。

< 実行結果ch05-1 >



/* ch05-2 */

SELECT MAX ( 単価 ) AS 数量ごとの単価最大値 , 数量
FROM 受注明細
GROUP BY 数量 ;



 テーブル「受注明細」を数量ごとにグルーピングして、その単価の最大値を求めます。

< 実行結果ch05-2 >



/* ch05-3 */

SELECT MIN ( 単価 ) AS 数量ごとの単価最小値 , 数量
FROM 受注明細
GROUP BY 数量 ;



 テーブル「受注明細」を数量ごとにグルーピングして、その単価の最少値を求めます。

< 実行結果ch05-3 >



/* ch05-4 */

SELECT AVG ( 単価 ) AS 商品区分ごとの単価平均値 , 区分コード
FROM 商品
GROUP BY 区分コード ;



 テーブル「商品」を区分コードごとにグルーピングして、その単価の平均値を求めます。

<注意>
 ここでテーブル「商品」に”区分コード”という列名は存在しませんが、
 左上のビューボタンを押下するとフィールド名が”区分コード”になってます。

 テーブル「商品区分」に連結されているのですね。


< 実行結果ch05-4 >


/* ch05-5 */

SELECT SUM ( 在庫 ) AS 商品区分ごとの在庫合計値, 区分コード
FROM 商品
GROUP BY 区分コード;



 テーブル「商品」を区分コードごとにグルーピングして、その在庫の合計値を求めます。

< 実行結果ch05-5 >




■ WHERE 句をつけて

/* ch05-6 */

SELECT COUNT ( * ) AS 在庫50以上の商品区分ごとのカウント, 区分コード
FROM 商品
WHERE 在庫 >= 50
GROUP BY 区分コード;



 テーブル「商品」からまず在庫が 50 以上を求め
 次に区分コードごとにグルーピングして、その区分コードの数を  カウントします。

< 実行結果ch05-6 >




■ HAVING 句


 SELECT ( <SQL 集合関数> ) FROM <テーブル名リスト>
 GROUP BY <列名リスト>
 HAVING <探索条件>


 テーブル名リストから列名リストでグルーピングしてそのグループから探索条件を指定し、
 得られた集合関数の値を返します。

 HAVING 句は、GROUP BY 句でできるグループのうちから、
 特定のグループを選択するための探索条件を指定します。


/* ch05-7 */

SELECT COUNT ( * ) AS 在庫50以上で商品区分ごとのカウントが5以下 , 区分コード
FROM 商品
WHERE 在庫 >= 50
GROUP BY 区分コード
HAVING COUNT( * ) <= 5 ;



 テーブル「商品」からまず在庫数が 50 以上ある在庫を求め、次に区分コードごとにグルーピングして、
 その区分コードの数をカウントします。

 カウントした結果、5 以下のもの
を求めます。

< 実行結果ch05-7 >


/* ch05-8 */

SELECT MAX ( 単価 ) AS 在庫50以上で商品区分ごとの単価の最大値 , 区分コード
FROM 商品
WHERE 在庫 >= 50
GROUP BY 区分コード ;




/* ch05-9 */

SELECT MAX ( 単価 ) AS 在庫50以上で商品区分ごとの単価の最大値が300以下 , 区分コード
FROM 商品
WHERE 在庫 >= 50
GROUP BY 区分コード
HAVING MAX( 単価 ) <= 300 ;



 上記 2 つを実行し見比べてみましょう。

 < 実行結果ch05-8 > では、
 テーブル「商品」からまず在庫が 50 以上を求め、次に区分コードごとにグルーピングして
 その区分コードの単価の最大値を求めます。

 < 実行結果ch05-9 >では、
 テーブル「商品」からまず在庫が 50 以上を求め、次に区分コードごとにグルーピングして
 その区分コードの単価の最大値を求めます。最大値を求めた結果、300 以下のものを求めます。


< 実行結果ch05-8 >



< 実行結果ch05-9 >






第4時限目へ  第6時限目へ


このページのTopへ戻る
インフォメーション



© 2005 情報処理技術者試験対策 All rights reserved.
[PR] 情報セキュリティアドミニストレータ試験対策セキュアド試験午前問題徹底攻略セキュアド勉強会特訓PDCA式で学ぼう情報セキュリティ情報処理技術者試験 午前問題攻略
テクニカルエンジニア(情報セキュリティ)試験対策転職 就職ネイティブ音声日常英会話