グループ化したデータを出力する(GROUP BY)

たとえば、都道府県別の平均体重を出したいときなどは、都道府県ごとにグループ化する必要があります。

そういうときに登場するのが、この”GROUP BY句”です。

GROUP BY句はSELECT文で使用し、「GROPU BY 」という書式で使用します。

都道府県ごとの体重の平均を出す場合は以下のようにします。

mysql> select address, AVG(weight) from member group by address;
+-------------+
| AVG(weight) |
+-------------+
|     55.0000 |
|     52.0000 |
|     49.0000 |
|     53.0000 |
|     52.7500 |
|     67.0000 |
+-------------+
6 rows in set (0.00 sec)

都道府県ごとのメンバー数を出力する。

mysql> select address, COUNT(*) from member group by address;
+---------+----------+
| address | COUNT(*) |
+---------+----------+
| NULL    |        1 |
| 群馬  |        1 |
| 茨城  |        4 |
| 千葉  |        2 |
| 埼玉  |        4 |
| 東京  |        2 |
+---------+----------+
6 rows in set (0.00 sec)

特定のフィールドがNULLの行を一致させる。(IS NULL演算子)

各行において値が入っていない列はNULLが入っています。

NULLが入っている列はどんな条件式とも一致しません、そのためある列の値がNULLである
という条件に一致させる場合には、”IS NULL”演算子を使用します。

たとえば、id, name, age, weight, addressというフィールドがあるテーブルに対して、
以下のようにaddressの値を入れずにINSERTすると、addressフィールドがNULLのデータが
入ります。

mysql> insert into member (name, age, weight) values('mizumoto', 35, 55);
Query OK, 1 row affected (0.00 sec)
mysql> select * from member;
+----+----------+------+--------+---------+
| id | name     | age  | weight | address |
+----+----------+------+--------+---------+
|  1 | tanaka   |   30 |     57 | 東京  |
|  2 | suzuki   |   32 |     77 | 東京  |
|  3 | nakamura |   33 |     52 | 群馬  |
|  4 | miura    |   31 |     67 | 埼玉  |
|  5 | kimura   |   27 |     62 | 茨城  |
|  6 | takai    |   25 |     63 | 千葉  |
|  7 | tadano   |   26 |     43 | 千葉  |
|  8 | murakami |   35 |     42 | 茨城  |
|  9 | kikuchi  |   32 |     41 | 茨城  |
| 10 | suzuki   |   31 |     51 | 茨城  |
| 11 | saeki    |   29 |     49 | 埼玉  |
| 12 | ooyama   |   29 |     48 | 埼玉  |
| 13 | kamata   |   22 |     47 | 埼玉  |
| 14 | mizumoto |   35 |     55 | NULL    |
+----+----------+------+--------+---------+
14 rows in set (0.00 sec)

addressが埼玉以外を抽出しても、addressがNULLの行は抽出されません。

mysql> select * from member where address  "埼玉";
+----+----------+------+--------+---------+
| id | name     | age  | weight | address |
+----+----------+------+--------+---------+
|  1 | tanaka   |   30 |     57 | 東京  |
|  2 | suzuki   |   32 |     77 | 東京  |
|  3 | nakamura |   33 |     52 | 群馬  |
|  5 | kimura   |   27 |     62 | 茨城  |
|  6 | takai    |   25 |     63 | 千葉  |
|  7 | tadano   |   26 |     43 | 千葉  |
|  8 | murakami |   35 |     42 | 茨城  |
|  9 | kikuchi  |   32 |     41 | 茨城  |
| 10 | suzuki   |   31 |     51 | 茨城  |
+----+----------+------+--------+---------+
9 rows in set (0.00 sec)

もちろん、””とも一致しません。

mysql> select * from member where address="";
Empty set (0.00 sec)

なので、addressがNULLな行を抽出するにはIS NULL演算子を使います。

mysql> select * from member where address IS NULL;
+----+----------+------+--------+---------+
| id | name     | age  | weight | address |
+----+----------+------+--------+---------+
| 14 | mizumoto |   35 |     55 | NULL    |
+----+----------+------+--------+---------+
1 row in set (0.00 sec)

MySQLでデータの並び替え(ORDER BY)

抽出したデータを並び替える

抽出したデータが複数あった場合、’ORDER BY’句を指定していない場合は、データの
並び順は保障されません。

そこで、’ORDER BY’句で列名を指定することにより、名前の順で並び替えたり、
年齢順で並び替えたりすることができます。

