MySql系列:正则表达式和数据过滤

 引言

鼓励有时比压力要重要!java

在学习的过程当中,不少时候咱们听到的都是,你要怎样,怎样,你瞧瞧谁谁谁,哪怕今天听不到这样的声音了,但由于曾经反复听到过而致使心里抗拒。虽然也知道本身要去学,可是很难坚持,学着学着就没有了方向,看到还有那么多不会的就更慌了,以致于最后心态崩了,更不肯意学。其实程序员的压力并不小,想成长几乎是须要一直的学习,就像彷佛不再敢说精通java了同样,知识量实在是随着学习的深刻,愈来愈深,愈来愈广。因此须要,开心学习,快乐成长!mysql

咱们都知道到MySQL能够经过 LIKE ...% 来进行模糊匹配。git

MySQL 一样也支持其余正则表达式的匹配, MySQL 中使用 REGEXP 操做符来进行正则表达式匹配。程序员


表达式

正则表达式的做用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用 WHERE 子句对正则表达式提供了初步的支持,容许你指定正则表达式,过滤 SELECT 检索出的数据。正则表达式

下表中的正则模式可应用于 REGEXP 操做符中sql


模式 描述
^ 匹配输入字符串的开始位置。若是设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 以后的位置。
$ 匹配输入字符串的结束位置。若是设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 以前的位置。
. 匹配除 "\n" 以外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]'
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 能够匹配 "plain" 中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 能够匹配 "plain" 中的'p'。
p1 p2 p3 匹配 p1 或 p2 或 p3。例如,'z
  • |匹配前面的子表达式零次或屡次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+|匹配前面的子表达式一次或屡次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 {n}|n 是一个非负整数。匹配肯定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',可是能匹配 "food" 中的两个 o。 {n,m}|m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。数据库

基本字符匹配:ide

REGEXP关键字来匹配正则学习

SELECT name FROM tab1 WHERE name REGEXP 'abc'; //REGEXP后所跟的东西做为正则表达式ui

  • '.'是以匹配任意一个字符
  • 'a|b'能够匹配了两个a或者
  • '[abc]'能够匹配abc中的某一个字符
  • '[^a]'匹配除a之外的数据
  • '[1-9]'匹配1到9中的任何一个数字,[a-z]和[A-Z]同[1-9]
  • ''是至关于转义字符
  • SELECT name FROM tab1 WHERE name REGEXP 'a|b';

匹配字符类:

  • [: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)

将以上的字符放在你想匹配的字符的后面,便可匹配多个字符

eg:

SELECT 列名... FROM 表名 WHERE 列名 REGEXP 'a*'; 匹配0个和多个a
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

定位符:

  • '^' 匹配文本的开始
  • '$' 匹配文本的结尾
  • [[:<:]] 匹配词的开始
  • [[:>:]] 匹配词的结尾

匹配特殊字符使用\进行转义:

  • \.可以匹配.
  • \f换页
  • \n换行
  • \r回车
  • \t制表
  • \纵向制表
  • 注意:为了匹配\自己,须要使用\\

示例:

查询找到全部的名字以'st'开头

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查询找到全部的名字以'ok'结尾

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查询找到全部的名字包函'mar'的字符串 mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查询找到全部名称以元音开始和'ok'结束 的 mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

一个正则表达式中的可使用如下保留字

^

所匹配的字符串之后面的字符串开头\

mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配)
mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配)

$

所匹配的字符串之前面的字符串结尾
mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配)
mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配)

.

匹配任何字符(包括新行)
mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配)
mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配)

a*

匹配任意多个a(包括空串)
mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配)
mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配)
mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)

a+

匹配任意多个a(不包括空串) \ mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配)
mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配)

a?

匹配一个或零个a \
mysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配)
mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配)
mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)

de|abc

匹配de或abc
mysql> select "pi" REGEXP "pi|apa"; -> 1(表示匹配)
mysql> select "axe" REGEXP "pi|apa"; -> 0(表示不匹配)
mysql> select "apa" REGEXP "pi|apa"; -> 1(表示匹配)
mysql> select "apa" REGEXP "^(pi|apa)$"; ->> 1(表示匹配)
mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配)
mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配)

