MySQL使用正則表達式來更好地控制數(shù)據(jù)過濾
本章詳情
本文章將學(xué)習(xí)如何在MySQL WHERE子句內(nèi)使用正則表達式來更好地控制數(shù)據(jù)過濾。
正則表達式介紹
前言
- ??在前兩篇文章中的過濾例子允許用匹配、比較和通配操作符尋找數(shù)據(jù)。對于基本的過濾(或者甚至是某些不那么基本的過濾),這樣就足夠了。但隨著過濾條件的復(fù)雜性的增加,WHERE子句本身的復(fù)雜性也有必要增加。
- ??這也就是正則表達式變得有用的地方。正則表達式是用來匹配文本的特殊的串(字符集合)。如果你想從一個文本文件中提取電話號碼,可以使用正則表達式。如果你需要查找名字中間有數(shù)字的所有文件,可以使用一個正則表達式。如果你想在一個文本塊中找到所有重復(fù)的單詞,可以使用一個正則表達式。如果你想替換一個頁面中的所有URL為這些URL的實際HTML鏈接也可以使用一個正則表達式(對于最后這個例子或者是兩個正則表達式)。
- ??所有種類的程序設(shè)計語言、文本編輯器、操作系統(tǒng)等都支持正則表達式。有見識的程序員和網(wǎng)絡(luò)管理員已經(jīng)關(guān)注作為他們技術(shù)工具重要內(nèi)容的正則表達式很長時間了。
- ??正則表達式用正則表達式語言來建立,正則表達式語言是用來完成剛討論的所有工作以及更多工作的一種特殊語言。與任意語言一樣,正則表達式具有你必須學(xué)習(xí)的特殊的語法和指令。
使用MySQL正則表達式
那么,正則表達式與MySQL有何關(guān)系?在上述前言已經(jīng)說過,正則表達式的作用是匹配文本,將一個模式(正則表達式)與一個文本串進行比較。MySQL用WHERE子句對正則表達式提供了初步的支持,允許你指定正則表達式過濾SELECT檢索出的數(shù)據(jù)
僅為正則表達式語言的一個子集
如果你熟悉正則表達式,需要注意:MySOL僅支持多數(shù)正則表達式實現(xiàn)的一個很小的子集。本章介紹MySOL支持的大多數(shù)內(nèi)容。
舉例子分析
我們從一個非常簡單的例子開始。下面的語句檢索列prod_name包含文本1000的所有行:
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
分析
除關(guān)鍵字LIKE被REGEXP替代外,這條語看上去非常像使用LIKE的語句。它告訴MySQL: REGEXP后所跟的東西作為正則表達式**(與文字正文1000匹配的一個正則表達式)**處理。
輸出
**為什么要費力地使用正則表達式?**在剛才的例子中,正則表達式確實沒有帶來太多好處(可能還會降低性能),不過,請考慮下面的例子:
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
輸出
分析
這里使用了正則表達式.000。.是正則表達式語言中一個特殊的字符。它表示匹配任意一個字符,因此,1000和2000都匹配且返回
匹配不區(qū)分大小寫
MySQL中的正則表達式匹配(自版本3.23.4后)不區(qū)分大小寫(即,大寫和小寫都匹配)為區(qū)分大小寫,可使用BINARY關(guān)鍵字,如WHERE prod_name REGEXP BINARY ‘JetPack .000’
進行OR匹配
為搜索兩個串之一(或者為這個串,或者為另一個串),使用|,如下所示:
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
輸出
分析
語句中使用了正則表達式1000|2000。|為正則表達式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回
注意
使用|從功能上類似于在SELECT語句中使用OR語句,多個OR條件可并入單個正則表達式。
兩個以上的OR條件
例如兩個以上的OR條件1000 | 2000 | 3000將匹配1000或2000或3000
匹配幾個字符之一
匹配任何單一字符。但是,如果你只想匹配特定的字符,怎么辦?可通過指定一組用[和]括起來的字符來完成,如下所示:
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
輸出
分析
這里,使用了正則表達式[123] Ton。[123]定義一組字符它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回(沒有3 ton)。
正如所見,[]是另一種形式的OR語句。事實上,正則表達式[123]Ton為[1|2|3]Ton的縮寫,也可以使用后者。但是,需要用[]來定義OR語句查找什么。為更好地理解這一點,請看下面的例子:
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton' ORDER BY prod_name;
輸出
分析
這并不是期望的輸出。兩個要求的行被檢索出來,但還檢索出了另外3行。之所以這樣是由于MySQL假定你的意思是1或2或3 ton’。除非把字符1括在一個集合中,否則它將應(yīng)用于整個串
字符集合也可以被否定,即,它們將匹配除指定字符外的任何東西為否定一個字符集,在集合的開始處放置一個^即可。因此,盡管[123]匹配字符1、2或3,但[ ^123]卻匹配除這些字符外的任何東西。
匹配范圍
提示
集合可用來定義要匹配的一個或多個字符。例如,下面的集合將匹配數(shù)字0到9:[0123456789]
- 為簡化這種類型的集合,可使用-來定義一個范圍。下面的式子功能上等同于上述數(shù)字列表:[0-9]
- 范圍不限于完整的集合,[1-3]和[6-9]也是合法的范圍。此外,范圍不一定只是數(shù)值的,[a-z]匹配任意字母字符。
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
輸出
分析
這里使用正則表達式[1-5] Ton。[1-5]定義了一個范圍,這個表達式意思是匹配1到5,因此返回3個匹配行。由于5 ton匹配,所以返回.5 ton。
匹配特殊字符
正則表達式語言由具有特定含義的特殊字符構(gòu)成。我們已經(jīng)看到.[]、|和-等,還有其他一些字符。請問,如果你需要匹配這些字符,應(yīng)該怎么辦呢?例如,如果要找出包含.字符的值,怎樣搜索?請看下面的例子:
輸入
SELECT vend_name FROM vendors WHERE vend_name REGEXP '.' ORDER BY vend_name;
輸出
分析
這并不是期望的輸出,.匹配任意字符,因此每個行都被檢索出來。
為了匹配特殊字符,必須用11為前導(dǎo)。1l-表示查找-, 表示查找.
輸入
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;
輸出
分析
這才是期望的輸出。ll.匹配.,所以只檢索出一行。這種處理就是所謂的轉(zhuǎn)義 (escaping),正則表達式內(nèi)具有特殊意義的所有字符都必須以這種方式轉(zhuǎn)義。這包括.、1、[]以及迄今為止使用過的其他特殊字符。
匹配字符類
?存在找出你自己經(jīng)常使用的數(shù)字、所有字母字符或所有數(shù)字字母字符等的匹配。為更方便工作,可以使用預(yù)定義的字符集,稱為字符類character class)。表9-2列出字符類以及它們的含義。
字符類*
匹配多個實例
概要
目前為止使用的所有正則表達式都試圖匹配單次出現(xiàn)。如果存在一個匹配,該行被檢索出來,如果不存在,檢索不出任何行。但有時需要對匹配的數(shù)目進行更強的控制。例如,你可能需要尋找所有的數(shù),不管數(shù)中包含多少數(shù)字,或者你可能想尋找一個單詞并且還能夠適應(yīng)一個尾隨的s(如果存在),等等。
重復(fù)元字符
舉例分析
下面舉幾個例子。
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)' ORDER BY prod_name;
輸出
分析
正則表達式1([0-9] sticks?\)需要解說一下。l1(匹配)[0-9]匹配任意數(shù)字(這個例子中為1和5),sticks?匹配stick和sticks (s后的?使s可選,因為?匹配它前面的任何字符的0次或1次出現(xiàn)),\)匹配)。沒有?,匹配stick和sticks會非常困難。
定位符
目前為止的所有例子都是匹配一個串中任意位置的文本。為了匹配特定位置的文本,需要使用表列出的定位符
定位符表
舉例概述
例如,如果你想找出以一個數(shù) (包括以小數(shù)點開始的數(shù)) 開始的所有產(chǎn)品,怎么辦?簡單搜索0-9\.不行,因為它將在文本內(nèi)任意位置查找匹配。解決辦法是使用~定位符,如下所示
輸入
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;
匹配串的開始。因此,^ [0-91\.]只在或任意數(shù)字為串中第一個字符時才匹配它們。沒有^,則還要多檢索出4個別的行(那些中間有數(shù)字的行)。
如何鞏固學(xué)習(xí)
提示:在學(xué)習(xí)的過程中,我們需要先自行進行思考,而不是一遇到不會的就放棄思考直接看答案,如果最后遇到真的不會的題目,我們可以適當?shù)倪M行觀看答案,看自己的思路是否正確,在作出正確的判斷
總結(jié)
到此這篇關(guān)于MySQL使用正則表達式來更好地控制數(shù)據(jù)過濾的文章就介紹到這了,更多相關(guān)MySQL正則表達式進行搜索內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 5.6 解壓縮版安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細介紹了MySQL for Windows 解壓縮版安裝配置的相關(guān)資料,需要的朋友可以參考下2016-07-07MySQL查詢學(xué)習(xí)之基礎(chǔ)查詢操作
這篇文章主要給大家介紹了關(guān)于MySQL查詢學(xué)習(xí)之基礎(chǔ)查詢操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Mysql的Binlog數(shù)據(jù)恢復(fù):不小心刪除數(shù)據(jù)庫詳解
這篇文章主要介紹了Mysql的Binlog數(shù)據(jù)恢復(fù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04mysql 5.5 開啟慢日志slow log的方法(log_slow_queries)
MySQL中提供了一個慢查詢的日志記錄功能,可以把查詢SQL語句時間大于多少秒的語句寫入慢查詢?nèi)罩?,日常維護中可以通過慢查詢?nèi)罩镜挠涗浶畔⒖焖贉蚀_地判斷問題所在2016-05-05Centos中安裝多個mysql數(shù)據(jù)的配置實例
最近因為單位項目擴充,需要在原線上數(shù)據(jù)庫服務(wù)器上加裝一個mysql實例(實際上就是從新編譯安裝一個非3306的自定義端口,不同目錄的mysql),研究了一天,終于順利搞定,這里把配置步驟發(fā)給大家,供大家學(xué)習(xí)使用2014-04-04MySql中如何使用 explain 查詢 SQL 的執(zhí)行計劃
explain命令是查看查詢優(yōu)化器如何決定執(zhí)行查詢的主要方法。這篇文章重點給大家介紹MySql中如何使用 explain 查詢 SQL 的執(zhí)行計劃,感興趣的朋友一起看看吧2018-05-05