以下は、年齢の若い順に並び替えた場合の例になります。

mysql> SELECT * FROM member ORDER BY age;
+----+----------+------+--------+---------+
| id | name     | age  | weight | address |
+----+----------+------+--------+---------+
| 13 | kamata   |   22 |     47 | 埼玉  |
|  6 | takai    |   25 |     63 | 千葉  |
|  7 | tadano   |   26 |     43 | 千葉  |
|  5 | kimura   |   27 |     62 | 茨城  |
| 12 | ooyama   |   29 |     48 | 埼玉  |
| 11 | saeki    |   29 |     49 | 埼玉  |
|  1 | tanaka   |   30 |     57 | 東京  |
| 10 | suzuki   |   31 |     51 | 茨城  |
|  4 | miura    |   31 |     67 | 埼玉  |
|  2 | suzuki   |   32 |     77 | 東京  |
|  9 | kikuchi  |   32 |     41 | 茨城  |
|  3 | nakamura |   33 |     52 | 群馬  |
|  8 | murakami |   35 |     42 | 茨城  |
+----+----------+------+--------+---------+
13 rows in set (0.00 sec)

逆に、年齢が高い順に並び替えた場合は以下になります。

mysql> SELECT * FROM member ORDER BY age DESC;
+----+----------+------+--------+---------+
| id | name     | age  | weight | address |
+----+----------+------+--------+---------+
|  8 | murakami |   35 |     42 | 茨城  |
|  3 | nakamura |   33 |     52 | 群馬  |
|  2 | suzuki   |   32 |     77 | 東京  |
|  9 | kikuchi  |   32 |     41 | 茨城  |
| 10 | suzuki   |   31 |     51 | 茨城  |
|  4 | miura    |   31 |     67 | 埼玉  |
|  1 | tanaka   |   30 |     57 | 東京  |
| 11 | saeki    |   29 |     49 | 埼玉  |
| 12 | ooyama   |   29 |     48 | 埼玉  |
|  5 | kimura   |   27 |     62 | 茨城  |
|  7 | tadano   |   26 |     43 | 千葉  |
|  6 | takai    |   25 |     63 | 千葉  |
| 13 | kamata   |   22 |     47 | 埼玉  |
+----+----------+------+--------+---------+
13 rows in set (0.00 sec)

出力される行数を求める(COUNT関数)

COUNT関数を使用することで、選択されたレコードの数を出力できます。

mysql> select COUNT(*) from member;
+----------+
| COUNT(*) |
+----------+
|       14 |
+----------+
1 row in set (0.00 sec)

mysql> select COUNT(*) from member where address="東京";
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

MySQLの条件文(WHERE句)の使い方 Vol.1

MySQLのWHERE句で条件の範囲指定をする

WHERE句には、完全一致以外にも検索方法があります。’>’, ‘=’, ‘<=' などの比較演算子を使用します。

たとえば、32歳以上のメンバーを検索する場合は以下のようにします。

mysql> SELECT * FROM member WHERE age>=32;
+----+----------+------+--------+---------+
| id | name     | age  | weight | address |
+----+----------+------+--------+---------+
|  2 | suzuki   |   32 |     77 | 東京  |
|  3 | nakamura |   33 |     52 | 群馬  |
|  8 | murakami |   35 |     42 | 茨城  |
|  9 | kikuchi  |   32 |     41 | 茨城  |
+----+----------+------+--------+---------+
4 rows in set (0.00 sec)

・比較演算子の一覧

x = y xとyが等しい
x y, x != y xとyが等しくない
x > y xとyが等しい
x >= y xがy以上
x > y xがyより大きい
x <= y xがy以下
x < y xがyより大きい

MySQLで列名に別名をつける

列に別名をつける

ちなみに、列名に別名をつけることもできます。表示する列名の後にスペースで区切って
別名を記入します。

列名は通常アルファベットで登録してありますが、日本語でわかりやすく表示することもできます。

mysql> SELECT name '名前',age '年齢' FROM member WHERE address="東京";
+--------+--------+
| 名前   | 年齢   |
+--------+--------+
| tanaka |     30 |
| suzuki |     32 |
+--------+--------+
2 rows in set (0.00 sec)

これは、複数のテーブルを扱うなど複雑な処理をする場合にも役に立つときがあります。

MySQLで重複データを排除する

重複データを除く

