最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL正則表達(dá)式進(jìn)行模糊查詢的完全指南

 更新時(shí)間:2026年02月10日 09:21:50   作者:怣50  
本文詳細(xì)介紹了正則表達(dá)式在數(shù)據(jù)庫(kù)中的應(yīng)用,包括基礎(chǔ)入門、高級(jí)匹配技巧、實(shí)戰(zhàn)應(yīng)用場(chǎng)景、性能優(yōu)化與最佳實(shí)踐,以及REGEXP和LIKE的全面對(duì)比,通過(guò)正則表達(dá)式,可以更高效地解決復(fù)雜的字符串匹配問(wèn)題,提高數(shù)據(jù)處理效率,需要的朋友可以參考下

前言:為什么需要正則表達(dá)式?

在日常開發(fā)中,你是否遇到過(guò)這樣的煩惱?

查找所有以"139"開頭的手機(jī)號(hào)

驗(yàn)證郵箱格式是否正確

提取文本中的日期信息

匹配特定格式的身份證號(hào)

傳統(tǒng)的 LIKE 操作符在這些復(fù)雜場(chǎng)景下力不從心,而正則表達(dá)式就是解決這些問(wèn)題的瑞士軍刀!

第一章:正則表達(dá)式基礎(chǔ)入門

1.1 什么是正則表達(dá)式?

正則表達(dá)式(Regular Expression)是一種用于描述字符串模式的強(qiáng)大工具。想象一下:

LIKE ‘%abc%’ 只能找包含"abc"的字符串

正則表達(dá)式可以找:"以a開頭,中間是任意數(shù)字,以c結(jié)尾"的字符串

1.2 MySQL中的正則表達(dá)式函數(shù)

MySQL提供了兩個(gè)主要的正則表達(dá)式函數(shù):

第二章:REGEXP基礎(chǔ)匹配

2.1 最簡(jiǎn)單的匹配:查找包含特定文本的記錄

sql
-- 傳統(tǒng)LIKE寫法
SELECT * FROM users 
WHERE username LIKE '%admin%';

-- 使用正則表達(dá)式(更直觀)
SELECT * FROM users 
WHERE username REGEXP 'admin';

