MySQL基础02(正则表达式)

MySQL基础02(正则表达式)

1. 过滤数据


1.1 WHERE子句

使用SELECT语句的WHERE子句指定搜索条件。

WHERE子句的操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的两个值之间

1.2 组合WHERE子句

  1. AND子句的方式
  2. 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.3ANDOR组合

  • WHERE可包含任意数目的ANDOR操作符。允许两者结合以进行复杂和高级的过滤。

  • 注意: 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,通配符和正则表达式。不知道第几次看正则表达式的内容了,这次看清晰了很多,也感觉它没有以前想象得这么难了。多看多学吧,加油!

TO BE CONTINUED...
posted @ 2020-09-24 10:15  Haloya  阅读(101)  评论(0编辑  收藏  举报