MySQLでは重複したデータを取り除くこともできます。
今回の例では、address列に重複したデータがいくつもあります。
これを除いてみます。

mysql> SELECT DISTINCT(address) '住所' FROM member;
+--------+
| 住所   |
+--------+
| 東京   |
| 群馬   |
| 埼玉   |
| 茨城   |
| 千葉   |
+--------+
5 rows in set (0.00 sec)

FROM句でmemberテーブルを指定し、SELECT句でaddress列を指定し、それに対して
DISTINCTを指定することによって、重複したデータを排除しています。
さらに、このaddressに対して’住所’という別名をつけています。

MySQLでデータの検索(SELECT文の基本)

SELECT文の基本

SELECT文はSELECT句とFROM句が必須の句となります。

たとえば、hogetableというテーブルの全データ(全列全行)を取り出すには以下のようにします。

SELECT * FROM hogetable

この例の書式は以下です。

SELECT [,...] FROM 

上記の例の”*(アスタリスク)”は”全部の列”を意味します。
なので、この場合すべての列が抽出されます。

今回は以下のテーブルを例に説明します。

mysql> SHOW fields FROM member;
+---------+----------------------+------+-----+---------+----------------+
| Field   | Type                 | Null | Key | Default | Extra          |
+---------+----------------------+------+-----+---------+----------------+
| id      | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(100)         | YES  |     | NULL    |                |
| age     | smallint(5) unsigned | YES  |     | NULL    |                |
| weight  | smallint(5) unsigned | YES  |     | NULL    |                |
| address | varchar(50)          | YES  |     | NULL    |                |
+---------+----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MySQLのテーブルの全データを抽出する

select句とfrom句だけを使い、select句に’*’(アスタリスク)、from句にテーブル名の’member’を指定します

 select * from member;

mysql> select * from member;
+----+----------+------+--------+---------+
| id | name     | age  | weight | address |
+----+----------+------+--------+---------+
|  1 | tanaka   |   30 |     57 | 東京    |
|  2 | suzuki   |   32 |     77 | 東京    |
|  3 | nakamura |   33 |     52 | 群馬    |
|  4 | miura    |   31 |     67 | 埼玉    |
|  5 | kimura   |   27 |     62 | 茨城    |
|  6 | takai    |   25 |     63 | 千葉    |
|  7 | tadano   |   26 |     43 | 千葉    |
|  8 | murakami |   35 |     42 | 茨城    |
|  9 | kikuchi  |   32 |     41 | 茨城    |
| 10 | suzuki   |   31 |     51 | 茨城    |
| 11 | saeki    |   29 |     49 | 埼玉    |
| 12 | ooyama   |   29 |     48 | 埼玉    |
| 13 | kamata   |   22 |     47 | 埼玉    |
+----+----------+------+--------+---------+
13 rows in set (0.00 sec)

MySQLのテーブルから条件にあったデータだけを抽出する

で、このままだと、全行を抽出してしまうことになるので、通常は”WHERE句”を
つけて、条件にあったデータだけを抽出します。

たとえば、memberテーブルの中から、”address”列が”東京”の人だけを抽出したい場合は
以下のようにします。

mysql> SELECT * FROM member WHERE address="東京";
+----+--------+------+--------+---------+
| id | name   | age  | weight | address |
+----+--------+------+--------+---------+
|  1 | tanaka |   30 |     57 | 東京    |
|  2 | suzuki |   32 |     77 | 東京    |
+----+--------+------+--------+---------+
2 rows in set (0.00 sec)

MySQLのテーブルから抽出するときに列を指定する

SELECT句に’*’を指定すると全列が表示されます。表示する列を限定したい場合は、’*’ではなく列名を指定します。

複数の列を指定する場合は’,’(カンマ)で区切って指定します。

mysql> SELECT name,age FROM member WHERE address="東京";
+--------+------+
| name   | age  |
+--------+------+
| tanaka |   30 |
| suzuki |   32 |
+--------+------+
2 rows in set (0.00 sec)

列に別名をつける

ちなみに、列名に別名をつけることもできます。表示する列名の後にスペースで区切って
別名を記入します。

mysql> SELECT name '名前',age '年齢' FROM member WHERE address="東京";
+--------+--------+
| 名前   | 年齢   |
+--------+--------+
| tanaka |     30 |
| suzuki |     32 |
+--------+--------+
2 rows in set (0.00 sec)

これは、複数のテーブルを扱うなど複雑な処理をする場合に役に立つときがあります。