-- 兩者的區(qū)別:
-- LIKE '%admin%' 可以匹配:superadmin、admin123、myadmin
-- REGEXP 'admin'  可以匹配:admin、administrator、badmin(同樣匹配?。?

2.2 匹配開頭和結(jié)尾

sql
-- 查找以"張"開頭的姓名
SELECT * FROM employees 
WHERE name REGEXP '^張';

-- 查找以"com"結(jié)尾的郵箱
SELECT * FROM users 
WHERE email REGEXP 'com$';

-- 查找以"139"開頭的手機(jī)號(hào)
SELECT * FROM customers 
WHERE phone REGEXP '^139';

-- 精確匹配"hello"(開頭到結(jié)尾都是hello)
SELECT * FROM messages 
WHERE content REGEXP '^hello$';

對(duì)比表:

2.3 匹配多個(gè)字符之一

sql
-- 查找姓"張"或"王"的員工
SELECT * FROM employees 
WHERE name REGEXP '^[張王]';

-- 查找包含數(shù)字0-5的電話
SELECT * FROM contacts 
WHERE phone REGEXP '[0-5]';

-- 查找元音字母開頭的單詞
SELECT * FROM articles 
WHERE title REGEXP '^[aeiouAEIOU]';

-- 排除性匹配:查找不是數(shù)字的字符
SELECT * FROM logs 
WHERE message REGEXP '[^0-9]';  -- ^在[]內(nèi)表示"非"

字符集說(shuō)明:

[abc]:匹配a、b或c中的任意一個(gè)

[a-z]:匹配任意小寫字母

[A-Z]:匹配任意大寫字母

[0-9]:匹配任意數(shù)字

[^abc]:匹配除了a、b、c之外的字符

第三章:高級(jí)匹配技巧

3.1 重復(fù)匹配:控制字符出現(xiàn)次數(shù)

sql
-- 精確匹配:包含3個(gè)連續(xù)數(shù)字
SELECT * FROM products 
WHERE product_code REGEXP '[0-9]{3}';

-- 范圍匹配:2到4個(gè)數(shù)字
SELECT * FROM orders 
WHERE order_no REGEXP '[0-9]{2,4}';

-- 至少匹配:3個(gè)或更多字母
SELECT * FROM books 
WHERE isbn REGEXP '[A-Z]{3,}';

-- 可選匹配:0個(gè)或1個(gè)字母
SELECT * FROM files 
WHERE filename REGEXP 'backup_[0-9]?\.sql';

-- 一個(gè)或多個(gè):匹配連續(xù)的數(shù)字
SELECT * FROM logs 
WHERE log_id REGEXP '[0-9]+';

-- 零個(gè)或多個(gè):匹配可能的前綴
SELECT * FROM configs 
WHERE key_name REGEXP 'debug_.*';

重復(fù)匹配符速查表:

3.2 分組和選擇

sql
-- 匹配"區(qū)號(hào)-電話號(hào)碼"格式
SELECT * FROM contacts 
WHERE phone REGEXP '^([0-9]{3,4})-([0-9]{7,8})$';

-- 查找多種日期格式
SELECT * FROM documents 
WHERE date_string REGEXP '(202[0-9]-[0-9]{2}-[0-9]{2})|([0-9]{2}/[0-9]{2}/202[0-9])';

-- 分組提取(MySQL 8.0+)
SELECT 
    phone,
    REGEXP_SUBSTR(phone, '^([0-9]{3,4})-([0-9]{7,8})$', 1, 1, '', 1) as area_code,
    REGEXP_SUBSTR(phone, '^([0-9]{3,4})-([0-9]{7,8})$', 1, 1, '', 2) as phone_number
FROM contacts 
WHERE phone REGEXP '^[0-9]{3,4}-[0-9]{7,8}$';

3.3 特殊字符和轉(zhuǎn)義

sql
-- 匹配點(diǎn)號(hào)(需要轉(zhuǎn)義)
SELECT * FROM files 
WHERE filename REGEXP '\.txt$';

-- 匹配包含方括號(hào)的內(nèi)容
SELECT * FROM logs 
WHERE message REGEXP '\\[error\\]';

– 常用特殊字符轉(zhuǎn)義
/*
. 匹配點(diǎn)號(hào)
* 匹配星號(hào)
+ 匹配加號(hào)
? 匹配問(wèn)號(hào)
\ 匹配反斜杠
$ 匹配美元符號(hào)
^ 匹配脫字符
[ 匹配左方括號(hào)
] 匹配右方括號(hào)
( 匹配左括號(hào)
) 匹配右括號(hào)
*/

第四章:實(shí)戰(zhàn)應(yīng)用場(chǎng)景

4.1 數(shù)據(jù)驗(yàn)證:確保數(shù)據(jù)質(zhì)量

sql
-- 驗(yàn)證郵箱格式
SELECT email,
       CASE 
           WHEN email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' 
           THEN '有效郵箱'
           ELSE '無(wú)效郵箱'
       END as validation_result
FROM users;

-- 驗(yàn)證手機(jī)號(hào)(中國(guó)大陸)
SELECT phone,
       CASE
           WHEN phone REGEXP '^1[3-9][0-9]{9}$' THEN '有效手機(jī)號(hào)'
           WHEN phone REGEXP '^[0-9]{3,4}-[0-9]{7,8}$' THEN '有效座機(jī)'
           ELSE '無(wú)效號(hào)碼'
       END as phone_type
FROM customers;

-- 驗(yàn)證身份證號(hào)(簡(jiǎn)單版)
SELECT id_card,
       CASE
           WHEN id_card REGEXP '^[1-9][0-9]{5}(18|19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[0-9]{3}[0-9Xx]$'
           THEN '格式正確'
           ELSE '格式錯(cuò)誤'
       END as id_validation
FROM person_info;

4.2 數(shù)據(jù)清洗:處理雜亂數(shù)據(jù)

sql
-- 提取純數(shù)字內(nèi)容
SELECT 
    content,
    REGEXP_REPLACE(content, '[^0-9]', '') as numbers_only
FROM mixed_data;

-- 清理多余空格
SELECT 
    address,
    REGEXP_REPLACE(address, '\\s+', ' ') as cleaned_address
FROM customer_address;

-- 標(biāo)準(zhǔn)化日期格式
SELECT 
    original_date,
    CASE
        WHEN original_date REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' THEN original_date
        WHEN original_date REGEXP '^[0-9]{2}/[0-9]{2}/[0-9]{4}$' 
        THEN CONCAT(
            SUBSTRING_INDEX(SUBSTRING_INDEX(original_date, '/', -1), '/', 1),
            '-',
            LPAD(SUBSTRING_INDEX(original_date, '/', 1), 2, '0'),
            '-',
            LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(original_date, '/', 2), '/', -1), 2, '0')
        )
        ELSE NULL
    END as standard_date
