zoukankan      html  css  js  c++  java
  • 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:] 空格和制表(同[ ])
      [:cntrl:] ASCII控制字符(ASCII 0到31和127)
      [:digit:] 任意数字(同[0-9])
      [:graph:] 与[:print:]相同,但不包括空格
      [:lower:] 任意小写字母(同[a-z])
      [:print:] 任意可打印字符
      [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
      [:space:] 包括空格在内的任意空白字符(同[f v])
      [:upper:] 任意大写字母(同[A-Z])
      [:xdigit:] 任意十六进制数字(同[a-fA-F0-9])

    3.7 匹配多个实例

    元字符 说明
    * 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;
    
    • \(匹配 ) ,
    • [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...
  • 相关阅读:
    React生命周期, 兄弟组件之间通信
    React组件式编程Demo-用户的增删改查
    React之this.refs, 实现数据双向绑定
    CCF CSP 201812-4 数据中心
    CCF CSP 201812-4 数据中心
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    Codeforces 1245C Constanze's Machine
    Codeforces 1245C Constanze's Machine
    CCF CSP 201712-4 行车路线
  • 原文地址:https://www.cnblogs.com/ly-leah/p/13722754.html
Copyright © 2011-2022 走看看