正则表达式是一种为复杂搜索指定模式的强大方式。
第 23.1 节:REGEXP / RLIKE
REGEXP(或其同义词 RLIKE)运算符允许基于正则表达式的模式匹配。
考虑以下员工表:
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | PHONE_NUMBER | SALARY |
|---|---|---|---|---|
| 100 | Steven | King | 515.123.4567 | 24000.00 |
| 101 | Neena | Kochhar | 515.123.4568 | 17000.00 |
| 102 | Lex | De Haan | 515.123.4569 | 17000.00 |
| 103 | Alexander | Hunold | 590.423.4567 | 9000.00 |
| 104 | Bruce | Ernst | 590.423.4568 | 6000.00 |
| 105 | David | Austin | 590.423.4569 | 4800.00 |
| 106 | Valli | Pataballa | 590.423.4560 | 4800.00 |
| 107 | Diana | Lorentz | 590.423.5567 | 4200.00 |
| 108 | Nancy | Greenberg | 515.124.4569 | 12000.00 |
| 109 | Daniel | Faviet | 515.124.4169 | 9000.00 |
| 110 | John | Chen | 515.124.4269 | 8200.00 |
模式 ^
选择所有 FIRST_NAME 以 N 开头的员工:
SELECT * FROM employees WHERE FIRST_NAME REGEXP '^N'; -- 模式以...开头
模式 $
选择所有 PHONE_NUMBER 以 4569 结尾的员工:
SELECT * FROM employees WHERE PHONE_NUMBER REGEXP '4569$'; -- 模式以...结尾
NOT REGEXP
选择所有 FIRST_NAME 不以 N 开头的员工:
SELECT * FROM employees WHERE FIRST_NAME NOT REGEXP '^N'; -- 模式不以...开头
正则表达式包含
选择所有 LAST_NAME 包含 "in" 且 FIRST_NAME 包含 "a" 的员工:
SELECT * FROM employees
WHERE FIRST_NAME REGEXP 'a' AND LAST_NAME REGEXP 'in';
-- 没有 ^ 或 $,模式可以出现在任何位置
任意字符在 [ ] 中
选择所有 FIRST_NAME 以 A、B 或 C 开头的员工:
SELECT * FROM employees WHERE FIRST_NAME REGEXP '^[ABC]';
模式 |(或)
选择所有 FIRST_NAME 以 A、B 或 C 开头,或以 r、e 或 i 结尾的员工:
SELECT * FROM employees WHERE FIRST_NAME REGEXP '^[ABC]|[rei]$';
计数正则表达式匹配
考虑以下查询:
SELECT FIRST_NAME, FIRST_NAME REGEXP '^N' AS matching FROM employees;
FIRST_NAME REGEXP '^N' 的结果是 1 或 0,取决于 FIRST_NAME 是否匹配 ^N。
为了更好地可视化:
SELECT
FIRST_NAME,
IF(FIRST_NAME REGEXP '^N', 'matches ^N', 'does not match ^N') AS matching
FROM employees;
最后,统计匹配和不匹配的总行数:
SELECT
IF(FIRST_NAME REGEXP '^N', 'matches ^N', 'does not match ^N') AS matching,
COUNT(*)
FROM employees
GROUP BY matching;