正则表达式是一种为复杂搜索指定模式的强大方式。

第 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;