使用通配符过滤
使用LIKE关键字实现模糊查询
百分号(%)通配符 表示任何字符出现任意次数,但是不能匹配null
-- 8.1LIKE操作符
-- 利用通配符匹配
-- 8.1.1百分号(%)通配符
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%'; -- 找出所有以词jet开头的商品的id和名称
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%anvil%'; -- 找出所有商品名包含anvil字段的商品的id和名称
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 's%e'; -- 找出所有商品名以s开始以e结尾的商品的id和名称
划线(_)通配符表示任何字符出现1次,该通配符只匹配单个字符
-- 8.1.2下划线(_)通配符
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ ton anvil'; -- 匹配1个
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '% ton anvil'; -- 匹配多个
使用通配符的技巧
- 不过度使用,如果其他操作符能达到相同的目的,应该使用其他操作符
- 如果绝对有必要,否则不要将通配符放在最开始的地方,会导致索引失效
- 注意通配符的位置
用正则表达式进行搜索
正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较
通过REGEXP后跟的作为正则表达式进行处理
-- 9.2使用MySQL正则表达式
-- 9.2.1基本字符匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name; -- 检索列pro_name包含文本1000的所有行;
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name; -- 检索列pro_name包含文本.000的所有行,.表示任意一个字符;
LIKE与REGEXP区别
- LIKE是匹配整个列的,如果被匹配的文本在列值中出现是列值中的一部分,LIKE不会找到它,除非使用通配符
- REGEXP是在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到并返回相应行
- REGEXP可以用来匹配整个列值,使用^和&定位符实现
- 例:
SELECT prod_name FROM products WHERE prod_name LIKE '1000' ORDER BY prod_name; -- 没有返回值,
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name; -- 有返回值
-- 9.2.2进行OR匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name; -- 检索列pro_name包含文本1000或2000的所有行;
-- |表示匹配其中之一
-- 9.2.3匹配几个字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] ton' ORDER BY prod_name; -- [123]定义一组字符,表示匹配1或2或3,是[1|2|3]的简写
SELECT prod_name FROM products WHERE prod_name REGEXP '[1|2|3] ton' ORDER BY