MySQL數(shù)據(jù)庫中正則表達(dá)式(Regex)和like的區(qū)別詳析
核心區(qū)別:通配符 vs 模式語言
LIKE:使用簡單的通配符%:匹配任意多個(gè)字符(包括0個(gè))_:匹配單個(gè)字符
正則表達(dá)式:使用完整的模式描述語言
具體對比
1.匹配能力對比
| 需求場景 | LIKE 實(shí)現(xiàn) | 正則表達(dá)式實(shí)現(xiàn) | 說明 |
|---|---|---|---|
| 以"A"開頭 | LIKE 'A%' | ^A | 兩者都能做到 |
| 包含"abc" | LIKE '%abc%' | abc | 兩者都能做到 |
| 精確5個(gè)字符 | LIKE '_____' | ^.{5}$ | LIKE需要5個(gè)_,不直觀 |
| 數(shù)字開頭 | ? 無法實(shí)現(xiàn) | ^\d | LIKE無法匹配"任意數(shù)字" |
| 郵箱驗(yàn)證 | ? 極其困難 | ^\w+@\w+\.\w+$ | LIKE難以精確匹配 |
| 密碼強(qiáng)度 | ? 無法實(shí)現(xiàn) | ^(?=.*[A-Z])(?=.*\d).{8,}$ | LIKE無法做前瞻斷言 |
2.實(shí)際案例演示
假設(shè)我們有一個(gè)用戶表,要查找符合以下條件的用戶名:
需求:找到以數(shù)字開頭,第三個(gè)字符是元音字母,總長度至少為5的用戶名
sql
-- 使用 LIKE 幾乎不可能實(shí)現(xiàn)
-- 我們需要枚舉所有可能性:
SELECT * FROM users WHERE
name LIKE '0_a%' OR
name LIKE '1_a%' OR
name LIKE '2_a%' OR
-- ... 需要寫30種組合,極其繁瑣!
name LIKE '9_u%';
-- 使用正則表達(dá)式 一行搞定
SELECT * FROM users WHERE name REGEXP '^[0-9].[aeiou].{2,}';
-- 解釋:^[0-9] 數(shù)字開頭, . 任意字符, [aeiou] 元音字母, .{2,} 至少2個(gè)任意字符3.性能考慮
LIKE:在固定開頭的情況下(如'A%')可以利用索引,性能較好正則表達(dá)式:通常無法利用索引,全表掃描,性能較差
sql
-- 能利用索引(如果name有索引) SELECT * FROM users WHERE name LIKE 'John%'; -- 不能利用索引 SELECT * FROM users WHERE name LIKE '%John%'; SELECT * FROM users WHERE name REGEXP 'John';
4.適用場景總結(jié)
| 場景 | 推薦使用 | 原因 |
|---|---|---|
| 簡單前綴/后綴匹配 | LIKE | 語法簡單,可能利用索引 |
| 固定格式匹配 | LIKE | 如 LIKE 'ABC____' |
| 復(fù)雜模式匹配 | 正則表達(dá)式 | 如郵箱、電話、特定模式 |
| 數(shù)據(jù)驗(yàn)證 | 正則表達(dá)式 | 如密碼強(qiáng)度、格式檢查 |
| 數(shù)據(jù)提取 | 正則表達(dá)式 | 如從文本中提取特定模式 |
結(jié)論
您的觀察是對的——對于簡單的模式匹配,LIKE 確實(shí)可以做到,而且應(yīng)該優(yōu)先使用,因?yàn)樗男阅芸赡芨谩?/p>
但是當(dāng)需求變得復(fù)雜時(shí):
LIKE就像是一把螺絲刀——適合簡單的擰螺絲工作正則表達(dá)式就像是一個(gè)多功能工具箱——能處理各種復(fù)雜的維修任務(wù)
經(jīng)驗(yàn)法則:
能用
LIKE解決的簡單問題,就用LIKE當(dāng)
LIKE需要寫很長的OR條件或者根本無法實(shí)現(xiàn)時(shí),就使用正則表達(dá)式
在實(shí)際的數(shù)據(jù)庫工作中,兩者都是重要的工具,根據(jù)具體需求選擇合適的使用才是關(guān)鍵!
到此這篇關(guān)于MySQL數(shù)據(jù)庫中正則表達(dá)式(Regex)和like區(qū)別的文章就介紹到這了,更多相關(guān)MySQL正則表達(dá)式Regex和like區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 5.5.x my.cnf參數(shù)配置優(yōu)化詳解
今天正好看到一篇有關(guān)my.cnf優(yōu)化的總結(jié),雖然還沒經(jīng)過我自己的實(shí)踐檢驗(yàn),但從文章內(nèi)容來說已經(jīng)寫的很詳細(xì)了(當(dāng)然,事實(shí)上下面這篇文章很多地方只是翻譯了my.cnf原始配置文件的說明,呵呵),所以特地轉(zhuǎn)載收藏一下2015-08-08
提升MySQL查詢效率及查詢速度優(yōu)化的四個(gè)方法詳析
查詢語句的優(yōu)化是提高M(jìn)ySQL查詢速度的重要方法,可以通過使用JOIN語句、子查詢、優(yōu)化where子句等方式來減少查詢的時(shí)間,下面這篇文章主要給大家介紹了關(guān)于提升MySQL查詢效率及查詢速度優(yōu)化的四個(gè)方法,需要的朋友可以參考下2023-04-04
mysql數(shù)據(jù)庫提權(quán)的三種方法
文介紹了MySQL數(shù)據(jù)庫的三種提權(quán)方法:UDF提權(quán)、MOF提權(quán)和啟動(dòng)項(xiàng)提權(quán),同時(shí)列出了一些常見數(shù)據(jù)庫及其默認(rèn)端口,下面就來介紹一下,感興趣的可以了解一下2024-09-09
mysql連接的空閑時(shí)間超過8小時(shí)后 MySQL自動(dòng)斷開該連接解決方案
MySQL 的默認(rèn)設(shè)置下,當(dāng)一個(gè)連接的空閑時(shí)間超過8小時(shí)后,MySQL 就會(huì)斷開該連接,而 c3p0 連接池則以為該被斷開的連接依然有效。在這種情況下,如果客戶端代碼向 c3p0 連接池請求連接的話,連接池就會(huì)把已經(jīng)失效的連接返回給客戶端,客戶端在使用該失效連接的時(shí)候即拋出異常2012-11-11
mysql 使用inet_aton和inet_ntoa處理ip地址數(shù)據(jù)的實(shí)例
下面小編就為大家?guī)硪黄猰ysql 使用inet_aton和inet_ntoa處理ip地址數(shù)據(jù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
MySQL建立數(shù)據(jù)庫時(shí)字符集與排序規(guī)則的選擇詳解
當(dāng)數(shù)據(jù)庫需要適應(yīng)不同的語言就需要有不同的字符集,下面這篇文章主要給大家介紹了關(guān)于MySQL建立數(shù)據(jù)庫時(shí)字符集與排序規(guī)則的選擇的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要區(qū)別整理
這篇文章主要介紹了MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要區(qū)別整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-08-08

