東京都で開催する「初心者向けデータベース設計入門」講座です。

3.1 「GROUP BY」句の基本

「GROUP BY」句の基本

3.1 「GROUP BY」句の基本

 データグループ化の基本的な考え方を学習します

3.1.1 学習の準備

 まずは、「GROUP BY」句を学習するための準備として、新しいテーブルを作成し、データを登録しましょう。

  復習
 * 新規テーブルの作成
 下表のテーブル「orderinfo」テーブルを作成してください。

 テーブル名:「orderinfo」

項目 データのタイプ 列名 データ型 属性
受注番号 数値(整数) orderno INT PRIMARY KEYAUTO_INCREMENT
ユーザー名 文字列(最大半角20文字/全角10文字) user VARCHAR(20)
ISBN番号 文字列(最大半角20文字/全角10文字) isbn VARCHAR(20)
注文数 数値(整数) quantity INT
注文日 日付 date date

    CREATE TABLE orderinfo (
   orderno INTEGER AUTO_INCREMENT PRIMARY KEY,
   user VARCHAR(20),
   isbn VARCHAR(20),
   quantity INTEGER,
   date date
   )ENGINE=InnoDB;

 * 新規テーブルへのデータ登録
 次に下記のデータを登録してください。

orderno user isbn quantity date
1 kanda 00001 1 2010-07-01
2 shibuya 00001 2 2010-07-15
3 akiba 00001 1 2010-08-02
4 meguro 00001 3 2010-07-17
5 kanda 00002 1 2010-08-22
6 shibuya 00002 3 2010-09-03
7 kanda 00002 1 2010-07-25
8 meguro 00003 4 2010-07-30
9 ueno 00003 1 2010-08-12
10 shibuya 00003 1 2010-08-21
11 tamachi 00004 2 2010-09-14
12 meguro 00004 3 2010-07-11
13 shibuya 00004 6 2010-07-19
14 akiba 00004 1 2010-08-19
15 kanda 00005 4 2010-09-01
16 tamachi 00005 2 2010-08-22
17 shibuya 00005 1 2010-07-01
18 kanda 00006 1 2010-07-15
19 osaki 00006 1 2010-08-20
20 shibuya 00006 3 2010-07-30
21 meguro 00006 2 2010-09-01
22 tamachi 00006 6 2010-09-30
23 kanda 00007 1 2010-07-11
24 shibuya 00007 3 2010-07-21
25 kanda 00007 2 2010-08-15
26 meguro 00007 1 2010-07-02
27 akiba 00007 4 2010-07-25
28 ueno 00007 1 2010-08-15
29 ueno 00001 1 2010-08-14
30 ueno 00002 1 2010-07-15

   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00001',1,'2010-07-01');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00001',2,'2010-07-15');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00001',1,'2010-08-02');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00001',3,'2010-07-17');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-08-22');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00002',3,'2010-09-03');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-07-25');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00003',4,'2010-07-30');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00003',1,'2010-08-12');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00003',1,'2010-08-21');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00004',2,'2010-09-14');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00004',3,'2010-07-11');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00004',6,'2010-07-19');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00004',1,'2010-08-19');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00005',4,'2010-09-01');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00005',2,'2010-08-22');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00005',1,'2010-07-01');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00006',1,'2010-07-15');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('osaki','00006',1,'2010-08-20');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00006',3,'2010-07-30');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00006',2,'2010-09-01');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00006',6,'2010-09-30');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',1,'2010-07-11');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00007',3,'2010-07-21');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',2,'2010-08-15');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00007',1,'2010-07-02');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00007',4,'2010-07-25');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00007',1,'2010-08-15');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00001',1,'2010-08-14');
   INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00002',1,'2010-07-15');

 * データの確認
 データの中身を確認してみましょう。

    SELECT * FROM orderinfo;

3.1.2 「GROUP BY」句の基本

 「GROUP BY句」はある特定の列をキーに(グループキーといいます)、データをグループ化するための句です。
 書式は下記のようになります。

    SELECT グループ化キー FROM テーブル名 GROUP BY グループ化キー;

 先程作成した「orderinfo」で見てみましょう。
 「orderinfo」のユーザー名には、複数のユーザーが存在しますが、重複しているデータもあります。
 これをユーザー毎にグループ化してみましょう。

    SELECT user FROM orderinfo GROUP BY user;


 user列がグループ化され重複が排除されたユーザー名の一覧が取得できました。

 TIPS
 「GROUP BY」句と似たような働きをする句に、「DISTINCT」句があります。
 「DISTINCT」句は、検索結果の重複を排除する機能があります。
 書式は下記のようになります。

   SELECT DISTINCT 列名 FROM テーブル名;

 先程「orderinfo」をuser列でグルーピング化したように、user列の重複を排除するには

   SELECT DISTINCT user FROM orderinfo;

となります。

 但し「DISTINCT」句は重複を排除するためのものであり、「GROUP BY」句のように、集計関数と同時に使ってグループごとの集計を取るような使い方はできません。

NEXT>> 3.2 「GROUP BY」句と集計関数

セミナー一覧

法人向けプログラミング研修

Java、PHPの社員研修|新人研修
セミナー講師紹介

主席インストラクター
早稲田大学大学院 理工学部卒業
SanJose 州立大学、コンピューター工学部卒業
アメリカのシリコンバレーでは、プログラマー・SEとして活躍
講師の詳細はこちら

PAGETOP
Copyright © 2016 FusionOne Co.,Ltd. All rights reserved.