FROM dates_table;

4.3 日志分析:提取關(guān)鍵信息

sql
-- 從日志中提取IP地址
SELECT 
    log_entry,
    REGEXP_SUBSTR(log_entry, '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}') as ip_address
FROM server_logs
WHERE log_entry REGEXP '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}';

-- 提取錯(cuò)誤級(jí)別
SELECT 
    log_entry,
    CASE
        WHEN log_entry REGEXP '\\[(ERROR|FATAL)\\]' THEN '嚴(yán)重錯(cuò)誤'
        WHEN log_entry REGEXP '\\[WARNING\\]' THEN '警告'
        WHEN log_entry REGEXP '\\[INFO\\]' THEN '信息'
        ELSE '未知級(jí)別'
    END as log_level
FROM application_logs;

-- 提取時(shí)間戳和消息
SELECT 
    log_entry,
    REGEXP_SUBSTR(log_entry, '\\[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\]') as timestamp,
    REGEXP_REPLACE(log_entry, '^.*\\] ', '') as message
FROM system_logs;

第五章:性能優(yōu)化與最佳實(shí)踐

5.1 創(chuàng)建正則表達(dá)式索引(虛擬列)

sql
-- 創(chuàng)建虛擬列存儲(chǔ)提取的信息
ALTER TABLE users 
ADD COLUMN email_domain VARCHAR(100) 
GENERATED ALWAYS AS (
    REGEXP_SUBSTR(email, '@([A-Za-z0-9.-]+)$', 1, 1, '', 1)
) STORED;

-- 在虛擬列上創(chuàng)建索引
CREATE INDEX idx_email_domain ON users(email_domain);

-- 現(xiàn)在可以快速查詢特定域名的用戶
SELECT * FROM users WHERE email_domain = 'gmail.com';

5.2 避免性能陷阱

sql
-- ? 避免過(guò)度復(fù)雜的正則表達(dá)式
SELECT * FROM large_table 
WHERE content REGEXP '^([a-z]+)\\1{10,}';  -- 可能很慢!

-- ? 盡量使用更簡(jiǎn)單的模式
SELECT * FROM large_table 
WHERE content REGEXP 'aaaaaaaaaaa';  -- 更高效

-- ? 避免在開頭使用通配符
SELECT * FROM users 
WHERE username REGEXP '.*admin';  -- 掃描全表

-- ? 盡量錨定開頭
SELECT * FROM users 
WHERE username REGEXP '^admin.*';  -- 可以使用索引

5.3 實(shí)用技巧和小貼士

sql
-- 1. 測(cè)試正則表達(dá)式(先SELECT后WHERE)
SELECT 'test@example.com' REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' as is_valid;

-- 2. 使用變量存儲(chǔ)復(fù)雜正則表達(dá)式
SET @phone_regex = '^1[3-9][0-9]{9}$';
SELECT * FROM customers WHERE phone REGEXP @phone_regex;

