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

MySQL正則表達式進行模糊查詢的完全指南

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

前言:為什么需要正則表達式?

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

查找所有以"139"開頭的手機號

驗證郵箱格式是否正確

提取文本中的日期信息

匹配特定格式的身份證號

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

第一章:正則表達式基礎入門

1.1 什么是正則表達式?

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

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

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

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

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

第二章:REGEXP基礎匹配

2.1 最簡單的匹配:查找包含特定文本的記錄

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

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

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

2.2 匹配開頭和結尾

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

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

-- 查找以"139"開頭的手機號
SELECT * FROM customers 
WHERE phone REGEXP '^139';

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

對比表:

2.3 匹配多個字符之一

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)表示"非"

字符集說明:

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

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

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

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

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

第三章:高級匹配技巧

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

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

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

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

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

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

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

重復匹配符速查表:

3.2 分組和選擇

sql
-- 匹配"區(qū)號-電話號碼"格式
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 特殊字符和轉義

sql
-- 匹配點號(需要轉義)
SELECT * FROM files 
WHERE filename REGEXP '\.txt$';

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

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

第四章:實戰(zhàn)應用場景

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

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

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

-- 驗證身份證號(簡單版)
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 '格式錯誤'
       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;

-- 標準化日期格式
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 日志分析:提取關鍵信息

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}';

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

-- 提取時間戳和消息
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)化與最佳實踐

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

sql
-- 創(chuàng)建虛擬列存儲提取的信息
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
-- ? 避免過度復雜的正則表達式
SELECT * FROM large_table 
WHERE content REGEXP '^([a-z]+)\\1{10,}';  -- 可能很慢!

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

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

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

5.3 實用技巧和小貼士

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

-- 2. 使用變量存儲復雜正則表達式
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過濾大部分數(shù)據(jù)(快)
    description LIKE '%折扣%' 
    AND 
    -- 再用REGEXP精確匹配(準)
    description REGEXP '限時折扣[0-9]{1,2}%';

-- 4. 正則表達式調(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 全面對比

6.1 功能對比表

6.2 使用場景建議

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

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

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

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

總結與進階建議

核心要點回顧
? REGEXP比LIKE更強大,適合復雜模式匹配

? 先測試后使用,復雜正則先在工具中測試

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

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

? 保持正則簡潔,越復雜的正則性能越差
最后的小提示
從簡單開始:不要一開始就寫復雜的正則表達式

善用工具:在線測試工具能大大提高效率

寫好注釋:復雜的正則一定要寫注釋說明

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

記住:正則表達式是一門語言,需要不斷練習才能掌握。開始可能會覺得符號很多很難記,但只要多練習,你會發(fā)現(xiàn)它是處理文本數(shù)據(jù)的強大武器!

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

相關文章

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

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

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

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

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

    MySQL腳本轉換為StarRocks的完整指南

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

    安裝使用Percona XtraBackup來備份恢復MySQL的教程

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

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

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

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

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

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

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

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

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

    jdbc連接mysq之serverTimezone設定方式

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

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

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

最新評論

孝昌县| 新巴尔虎左旗| 上蔡县| 进贤县| 青阳县| 天门市| 钟山县| 苏州市| 汶川县| 沙河市| 宁都县| 崇礼县| 桃源县| 乃东县| 湘潭市| 安顺市| 太谷县| 巢湖市| 大埔县| 平凉市| 佛山市| 台中市| 苏尼特左旗| 玛曲县| 内丘县| 马关县| 儋州市| 堆龙德庆县| 汶上县| 乌拉特前旗| 和平区| 泊头市| 屏东县| 泰和县| 林州市| 南靖县| 镇远县| 桦甸市| 南部县| 塔河县| 忻城县|