SQL必知必会-读书笔记(六)

LIKE 操作符

  • LIKE 只能用于搜索字符串
  • LIKE 可以使用通配符
  • LIKE 支持的通配符有:
    1. ‘%’ :任意数量任意字符
    2. ‘_’ :单一的任意字符
    3. ‘[JD]’ : ‘[…]’用于指定字符集

REGEXP 操作符

REGEXP(也可以使用 RLIKE)用于更复杂的模式匹配,它支持正则表达式语法中的通配符:

  • **.**:表示任意单个字符。

    1
    SELECT * FROM employees WHERE name REGEXP '^J.n$';

    上述查询将返回名字是 “Jan”、”Jen”、”Jon” 等员工,但要求匹配的是完整的字符串。

  • **[ ]**:表示匹配括号内的任意字符。可以定义一个字符集或字符范围。

    1
    SELECT * FROM employees WHERE name REGEXP '^[JH]en$';

    上述查询将返回名字是 “Jen” 或 “Hen” 的员工。

  • **[^ ]**:表示匹配不在括号内的任意字符。

    1
    SELECT * FROM employees WHERE name REGEXP '^[^J]en$';

    上述查询将返回名字是 “Hen”、”Ken” 等,但不是 “Jen” 的员工。

  • *****:表示零个或多个前面的字符。

    1
    SELECT * FROM employees WHERE name REGEXP '^Jo*n$';

    上述查询将返回名字是 “Jn”、”Jon”、”Joon” 等员工。

  • **+**:表示一个或多个前面的字符。

    1
    SELECT * FROM employees WHERE name REGEXP '^Jo+n$';

    上述查询将返回名字是 “Jon”、”Joon” 等员工,但不包括 “Jn”。

  • **{n,m}**:表示前面的字符至少出现 n 次,最多出现 m 次。

    1
    SELECT * FROM employees WHERE name REGEXP '^J{1,2}on$';

    上述查询将返回名字是 “Jon” 或 “JJon” 的员工。

使用 ^ 开头的模式是为了确保匹配的字符串必须从开头开始符合指定的模式,如果没有 ^ ,就会变成只要满足通配符的任意位置的字符串

如果你想要匹配所有名字以 J 开头的员工,可以使用如下正则表达式:

1
SELECT * FROM employees WHERE name REGEXP '^J';

如果你省略 ^,则匹配的是包含 J 的任何位置的字符串。例如:

1
SELECT * FROM employees WHERE name REGEXP 'J';

这个查询将返回包含 J 的所有行,无论 J 在字符串中的哪个位置


示例

假设有一个 employees 表,其数据如下:

id name
1 Alice
2 Bob
3 Charlie
4 David
5 Eve
6 Jen
7 Jan
8 Jon

使用 LIKE 操作符和 % 通配符:

1
SELECT * FROM employees WHERE name LIKE 'J%';

结果将是:

id name
6 Jen
7 Jan
8 Jon

使用 REGEXP 操作符和 . 通配符:

1
SELECT * FROM employees WHERE name REGEXP '^J.n$';

结果将是:

id name
7 Jan
8 Jon

结论

在 MySQL 中,LIKE 操作符支持 %_ 两个通配符,用于简单的模式匹配。而 REGEXP 操作符支持更复杂的正则表达式语法,包括 ., [ ], [^ ], *, +, {n,m} 等通配符。根据具体的查询需求,选择合适的通配符和操作符可以显著提高查询的灵活性和效率。