
本節(jié)將簡單介紹如何在 Mysql where 子句內(nèi)使用正則表達式來更好地控制數(shù)據(jù)過濾
基本字匹配符
select *
from student
where sname regexp '紅'
輸出為:
+------+-----------+---------------------+------+
| SId | Sname | Sage | Ssex |
+------+-----------+---------------------+------+
| 05 | 周紅梅 | 1991-12-01 00:00:00 | 女 |
| 06 | 吳紅蘭 | 1992-03-01 00:00:00 | 女 |
+------+-----------+---------------------+------+
regexp 的簡單用法與 like 關(guān)鍵字無異,下面將介紹更深層次的用法:
select *
from order_info_utf
where user_id regexp '.1111'
order by user_id;
此 sql 語句使用了正則表達式 .1111,. 是正則語言中的一個特殊字符,表示匹配任意一個字符
+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time |
+----------+---------+-----------+-------+---------------------+
| 527086 | 101111 | 已支付 | 762 | 2016-04-28 22:58:00 |
| 538215 | 101111 | 已支付 | 601 | 2016-04-30 20:20:00 |
| 432821 | 11111 | 已支付 | 818 | 2016-04-18 13:16:00 |
| 515923 | 21111 | 已支付 | 1139 | 2016-04-27 18:54:00 |
| 93287 | 31111 | 已支付 | 589 | 2016-03-11 21:36:00 |
| 240508 | 31111 | 已支付 | 521 | 2016-03-28 07:31:00 |
| 154261 | 41111 | 未支付 | 834 | NULL |
| 288954 | 41111 | 已支付 | 471 | 2016-04-01 23:55:00 |
| 46030 | 51111 | 未支付 | 986 | NULL |
| 93874 | 61111 | 未支付 | 485 | NULL |
| 20444 | 71111 | 已支付 | 436 | 2016-03-03 12:17:00 |
| 216118 | 71111 | 已支付 | 550 | 2016-03-25 08:22:00 |
| 258402 | 71111 | 已支付 | 954 | 2016-03-29 19:54:00 |
| 442332 | 71111 | 已支付 | 806 | 2016-04-19 12:48:00 |
| 95510 | 81111 | 已支付 | 716 | 2016-03-12 10:26:00 |
| 318583 | 91111 | 已支付 | 564 | 2016-04-05 22:35:00 |
+----------+---------+-----------+-------+---------------------+
進行 or 匹配
select *
from order_info_utf
where user_id regexp '11111|22222'
order by user_id;
語句中使用了正則表達式 11111|22222 。 | 為正則表達式的 or 操作符。它表示匹配其中之一,因此 11111 和22222 都匹配并返回,注意在 | 字符左右萬不可空格,否則將查詢不出數(shù)據(jù)
+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time |
+----------+---------+-----------+-------+---------------------+
| 432821 | 11111 | 已支付 | 818 | 2016-04-18 13:16:00 |
| 49113 | 22222 | 已支付 | 439 | 2016-03-07 10:31:00 |
| 328158 | 22222 | 未支付 | 450 | NULL |
| 328548 | 22222 | 未支付 | 412 | NULL |
| 331328 | 22222 | 已支付 | 442 | 2016-04-07 08:45:00 |
+----------+---------+-----------+-------+---------------------+
匹配幾個字符之一
select *
from order_info_utf
where user_id regexp '[1,2,3]1111'
order by user_id;
[] 是另一種形式的 or 語句,它的意思是匹配中括號的內(nèi)容
+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time |
+----------+---------+-----------+-------+---------------------+
| 432821 | 11111 | 已支付 | 818 | 2016-04-18 13:16:00 |
| 515923 | 21111 | 已支付 | 1139 | 2016-04-27 18:54:00 |
| 93287 | 31111 | 已支付 | 589 | 2016-03-11 21:36:00 |
| 240508 | 31111 | 已支付 | 521 | 2016-03-28 07:31:00 |
+----------+---------+-----------+-------+---------------------+
如果使用中括號來進行篩選不想被展示的內(nèi)容,只需在中括號內(nèi)加上 ^ 字符即可,如:
select *
from order_info_utf
where user_id regexp '[^1,2,3]1111'
order by user_id;
輸出為:
+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time |
+----------+---------+-----------+-------+---------------------+
| 527086 | 101111 | 已支付 | 762 | 2016-04-28 22:58:00 |
| 538215 | 101111 | 已支付 | 601 | 2016-04-30 20:20:00 |
| 154261 | 41111 | 未支付 | 834 | NULL |
| 288954 | 41111 | 已支付 | 471 | 2016-04-01 23:55:00 |
| 46030 | 51111 | 未支付 | 986 | NULL |
| 93874 | 61111 | 未支付 | 485 | NULL |
| 20444 | 71111 | 已支付 | 436 | 2016-03-03 12:17:00 |
| 216118 | 71111 | 已支付 | 550 | 2016-03-25 08:22:00 |
| 258402 | 71111 | 已支付 | 954 | 2016-03-29 19:54:00 |
| 442332 | 71111 | 已支付 | 806 | 2016-04-19 12:48:00 |
| 95510 | 81111 | 已支付 | 716 | 2016-03-12 10:26:00 |
| 318583 | 91111 | 已支付 | 564 | 2016-04-05 22:35:00 |
+----------+---------+-----------+-------+---------------------+
匹配范圍
集合可用來定義要匹配的一個或多個字符
select *
from order_info_utf
where user_id regexp '[1-4]1111'
order by user_id;
此 sql 語句表示匹配 1-4 中任意一個字符與 1111 字符結(jié)合的所有數(shù)據(jù),只要符合此規(guī)則就會顯示(如果有 .11111 或 41111x 也滿足此規(guī)則),輸出為:
+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time |
+----------+---------+-----------+-------+---------------------+
| 432821 | 11111 | 已支付 | 818 | 2016-04-18 13:16:00 |
| 515923 | 21111 | 已支付 | 1139 | 2016-04-27 18:54:00 |
| 93287 | 31111 | 已支付 | 589 | 2016-03-11 21:36:00 |
| 240508 | 31111 | 已支付 | 521 | 2016-03-28 07:31:00 |
| 154261 | 41111 | 未支付 | 834 | NULL |
| 288954 | 41111 | 已支付 | 471 | 2016-04-01 23:55:00 |
+----------+---------+-----------+-------+---------------------+
匹配特殊字符
select *
from student
where sname regexp '\\@';
為了匹配特殊字符,必須用 \\ 為前導(dǎo)轉(zhuǎn)義。\\- 表示查找 -, \\. 表示查找 .,輸出為:
+------+---------+---------------------+------+
| SId | Sname | Sage | Ssex |
+------+---------+---------------------+------+
| 01 | 趙雷@ | 1990-01-01 00:00:00 | 男 |
| 02 | 錢電@ | 1990-12-21 00:00:00 | 男 |
+------+---------+---------------------+------+
| 元字符 | 說明 |
|---|---|
| \\f | 換頁 |
| \\n | 換行 |
| \\r | 回車 |
| \\t | 制表 |
| \\v | 縱向制表 |
匹配字符類
存在找出你自己經(jīng)常使用的數(shù)字、所有字母字符或所有數(shù)字字母字符等的匹配
| 類 | 說明 |
|---|---|
| [:alnum:] | 任意字母和數(shù)字(同[a-zA-Z0-9]) |
| [:cntrl:] | ASCII控制字符( ASCII 0到31和127) |
| [:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
| [:alpha:] | 任意字符(同[a-zA-Z]) |
| [:blank:] | 空格和制表(同[\t]) |
| [:digit:] | 任意數(shù)字(同[0-9]) |
| [:print:] | 任意可打印字符 |
| [:graph:] | 與[:print:]相同,但不包括空格 |
| [:lower:] | 任意小寫字母(同[a-z]) |
| [:space:] | 包括空格在內(nèi)的任意空白字符(同[\f\n\r\t\v]) |
| [:upper:] | 任意大寫字母(同[A-Z]) |
| [:xdigit:] | 任意十六進制數(shù)字(同[a-fA-F0-9]) |
匹配多個實例
| 元字符 | 說明 |
|---|---|
| * | 0 個或多個匹配 |
| + | 1個或多個匹配(等于 {1,}) |
| ? | 0 個或 1 個匹配(等于 {0,1}) |
| {n} | 指定數(shù)目的匹配 |
| {n,} | 不少于指定數(shù)目的匹配 |
| {n,m} | 匹配數(shù)目的范圍(m 不超過 255) |
示例如下:
select *
from goods
where name regexp '英寸一?';
此時的 一 出現(xiàn)次數(shù)為 0 或 1,具體輸出:
+----+---------------------------------------+--------------+------------+----------+
| id | name | cate_name | brand_name | price |
+----+---------------------------------------+--------------+------------+----------+
| 1 | r510vc 15.6英寸筆記本 | 筆記本 | 華碩 | 3399.000 |
| 2 | y400n 14.0英寸筆記本電腦 | 筆記本 | 聯(lián)想 | 4999.000 |
| 3 | g150th 15.6英寸游戲本 | 游戲本 | 雷神 | 8499.000 |
| 4 | x550cc 15.6英寸筆記本 | 筆記本 | 華碩 | 2799.000 |
| 6 | u330p 13.3英寸超極本 | 超級本 | 聯(lián)想 | 4299.000 |
| 8 | ipad mini 7.9英寸平板電腦 | 平板電腦 | 蘋果 | 1998.000 |
| 9 | ipad air 9.7英寸平板電腦 | 平板電腦 | 蘋果 | 3388.000 |
| 11 | ideacentre c340 20英寸一體電腦 | 臺式機 | 聯(lián)想 | 3499.000 |
| 13 | imac me086ch/a 21.5英寸一體電腦 | 臺式機 | 蘋果 | 9188.000 |
+----+---------------------------------------+--------------+------------+----------+
以下例子為字符類和重復(fù)元字符的結(jié)合使用:
select *
from goods
where name regexp '[:lower:]{6}';
此 sql 語句表示查詢 goods 表中 name 字段出現(xiàn)了 6 次小寫字母的所有數(shù)據(jù),輸出為:
+----+---------------------------------------+---------------------+------------+----------+
| id | name | cate_name | brand_name | price |
+----+---------------------------------------+---------------------+------------+----------+
| 10 | ipad mini 配備 retina 顯示屏 | 平板電腦 | 蘋果 | 2788.000 |
| 11 | ideacentre c340 20英寸一體電腦 | 臺式機 | 聯(lián)想 | 3499.000 |
| 12 | vostro 3800-r1206 臺式電腦 | 臺式機 | 戴爾 | 2899.000 |
| 16 | poweredge ii服務(wù)器 | 服務(wù)器/工作站 | 戴爾 | 5388.000 |
+----+---------------------------------------+---------------------+------------+----------+
定位符
| 元字符 | 說明 |
|---|---|
| ^ | 文本的開頭 |
| $ | 文本的結(jié)尾 |
| [[:<:]] | 詞的開始 |
| [[:>:]] | 詞的結(jié)尾 |
示例如下:
select *
from goods
where name regexp '^[im?]';
此 sql 表示查詢 goods 表中 name 字段是以 i 或 im 開頭的所有數(shù)據(jù),輸出為:
+----+---------------------------------------+---------------------+------------+-----------+
| id | name | cate_name | brand_name | price |
+----+---------------------------------------+---------------------+------------+-----------+
| 8 | ipad mini 7.9英寸平板電腦 | 平板電腦 | 蘋果 | 1998.000 |
| 9 | ipad air 9.7英寸平板電腦 | 平板電腦 | 蘋果 | 3388.000 |
| 10 | ipad mini 配備 retina 顯示屏 | 平板電腦 | 蘋果 | 2788.000 |
| 11 | ideacentre c340 20英寸一體電腦 | 臺式機 | 聯(lián)想 | 3499.000 |
| 13 | imac me086ch/a 21.5英寸一體電腦 | 臺式機 | 蘋果 | 9188.000 |
| 17 | mac pro專業(yè)級臺式電腦 | 服務(wù)器/工作站 | 蘋果 | 28888.000 |
+----+---------------------------------------+---------------------+------------+-----------+
like 和 regexp的不同在于, like 匹配整個串而 regexp 匹配子串。利用定位符,通過用 ^ 開始每個表達式,用 $ 結(jié)束每個表達式,可以使 regexp 的作用與 like 一樣