模糊查詢 的深度技術解析

以下是 模糊查詢 的深度技術解析,涵蓋核心語法、通配符策略、性能優化及實戰陷阱:


🔍 一、核心運算符:LIKE

SELECT * FROM 表名 
WHERE 列名 LIKE '模式字符串';

🎯 二、通配符詳解

通配符作用示例匹配案例
%任意長度字符(含0字符)'張%'張三、張無忌、張
_單個字符'李_'李四、李雷(不匹配"李")
[ ]字符集合內單字符 (僅SQL Server)'[王李]%'王五、李四
[^ ]排除字符集合 (僅SQL Server)'[^0-9]%'中文、字母(排除數字開頭)
📌 通用標準(MySQL/PgSQL/Oracle):
-- 匹配 "公司"結尾的字符串
WHERE company LIKE '%公司'  -- 匹配第二個字為"小"的姓名
WHERE name LIKE '_小%'     -- 匹配含下劃線的文件名 (需轉義)
WHERE file_name LIKE '%\_%' ESCAPE '\'  

?? 三、關鍵注意事項

1. 大小寫敏感性問題
數據庫默認行為強制不敏感方案
MySQL取決于校對規則WHERE LOWER(name) LIKE '%abc%'
PostgreSQL區分大小寫ILIKE 運算符
Oracle區分大小寫WHERE UPPER(name) LIKE '%ABC%'
2. 通配符轉義(通用方案)
-- 查找含 "20%" 的備注(如"折扣20%")
SELECT * FROM products 
WHERE notes LIKE '%20\%%' ESCAPE '\';  -- 定義'\'為轉義符-- 查找含下劃線的文件名
WHERE file_name LIKE '%\_%' ESCAPE '\';
3. NULL 值處理
-- 模糊查詢不匹配 NULL 值!
SELECT * FROM users 
WHERE name LIKE '%張%';  -- 自動過濾 name IS NULL 的行

? 四、性能優化策略

