2008年11月28日

パターンマッチ

テーブルの中からある条件でデータを抽出するのにはWHERE句によって抽出することができる。カラムの内容をズバリ指定する場合は、WHERE a = 'XXX' という指定で抽出することができるが、"〜を含む"や"〜を含まない"というあいまいな条件で抽出したいことがある。そんなときは、パターンマッチによって条件指定することができる。

[MYSQL Command Line Client]を起動。(スタート−プログラム−MYSQL)
インストールしたときに管理者権限のパスワードでMYSQLを起動。

mysql> USE test;
Database changed
mysql> DESC syain;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| syain_code | varchar(3) | YES | | NULL | |
| syain_name | varchar(10) | YES | | NULL | |
| syozoku_code | varchar(3) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.22 sec)

mysql> SELECT syain_code,syain_name,syozoku_code FROM syain;
+------------+------------+--------------+
| syain_code | syain_name | syozoku_code |
+------------+------------+--------------+
| 002 | 山田次郎 | 100 |
| 001 | 山田一郎 | 100 |
| 003 | 相澤仁美 | 100 |
| 004 | 相武紗季 | 200 |
| 005 | 秋山莉奈 | 511 |
| 006 | 安倍なつみ | 520 |
| 007 | 綾瀬はるか | 200 |
| 008 | 新垣結衣 | 400 |
| 009 | 堂本光一 | 510 |
| 010 | 堂本剛 | 520 |
| 011 | 二宮和也 | 610 |
| 012 | 夏帆 | 511 |
| 013 | 山下智久 | 620 |
| 015 | 里田まい | 300 |
+------------+------------+--------------+
14 rows in set (0.16 sec)

この[syain]テーブルからsyain_nameカラムの"山"という文字を含むレコードを抽出してみる。

[syain]テーブルからsyain_nameに"山"を含むものを抽出する。

SELECT * FROM syain WHERE syain_name LIKE '%山%';

mysql> SELECT * FROM syain WHERE syain_name LIKE '%山%';
+------------+------------+--------------+
| syain_code | syain_name | syozoku_code |
+------------+------------+--------------+
| 002 | 山田次郎 | 100 |
| 001 | 山田一郎 | 100 |
| 005 | 秋山莉奈 | 511 |
| 013 | 山下智久 | 620 |
+------------+------------+--------------+
4 rows in set (0.00 sec)

"山"の文字を含む名前の社員を抽出できた。
さらに

[syain]テーブルからsyain_nameに"山"を含まないものを抽出する。

SELECT * FROM syain WHERE syain_name NOT LIKE '%山%';

mysql> SELECT * FROM syain WHERE syain_name NOT LIKE '%山%';
+------------+------------+--------------+
| syain_code | syain_name | syozoku_code |
+------------+------------+--------------+
| 003 | 相澤仁美 | 100 |
| 004 | 相武紗季 | 200 |
| 006 | 安倍なつみ | 520 |
| 007 | 綾瀬はるか | 200 |
| 008 | 新垣結衣 | 400 |
| 009 | 堂本光一 | 510 |
| 010 | 堂本剛 | 520 |
| 011 | 二宮和也 | 610 |
| 012 | 夏帆 | 511 |
| 015 | 里田まい | 300 |
+------------+------------+--------------+
10 rows in set (0.00 sec)

また、"相"から始まる名前の社員を抽出するには、

[syain]テーブルからsyain_nameに"相"から始まるものを抽出する。

SELECT * FROM syain WHERE syain_name LIKE '相%';

mysql> SELECT * FROM syain WHERE syain_name LIKE '相%';
+------------+------------+--------------+
| syain_code | syain_name | syozoku_code |
+------------+------------+--------------+
| 003 | 相澤仁美 | 100 |
| 004 | 相武紗季 | 200 |
+------------+------------+--------------+
2 rows in set (0.00 sec)

2文字目が"田"と"本"の文字の社員を抽出するには、

[syain]テーブルからsyain_nameの2文字目が"田"と"本"ものを抽出する。

SELECT * FROM syain WHERE
syain_name LIKE '_田%' OR
syain_name LIKE '_本%';


mysql> SELECT * FROM syain WHERE
-> syain_name LIKE '_田%' OR
-> syain_name LIKE '_本%';
+------------+------------+--------------+
| syain_code | syain_name | syozoku_code |
+------------+------------+--------------+
| 002 | 山田次郎 | 100 |
| 001 | 山田一郎 | 100 |
| 009 | 堂本光一 | 510 |
| 010 | 堂本剛 | 520 |
| 015 | 里田まい | 300 |
+------------+------------+--------------+
5 rows in set (0.00 sec)

そのほかのパターンもさまざまあるようだが、個人的にはほとんど上記パターンを利用しているのみである。レコード抽出の場合は、これで十分であると感じている。(まぁ、必要に応じて都度調べればいいのだし)

まとめると、
あいまい条件で抽出する場合は、WHERE句で LIKE(NOT LIKE)により指定する。文字の指定として、"A%"とするとAの後は何でもいいという意味になり、"%A"とすると末尾がAのものという意味になる。"%A%"ならば、Aを含むものとなる。
また、文字桁を指定する場合は、"_"を利用する。"__A__"とした場合は、5文字のもので3文字目がAのものということになる。複合的に"__A%"とすると、3文字目がAのものということになる。

言葉で説明すると難しいかもしれないが、実際、データで試してみるとわかりやすいし、利用範囲が広がると思う。

QUITで[MYSQL Command Line Client]を終了。

posted by yskillup at 00:08| Comment(0) | TrackBack(0) | MySQL | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。