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=

 

相關文章
相關標籤/搜索