MySQL基础02(正则表达式)
MySQL基础02(正则表达式)
1. 过滤数据
1.1 WHERE
子句
使用SELECT
语句的WHERE
子句指定搜索条件。
WHERE
子句的操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
1.2 组合WHERE
子句
AND
子句的方式OR
子句的方式
1.2.1 AND
操作符
-
为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。
SELECT prod_id, prod_price, prod_name FROM prodducts WHERE vend_id = 1004 AND prod_price <= 10;
-
AND
用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
1.2.2OR
操作符
-
OR
操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。SELECT prod_id, prod_price, prod_name FROM prodducts WHERE vend_id = 1002 OR vend_id = 1003;
-
OR
:WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
1.2.3AND
与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操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。这时,SQL语句变成了选择由供应商1002或1003制造的且价格都在10美元(含)以上的任何产品。
-
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。
1.2.4IN
操作符
-
圆括号在WHERE子句中还有另外一种用法。
IN
操作符用来指定条件范围,范围中的每个条件都可以进行匹配。 -
IN
取合法值的由逗号分隔的清单,全都括在圆括号中。SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
- 此SELECT语句检索供应商1002和1003制造的所有产品。
IN
操作符完成与OR
相同的功能。
1.2.5NOT
操作符
-
NOT
:WHERE子句中用来否定后跟条件的关键字。SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;
- MySQL不是匹配1002和 1003 的 vend_id ,而是匹配 1002 和 1003 之外供应商的vend_id。
2. 用通配符进行过滤
**2.1 LIKE
操作符 **
-
通配符 用来匹配值的一部分的特殊字符。
-
搜索模式 由字面值、通配符或两者组合构成的搜索条件。
2.1.1 百分号(%)通配符
-
%表示任何字符出现任意次数。
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';
-
在执行这条子句时,将检索任意以
jet
起头的词。%
告诉MySQL接受jet之后的任意字符,不管它有多少字符。 -
%
代表搜索模式中给定位置的0个、1个或多个字符。
2.1.2 下划线(_)通配符
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';
- 与
%
能匹配0个字符不一样,_
总是匹配一个字符,不能多也不能少。
3. 用正则表达式进行搜索
正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较;
MySQL用WHERE
子句对正则表达式提供了初步的支持,允许我们指定正则表达式,过滤SELECT
检索出来的数据。
注意: MySQL仅支持多数正则表达式实现的一个很小的子集。
3.1 基本字符匹配
-- 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;
- 除关键字LIKE被
REGEXP
替代外,这条语句看上去非常像使用LIKE的语句。它告诉MySQL:REGEXP
后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理; LIKE
匹配整个列,如果被匹配的文本在列值中出现(在列值中出现的意思是包含在列值中,而不是列值,比如上面的'1000',它就在'1000 ton'中出现),LIKE
将不会找到它,相应的行也不会被返回(除非使用通配符%,_)。换句话说,LIKE
后面被匹配的文本要和列值一样;REGEXP
在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP
将会找到它,相应的行将被返回;REGEXP
可以通过^
和$
定位符来匹配整个列值,达到LIKE
的相同作用。
3.2 进行OR匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
- 语句中使用了正则表达式1000|2000。
|
为正则表达式的OR
操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。 - 使用|从功能上类似于在SELECT语句中使用OR语句,多OR条件可并入单个正则表达式。
3.3 匹配几个字符之一
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;
- MySQL假定你的意思是'1'或'2'或'3 ton'。除非把字符|括在一个集合中,否则它将应用于整个串。
-
字符集合也可以被否定,即它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个
^
即可。[123]匹配字符1、2或3,但[ ^123 ]却匹配除这些字符外的任何东西
3.4 匹配范围
- [0-9] :任意0-9之间的数字;
- [a-z] :任意小写字母;
- [A-Z]: 任意大写字母;
3.5 匹配特殊字符
-
为了匹配特殊字符,必须用
\\
为前导,\\-
表示查找 - ,\\.
表示查找 . 。SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;
- 这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须以这种方式转义。
元字符 说明 \\f 换页 \\n 换行 \\r 回车 \\t 制表 \\v 纵向制表 -
**匹配\ ** 为了匹配反斜杠(\)字符本身,需要使用
\\\
。 -
\或\? 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。
3.6 匹配字符集
-
可以使用预定义的字符集,称为字符类。
类 说明 [: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])
3.7 匹配多个实例
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
指定数目的匹配 | |
不少于指定数目的匹配 | |
匹配数目的范围(m不超过255) |
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;
- \\(匹配 ) ,
- [0-9]匹配任意数字(这个例子中为1和5),
- sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现)。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
- [:digit:]匹配任意数字,因而它为数字的一个集合。{4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。
3.7 定位符
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
- 匹配串的开始。因此,[0-9\.]表示只有.或任意数字为串中第一个字符时才匹配它们。
- ^的双重用途
- 在集合中,用它在来否定该集合;
- 在集合外,用来指串的开始处。
- LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用
^
开始每个表达式,用$
结束每个表达式,可以使REGEXP的作用与LIKE一样。
最后
主要是匹配字符串,使用LIKE和REGEXP,通配符和正则表达式。不知道第几次看正则表达式的内容了,这次看清晰了很多,也感觉它没有以前想象得这么难了。多看多学吧,加油!