1. 避免全模糊(%xxx%
-- ? 性能殺手(無法利用索引)
WHERE content LIKE '%數據庫%'  -- ? 優化方案1:右模糊(可命中索引)
WHERE content LIKE '數據庫%'  -- ? 優化方案2:全文索引(MySQL 5.6+)
ALTER TABLE articles ADD FULLTEXT INDEX (content);
SELECT * FROM articles 
WHERE MATCH(content) AGAINST('數據庫' IN BOOLEAN MODE);
2. 慎用函數包裹列
-- ? 索引失效
WHERE LOWER(name) LIKE '%abc%'  -- ? 預處理數據
ALTER TABLE users ADD COLUMN name_lower VARCHAR(50);
UPDATE users SET name_lower = LOWER(name);  
CREATE INDEX idx_name_lower ON users(name_lower);
WHERE name_lower LIKE '%abc%';  -- 仍全掃,但比函數快
3. 使用覆蓋索引
-- 只需返回 name 和 id
SELECT name, id FROM users 
WHERE name LIKE '張%';  -- 若索引含(name,id)則無需回表

🔧 五、進階技巧

1. 正則表達式增強(REGEXP)
-- MySQL/PgSQL 支持
WHERE name REGEXP '^張[小大]'  -- 匹配"張小"或"張大"開頭-- Oracle 用 REGEXP_LIKE
WHERE REGEXP_LIKE(name, '^張[小大]')
2. 通配符組合妙用
-- 匹配 130-139 開頭的手機號
WHERE phone LIKE '13_%'        -- 簡易版(可能包含無效號)
WHERE phone REGEXP '^13[0-9]{9}$'  -- 精確版(11位數字)-- 匹配郵箱格式
WHERE email LIKE '%@%.%'       -- 基礎驗證
3. 動態模式生成
-- 根據變量構造模式
SET @search_term = '數據';
SELECT * FROM books 
WHERE title LIKE CONCAT('%', @search_term, '%');

🧩 六、實戰陷阱案例

陷阱1:中文字符截斷錯誤
-- UTF-8 下 '李_' 可能匹配到 "李三"(3字節)或 "李𠮷"(4字節)
? 解決方案:使用 `CHAR_LENGTH()` 輔助
WHERE name LIKE '李_' AND CHAR_LENGTH(name) = 2
陷阱2:通配符沖突
-- 用戶輸入含 "%" 時(如搜索 "100%")
? 方案:預處理輸入值
SET @input = REPLACE(@raw_input, '%', '\%');
WHERE content LIKE CONCAT('%', @input, '%') ESCAPE '\';
陷阱3:隱式空格問題
-- VARCHAR 存儲時尾部空格參與匹配
CREATE TABLE test (col VARCHAR(10));
INSERT INTO test VALUES ('abc'), ('abc   ');SELECT * FROM test WHERE col LIKE 'abc';   -- 只匹配 'abc'
SELECT * FROM test WHERE col LIKE 'abc%';  -- 匹配兩項

📊 七、模糊查詢類型性能對比

查詢類型示例索引利用適用場景
前綴匹配LIKE '張%'? 可利用B樹索引快速人名/編號檢索
后綴匹配LIKE '%公司'? 全表掃描低頻分析
全模糊LIKE '%數據%'? 全表掃描小表或全文索引替代方案
固定位置LIKE '__小%'? 全表掃描嚴格格式數據(如身份證)

💡 終極建議

  1. 數據清洗:入庫前規范化(統一大小寫/去除特殊字符)
  2. 索引策略:對高頻前綴查詢列建索引
  3. 替代方案
    模糊查詢
    數據量
    LIKE
    全文搜索引擎
    Elasticsearch
    PgSQL全文索引
  4. 安全防護:過濾用戶輸入的通配符(防止惡意超長%拖垮數據庫)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85082.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85082.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[論文閱讀] (39)EuroSP25 CTINEXUS:基于大模型的威脅情報知識圖譜自動構建

《娜璋帶你讀論文》系列主要是督促自己閱讀優秀論文及聽取學術講座,并分享給大家,希望您喜歡。由于作者的英文水平和學術能力不高,需要不斷提升,所以還請大家批評指正,非常歡迎大家給我留言評論,學術路上期…

強化學習三大分類

核心目標: 教會一個智能體(比如機器人、游戲AI、推薦系統)通過試錯和獎勵,學會在某個環境中完成特定任務的最佳策略。 核心角色: 智能體 (Agent): 學習者,比如玩游戲的小人、控制溫度的空調系…

城市排水生命線安全運行監測項目

近年來,城市內澇、污水溢流等問題頻發,讓排水管網這一"城市生命線"的安全運行備受關注。如何讓地下的"毛細血管"更智能、更可靠?本文將帶您深入解析城市排水生命線安全運行監測項目的建設邏輯與技術內核,看科…

LeetCode - 34. 在排序數組中查找元素的第一個和最后一個位置

題目 34. 在排序數組中查找元素的第一個和最后一個位置 - 力扣&#xff08;LeetCode&#xff09; 思路 查找左邊界 初始化 left 0, right nums.size() - 1 當 left < right 時循環&#xff1a; 計算中點 mid left (right - left) / 2 如果 nums[mid] < target…

Tesollo四指靈巧手DG-4F:18自由度與多種抓取模式結合實現高精度操作

Tesollo四指靈巧手 DG-4F 是一款具備 18 自由度的多模態末端執行器&#xff0c;采用模塊化結構設計&#xff0c;融合人手靈活性與夾爪高效性特點。該產品兼容 Universal Robots、Techman、Doosan Robotics、Rainbow Robotics 等主流機器人平臺&#xff0c;適用于工業自動化、科…

深入淺出JavaScript 原型鏈:對象繼承的“隱形鏈條”

深入淺出JavaScript 原型鏈&#xff1a;對象繼承的“隱形鏈條” 在 JavaScript 的世界里&#xff0c;原型鏈&#xff08;Prototype Chain&#xff09;是一個核心概念。它如同一條隱形的鏈條&#xff0c;連接著所有對象&#xff0c;使得代碼能夠高效地共享屬性和方法。理解原型…

LINUX中MYSQL的使用

LINUX中MYSQL的使用 MYSQL的數據類型 bool&#xff1a; 布爾類型 0 或者 1 CHAR&#xff1a; 單字符的字符 CHAR&#xff08;n&#xff09;:多字節字符 VARCHAR&#xff08;n&#xff09;&#xff1a;可變長度的字符型 TINYINT &#xff1a; 單字節整型 SMALLINT&#x…

打卡第48天:隨機函數與廣播機制

知識點回顧&#xff1a; 隨機張量的生成&#xff1a;torch.randn函數卷積和池化的計算公式&#xff08;可以不掌握&#xff0c;會自動計算的&#xff09;pytorch的廣播機制&#xff1a;加法和乘法的廣播機制 ps&#xff1a;numpy運算也有類似的廣播機制&#xff0c;基本一致 …

學習昇騰開發的第四天--基本指令

1、查看npu當前狀態信息 npu-smi info 2、查看NPU的ID npu-smi info -l3、調用python python3 4、修改用戶名 su - HwHiAiUser 5、查看cann版本 cat /usr/local/Ascend/ascend-toolkit/latest/compiler/version.info 6、刪除文件夾 sudo rm -rf HelloWorld7、在本地環…

vue3 - 自定義hook

自定義hook 簡單點來說就是將人物或者訂單的所有數據和方法放在一個ts文件里面 這樣便于維護 假如一個人只需要管 人物的模塊 那他只需要操作usePerson.ts文件就可以了 //useDog.ts import { ref,reactive} from vue; import axios from axios;export default function(){…

【python】bash: !‘: event not found

報錯 # 2. 測試smplx是否工作&#xff08;可能不需要chumpy&#xff09; python -c "import smplx; print(? smplx works!)"bash: !: event not found 分析 這是bash的歷史擴展問題&#xff0c;感嘆號被解釋為歷史命令。用這些方法解決&#xff1a; &#x1f680…

【Python打卡Day47】注意力熱力圖可視化@浙大疏錦行

可視化空間注意力熱力圖的意義&#xff1a; 提升模型可解釋性 熱力圖能直觀展示模型決策的依據區域&#xff0c;破除深度學習"黑箱"困境。例如在圖像識別中&#xff0c;可以看到模型識別"貓"是因為關注了貓耳和胡須區域&#xff0c;識別"禁止通行&qu…

樹狀數組 2

L - 樹狀數組 2 洛谷 - P3368 Description 如題&#xff0c;已知一個數列&#xff0c;你需要進行下面兩種操作&#xff1a; 將某區間每一個數加上 x&#xff1b; 求出某一個數的值。 Input 第一行包含兩個整數 N、M&#xff0c;分別表示該數列數字的個數和操作的總個數。…

YOLOv2 技術詳解:目標檢測的又一次飛躍

&#x1f9e0; YOLOv2 技術詳解&#xff1a;目標檢測的又一次飛躍 一、前言 在 YOLOv1 提出后&#xff0c;雖然實現了“實時性 單階段”的突破&#xff0c;但其在精度和小物體檢測方面仍有明顯不足。為了彌補這些缺陷&#xff0c;Joseph Redmon 等人在 2017 年提出了 YOLOv2…

JAFAR Jack up Any Feature at Any Resolution

GitHub PaPer JAFAR: Jack up Any Feature at Any Resolution 摘要 基礎視覺編碼器已成為各種密集視覺任務的核心組件。然而&#xff0c;它們的低分辨率空間特征輸出需要特征上采樣以產生下游任務所需的高分辨率模式。在這項工作中&#xff0c;我們介紹了 JAFAR——一種輕量級…

SamWaf 開源輕量級網站防火墻源碼(源碼下載)

SamWaf網站防火墻是一款適用于小公司、工作室和個人網站的開源輕量級網站防火墻&#xff0c;完全私有化部署&#xff0c;數據加密且僅保存本地&#xff0c;一鍵啟動&#xff0c;支持Linux&#xff0c;Windows 64位,Arm64。 主要功能&#xff1a; 代碼完全開源 支持私有化部署…

79Qt窗口_QDockWidget的基本使用

目錄 4.1 浮動窗?的創建 4.2 設置停靠的位置 浮動窗? 在 Qt 中&#xff0c;浮動窗?也稱之為鉚接部件。浮動窗?是通過 QDockWidget類 來實現浮動的功能。浮動窗 ??般是位于核?部件的周圍&#xff0c;可以有多個。 4.1 浮動窗?的創建 浮動窗?的創建是通過 QDockWidget…

UE/Unity/Webgl云渲染推流網址,如何與外部網頁嵌套和交互?

需求分析&#xff1a;用threejs開發的數字孿生模型&#xff0c; 但是通過webgl技術網頁中使用&#xff0c;因為模型數據量大&#xff0c;加載比較慢&#xff0c;且需要和其他的業務系統進行網頁嵌套和交互&#xff0c;使用云渲染技術形成的推流網址&#xff0c;如何與外部網頁嵌…

在Termux中搭建完整Python環境(Ubuntu+Miniconda)

蹲坑也能寫python? ?? 環境準備?? 詳細搭建步驟步驟1:安裝Linux容器工具步驟2:查看可用Linux發行版步驟3:安裝Ubuntu系統步驟4:登錄Ubuntu環境步驟5:下載Miniconda安裝包步驟6:安裝Miniconda? 環境驗證?? 使用技巧?? 注意事項前言:想在吃飯、通勤甚至休息間隙…

EventSourcing.NetCore:基于事件溯源模式的 .NET Core 庫

在現代軟件架構中&#xff0c;事件溯源&#xff08;Event Sourcing&#xff09;已經成為一種非常流行的模式&#xff0c;尤其適用于需要高可用性和數據一致性的場景。EventSourcing.NetCore 是一個基于事件溯源模式的 .NET Core 庫&#xff0c;旨在幫助開發者更加高效地實現這一…