(abc)*

匹配任意多个abc(包括空串)
mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配)
mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配)
mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配)

[a-dX]

匹配“a”、“b”、“c”、“d”或“X”

[^a-dX]

匹配除 “a”、“b”、“c”、“d”、“X” 之外的任何字符。

“[”、“]”必须成对使用 \ mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配)
mysql> select "aXbc" REGEXP"^[a-dXYZ]$"; -> 0(表示不匹配)
mysql> select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1(表示匹配)
mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)
mysql> select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1(表示匹配)
mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)

数据过滤


WHERE子句

在咱们使用数据库时,一般只会根据特定条件提取表数据的子集。只检索所需数据须要指定搜索条件(search criteria),搜索条件也称为过滤条件(filtercondition)。

SELECT name, age FROM sys_user WHERE age=18;

返回age=18的行
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

WHERE子句支持的操做符

= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于

大于
= 大于等于
BETWEEN 在指定的两个值之间

eg:
//获取age大于20的数据
SELECT name,age FROM sys_user WHERE age>20; 

//获取age在12到18之间的数据,包括12和18
SELECT name,age FROM sys_user WHERE age BETWEEN 12AND 18;
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

另外一个特殊子句

IS NULL用来返回为空的数据

SELECT name, age FROM sys_user  WHERE name IS NULL;
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

比较运算符

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

组合 WHERE 子句

使用AND或者OR子句,组合WHERE子句

//查询age=20而且name='cyj'的数据
SELECT name,age FROM sys_user WHERE age=20 AND name='cyj'; 

 //查询age=20或者age=50的数据
SELECT name,age FROM sys_user WHERE age=20 OR age=50;

AND和OR能够同时使用,不过AND的优先级高于OR,因此会先处理AND操做符,
另外能够用括号分组,明确的显示优先级.
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

IN 操做符

指定条件范围,范围中的每一个条件均可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。

//查询age在18,19或20......的全部数据,功能与OR类似. SELECT name,age FROM sys_user WHERE age IN (18,19,20,21,22,23);

IN相比于OR的一些好处:

1)在使用长的合法选项清单时,IN操做符的语法更清楚且更直观。
2)在使用IN时,计算的次序更容易管理
3)IN操做符通常比OR操做符清单执行更快
4) IN的能够包含其余SELECT语句,使得可以更动态地创建WHERE子句
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

NOT操做符

否认它以后所写的任何条件。

//查询age不在18,19或20的全部数据,功能与OR类似.
SELECT name,age FROM sys_user WHERE age NOT IN (18,19,20);
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

BETWEEN 与日期类型(NOT BETWEEN 与之相反)

当使用BETWEEN运算符与日期类型值时,要得到最佳结果,应该使用类型转换将列或表达式的类型显式转换为DATE类型。

  要查询获取所需日期(requiredDate)从2013-01-01到2013-01-31的全部订单,可是这里要注意(查询的日期AND后面的默认为2019-5-11 00:00:00)也就是说没法查询出2019-05-11当天日期。

SELECT orderNumber,
         requiredDate,
         status
FROM jmccsm_orders
WHERE requireddate
    BETWEEN CAST('2019-05-01' AS DATE)
        AND CAST('2019-5-11' AS DATE);
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

想知道怎么办么,请持续关注博主的博文(前台、后台、sql均可以处理哦)。

LIMIT

SELECT 语句中使用 LIMIT 子句来约束结果集中的行数。 LIMIT 子句接受一个或两个参数。两个参数的值必须为零或正整数。

语法:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

使用通配符过滤


LIKE操做符(NOT LIKE与之相反)

%通配符

%能够匹配表示任何字符出现任意次数

//能够匹配任何name以a开头的数据
SELECT name FROM sys_user WHERE name LINK 'cyj%';
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

通配符

下划线(_)。下划线只匹配单个字符,用法同%

注意

不要过分使用通配符。

若是其余操做符能达到相同的目的,应该使用其余操做符。

尽可能不要把它们用在搜索模式的开始处,由于速度会很慢
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

相关文章
相关标签/搜索