标签:通配 搜索 regexp 次数 超过 多少 意义 加油 替代
WHERE
子句使用SELECT
语句的WHERE
子句指定搜索条件。
WHERE
子句的操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
WHERE
子句AND
子句的方式OR
子句的方式AND
操作符为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。
SELECT prod_id, prod_price, prod_name
FROM prodducts
WHERE vend_id = 1004 AND prod_price <= 10;
AND
用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
OR
操作符OR
操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
SELECT prod_id, prod_price, prod_name
FROM prodducts
WHERE vend_id = 1002 OR vend_id = 1003;
OR
:WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
AND
与OR
组合WHERE可包含任意数目的AND
和OR
操作符。允许两者结合以进行复杂和高级的过滤。
注意: SQL(像多数语言一样)在处理OR
操作符前,优先处理AND
操作符。
SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。
IN
操作符圆括号在WHERE子句中还有另外一种用法。IN
操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
IN
取合法值的由逗号分隔的清单,全都括在圆括号中。
SELECT prod_name, prod_price
FROM products
WHERE vend_id IN (1002, 1003)
ORDER BY prod_name;
IN
操作符完成与OR
相同的功能。NOT
操作符NOT
:WHERE子句中用来否定后跟条件的关键字。
SELECT prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002, 1003)
ORDER BY prod_name;
LIKE
操作符 **通配符 用来匹配值的一部分的特殊字符。
搜索模式 由字面值、通配符或两者组合构成的搜索条件。
%表示任何字符出现任意次数。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE ‘jet%‘;
在执行这条子句时,将检索任意以jet
起头的词。%
告诉MySQL接受jet之后的任意字符,不管它有多少字符。
%
代表搜索模式中给定位置的0个、1个或多个字符。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE ‘_ ton anvil‘;
%
能匹配0个字符不一样,_
总是匹配一个字符,不能多也不能少。正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较;
MySQL用WHERE
子句对正则表达式提供了初步的支持,允许我们指定正则表达式,过滤SELECT
检索出来的数据。
注意: MySQL仅支持多数正则表达式实现的一个很小的子集。
-- LIKE 没有匹配成功,不返回数据
SELECT prod_name
FROM products
WHERE prod_name LIKE ‘1000‘
ORDER BY prod_name;
-- REGEXP 匹配成功,返回数据
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘1000‘
ORDER BY prod_name;
REGEXP
替代外,这条语句看上去非常像使用LIKE的语句。它告诉MySQL:REGEXP
后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理;LIKE
匹配整个列,如果被匹配的文本在列值中出现(在列值中出现的意思是包含在列值中,而不是列值,比如上面的‘1000‘,它就在‘1000 ton‘中出现),LIKE
将不会找到它,相应的行也不会被返回(除非使用通配符%,_)。换句话说,LIKE
后面被匹配的文本要和列值一样;REGEXP
在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP
将会找到它,相应的行将被返回;REGEXP
可以通过^
和$
定位符来匹配整个列值,达到LIKE
的相同作用。SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘1000|2000‘
ORDER BY prod_name;
|
为正则表达式的OR
操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘[123] Ton‘
ORDER BY prod_name;
[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回(没有3 ton)。
事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写,也可以使用后者。
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘1|2|3 Ton‘
ORDER BY prod_name;
字符集合也可以被否定,即它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个^
即可。[123]匹配字符1、2或3,但[ ^123 ]却匹配除这些字符外的任何东西
为了匹配特殊字符,必须用\\
为前导,\\-
表示查找 - ,\\.
表示查找 . 。
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP ‘\\.‘
ORDER BY vend_name;
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
**匹配\ ** 为了匹配反斜杠(\)字符本身,需要使用\\\
。
\或\? 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。
可以使用预定义的字符集,称为字符类。
类 | 说明 |
---|---|
[:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符(同[a-zA-Z]) |
[:blank:] | 空格和制表(同[\t]) |
[:cntrl:] | ASCII控制字符(ASCII 0到31和127) |
[:digit:] | 任意数字(同[0-9]) |
[:graph:] | 与[:print:]相同,但不包括空格 |
[:lower:] | 任意小写字母(同[a-z]) |
[:print:] | 任意可打印字符 |
[:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
[:space:] | 包括空格在内的任意空白字符(同[\f\n\r\t\v]) |
[:upper:] | 任意大写字母(同[A-Z]) |
[:xdigit:] | 任意十六进制数字(同[a-fA-F0-9]) |
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘\\([0-9] sticks?\\)‘
ORDER BY prod_name;
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘[[:digit:]]{4}‘
ORDER BY prod_name;
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘^[0-9\\.]‘
ORDER BY prod_name;
^
开始每个表达式,用$
结束每个表达式,可以使REGEXP的作用与LIKE一样。主要是匹配字符串,使用LIKE和REGEXP,通配符和正则表达式。不知道第几次看正则表达式的内容了,这次看清晰了很多,也感觉它没有以前想象得这么难了。多看多学吧,加油!
标签:通配 搜索 regexp 次数 超过 多少 意义 加油 替代
原文地址:https://www.cnblogs.com/ly-leah/p/13722754.html