-- 3. 組合使用LIKE和REGEXP
SELECT * FROM products 
WHERE 
    -- 先用LIKE過(guò)濾大部分?jǐn)?shù)據(jù)(快)
    description LIKE '%折扣%' 
    AND 
    -- 再用REGEXP精確匹配(準(zhǔn))
    description REGEXP '限時(shí)折扣[0-9]{1,2}%';

-- 4. 正則表達(dá)式調(diào)試函數(shù)
SELECT 
    REGEXP_INSTR('hello123world', '[0-9]+') as match_position,  -- 返回6
    REGEXP_SUBSTR('hello123world', '[0-9]+') as match_string,    -- 返回"123"
    REGEXP_REPLACE('hello123world', '[0-9]+', '###') as replaced_string;  -- "hello###world"

第六章:REGEXP vs LIKE 全面對(duì)比

6.1 功能對(duì)比表

6.2 使用場(chǎng)景建議

sql
-- 場(chǎng)景1:簡(jiǎn)單前綴匹配(推薦LIKE)
-- LIKE版本(更快)
SELECT * FROM products WHERE name LIKE 'Apple%';

-- REGEXP版本
SELECT * FROM products WHERE name REGEXP '^Apple';

-- 場(chǎng)景2:復(fù)雜模式匹配(必須用REGEXP)
-- 查找包含3個(gè)連續(xù)數(shù)字的產(chǎn)品編碼
SELECT * FROM products WHERE code REGEXP '[0-9]{3}';
-- LIKE無(wú)法實(shí)現(xiàn)!

-- 場(chǎng)景3:混合使用(最佳實(shí)踐)
-- 先用LIKE快速過(guò)濾,再用REGEXP精確匹配
SELECT * FROM logs 
WHERE 
    message LIKE '%error%'  -- 快速過(guò)濾
    AND message REGEXP 'error:[0-9]{4}';  -- 精確匹配

總結(jié)與進(jìn)階建議

核心要點(diǎn)回顧
? REGEXP比LIKE更強(qiáng)大,適合復(fù)雜模式匹配

? 先測(cè)試后使用,復(fù)雜正則先在工具中測(cè)試

? 注意性能影響,大數(shù)據(jù)表慎用正則

? 合理使用索引,虛擬列是性能優(yōu)化的利器

? 保持正則簡(jiǎn)潔,越復(fù)雜的正則性能越差
最后的小提示
從簡(jiǎn)單開始:不要一開始就寫復(fù)雜的正則表達(dá)式

善用工具:在線測(cè)試工具能大大提高效率

寫好注釋:復(fù)雜的正則一定要寫注釋說(shuō)明

性能監(jiān)控:在生產(chǎn)環(huán)境監(jiān)控正則查詢的性能

記?。赫齽t表達(dá)式是一門語(yǔ)言,需要不斷練習(xí)才能掌握。開始可能會(huì)覺得符號(hào)很多很難記,但只要多練習(xí),你會(huì)發(fā)現(xiàn)它是處理文本數(shù)據(jù)的強(qiáng)大武器!

