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...
  • 相关阅读:
    蓝牙的HFP协议笔记
    23种设计模式
    读QT5.7源码(三)Q_OBJECT 和QMetaObject
    实现私有化(Pimpl) --- QT常见的设计模式
    蓝牙Profile的概念和常见种类(转)
    git分支合并
    git log的常见用法
    QThread详解
    git查看某个文件的修改历史
    因为代理原因导致的NotSerializableException
  • 原文地址:https://www.cnblogs.com/ly-leah/p/13722754.html
Copyright © 2011-2022 走看看