文章目录
- 1.概述
- 2.LIKE关键字
- 3.百分号(%)通配符
- 3.1 单个百分号(%)通配符
- 3.2 多个百分号(%)通配符
- 3.3 在值的中间使用百分号(%)通配符
- 3.4 注意事项
- 4.下划线(_)通配符
- 5.使用通配符的技巧
1.概述
通配符是用来匹配值的一部分的特殊字符;
本小节介绍如何使用通配符以及怎样使用LIKE关键字进行通配搜索,以便于对数据进行复杂过滤;
2.LIKE关键字
前面介绍过所有操作符都是针对已知值进行过滤的,不管是匹配一个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,共同点是过滤中使用的值都是已知的。
但是这种过滤方法并不是任何时候都好用。例如,搜索产品名中包含文本anvil的所有产品时,用简单的比较操作符肯定是不行的,必须使用通配符。
利用通配符可以创建比较特定的搜索模式,在这个例子中,如果你想找出名称中包含anvil的所有产品,可以构造一个通配符搜索模式,找出产品中任何位置出现anvil的产品。
为在搜索子句中使用通配符,需要使用LIKE关键字,LIKE指示MySql后跟的搜索模式使用通配符匹配,而不是直接相等匹配进行搜索。
3.百分号(%)通配符
最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。
3.1 单个百分号(%)通配符
例如,为了找出所有以jet开头的产品,可以使用下列SQL:
输入:
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE 'jet%';
输出:
此例子使用了搜索模式 ‘jet%’。在执行子句时,将查询任意以jet开头的词,不管后续有多少字符,什么字符,%都告诉SQL匹配它;
3.2 多个百分号(%)通配符
通配符可以在搜索模式中的任意位置使用,并且可以使用多个通配符。下列的例子将使用俩个通配符,且位于模式的俩端:
输入:
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '%anvil%';
输出:
此例子使用了搜索模式 ‘%anvil%’。在执行子句时,%通配符告诉SQL将匹配任意位置文本包含 anvil 的值,而不论 anvil 之前或之后出现什么值,出现多少值,哪怕是没有,以anvil开头的也匹配;
3.3 在值的中间使用百分号(%)通配符
通配符也可以使用在搜索模式的中间,虽然这没什么用,例如下列例子中,查找以s开头,e结尾的产品:
输入:
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE 's%e';
输出:
3.4 注意事项
使用百分号(%)通配符时需要注意:
- 注意百分号(%)通配符能匹配任意多的字符,哪怕是0个也是匹配的;
- 注意百分号(%)通配符使用时字符出现空格,尤其是尾空格,如 WHERE prod_name LIKE ‘%anvil’ 中如果查询的数据anvil后跟着一个空格,那么将不匹配它,因为在SQL中 anvil 与 anvil加一个空格,代表不一样的含义,你可以在尾部也增加一个通配符,或者通过后期学习的函数去处理数据;
- 要特别注意NULL值,虽然百分号(%)通配符可以匹配任意字符,但是NULL并不代表任何字符,使用通配符没有任何办法可以匹配它,只能通过 IS NULL 来查询;
4.下划线(_)通配符
另外一个有用的通配符就是下划线(_)。
下划线(_)的用途与%通配符一样,但下划线只能匹配一个字符,而不是多个。
输入:
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';
输出:
此WHERE子句的搜索模式给出了后面跟有文本的通配符。结果只显示匹配搜索模式的行,第一行中下划线匹配字符1,第二行中下划线匹配字符2;
. 5 ton anvil 产品没有匹配,因为搜索模式要求匹配俩个通配符,而不是一个。对比下列使用%通配符的结果,即可直观了解俩者的差别:
输入:
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '% ton anvil';
输出:
甚至去掉%后跟着的括号也是同样的结果;
与%不同的就是,_只能匹配一个字符,不能多也不能少;
5.使用通配符的技巧
虽然通配符很有用,但是使用通配符花费的时间要比前序介绍的查询方法都长,所以日常使用通配符时,要注意以下事项:
- 不要过度使用,能用其他方式达到同样效果的,优先选择其他方式;
- 在必须要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处,这样会导致搜索的效率是最慢的;
- 要注意通配符使用时放置的位置,位置错误会导致查询结果可能不是你想要的;