以上就是MySQL正則表達(dá)式進(jìn)行模糊查詢的完全指南的詳細(xì)內(nèi)容,更多關(guān)于MySQL正則表達(dá)式模糊查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)超鍵、候選鍵、主鍵與外鍵的使用

    mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)超鍵、候選鍵、主鍵與外鍵的使用

    數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),關(guān)鍵字的概念至關(guān)重要,本文就來(lái)介紹一下mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)超鍵、候選鍵、主鍵與外鍵的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • MySQL如何比較兩個(gè)表數(shù)據(jù)的差異

    MySQL如何比較兩個(gè)表數(shù)據(jù)的差異

    這篇文章主要介紹了MySQL比較兩個(gè)表數(shù)據(jù)的差異,這些方式可以根據(jù)具體需求和數(shù)據(jù)結(jié)構(gòu)選擇合適的方法來(lái)比較兩個(gè)表的數(shù)據(jù)差異,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • MySQL腳本轉(zhuǎn)換為StarRocks的完整指南

    MySQL腳本轉(zhuǎn)換為StarRocks的完整指南

    本指南詳細(xì)說(shuō)明如何將MySQL數(shù)據(jù)庫(kù)腳本轉(zhuǎn)換為StarRocks兼容的格式,包括語(yǔ)法差異、數(shù)據(jù)類型映射、最佳實(shí)踐和常見問(wèn)題解決方案,需要的朋友可以參考下
    2025-09-09
  • 安裝使用Percona XtraBackup來(lái)備份恢復(fù)MySQL的教程

    安裝使用Percona XtraBackup來(lái)備份恢復(fù)MySQL的教程

    這篇文章主要介紹了安裝使用Percona XtraBackup來(lái)備份恢復(fù)MySQL的教程,文中的示例環(huán)境基于CentOS系統(tǒng),需要的朋友可以參考下
    2015-12-12
  • Mac下安裝mysql5.7 完整步驟(圖文詳解)

    Mac下安裝mysql5.7 完整步驟(圖文詳解)

    本篇文章主要介紹了Mac下安裝mysql5.7 完整步驟,具有一定的參考價(jià)值,有興趣的可以了解一下,
    2017-01-01
  • MySQL筆記之修改表的實(shí)現(xiàn)方法

    MySQL筆記之修改表的實(shí)現(xiàn)方法

    我們?cè)趧?chuàng)建表的過(guò)程中難免會(huì)考慮不周,因此后期會(huì)修改表。本篇文章就介紹了在mysql中修改表的實(shí)現(xiàn)方法。需要的朋友參考下
    2013-05-05
  • 實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)鎖的兩種方式

    實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)鎖的兩種方式

    今天我們就來(lái)聊一聊數(shù)據(jù)庫(kù)的鎖,實(shí)現(xiàn)數(shù)據(jù)庫(kù)鎖的兩種方式,一個(gè)是實(shí)現(xiàn)樂(lè)觀鎖的方式,一個(gè)是實(shí)現(xiàn)悲觀鎖的實(shí)現(xiàn)方式,文中的代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • linux版mysql8配置表名不區(qū)分大小寫問(wèn)題

    linux版mysql8配置表名不區(qū)分大小寫問(wèn)題

    文章介紹了MySQL 8的安裝步驟,包括配置忽略大小寫、備份數(shù)據(jù)、停止和刪除數(shù)據(jù)庫(kù)文件、配置my.cnf文件、初始化、啟動(dòng)服務(wù)和登錄設(shè)置密碼,還討論了在配置遠(yuǎn)程連接時(shí)遇到的常見問(wèn)題,特別是MySQL 8版本中由于密碼加密方法變化導(dǎo)致的問(wèn)題解決方法
    2024-11-11
  • jdbc連接mysq之serverTimezone設(shè)定方式

    jdbc連接mysq之serverTimezone設(shè)定方式

    這篇文章主要介紹了jdbc連接mysq之serverTimezone設(shè)定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL基本增刪改查語(yǔ)句練習(xí)(最新推薦)

    MySQL基本增刪改查語(yǔ)句練習(xí)(最新推薦)

    這篇文章主要介紹了MySQL基本增刪改查語(yǔ)句練習(xí),本文給大家分享sql增刪改查語(yǔ)句是平時(shí)開發(fā)最常用的,需要的朋友可以參考下
    2023-01-01

最新評(píng)論

浦北县| 龙胜| 西和县| 清涧县| 邵东县| 金寨县| 青河县| 宿迁市| 白水县| 井陉县| 洪洞县| 河北区| 伊川县| 白山市| 阳城县| 交城县| 黑水县| 屏南县| 兴安盟| 宁乡县| 永济市| 福州市| 长宁县| 泰州市| 湘潭市| 苏尼特左旗| 襄樊市| 通江县| 上虞市| 宿迁市| 定南县| 揭阳市| 广宁县| 昌平区| 天津市| 阿鲁科尔沁旗| 奉新县| 罗定市| 乐昌市| 北流市| 彭泽县|