MySQL 查詢過濾之WHERE 子句與運算符實戰(zhàn)技巧
MySQL 查詢過濾:WHERE 子句與運算符全解析
在 MySQL 中,WHERE子句是數(shù)據(jù)過濾的核心工具,通過搭配不同運算符,能精準篩選出符合條件的記錄。本文將系統(tǒng)講解WHERE子句的用法及常用運算符(算術(shù)、比較)的規(guī)則與實戰(zhàn)技巧,幫你掌握數(shù)據(jù)篩選的精髓。
一、WHERE 子句基礎:定位核心數(shù)據(jù)
WHERE子句的作用是從表中篩選出滿足指定條件的行,其位置固定在FROM子句之后,是 SQL 查詢中實現(xiàn) “精準提取” 的關(guān)鍵。
1. 基本語法結(jié)構(gòu)
SELECT 字段1, 字段2, ... FROM 表名 WHERE 過濾條件; -- 條件由運算符連接字段或值組成
2. 核心作用
- 減少返回結(jié)果量,提升查詢效率;
- 聚焦目標數(shù)據(jù),避免無關(guān)信息干擾。
3. 示例
-- 查詢薪資大于5000的員工姓名和薪資 SELECT last_name, salary FROM employees WHERE salary > 5000;
二、算術(shù)運算符:數(shù)值計算的基礎工具
算術(shù)運算符用于對數(shù)值型字段或表達式進行計算,常見包括+(加)、-(減)、*(乘)、/(除)、%(取模),主要用于WHERE子句中的條件計算。
1. 核心規(guī)則與示例
| 運算符 | 作用 | 規(guī)則與注意事項 | 示例(基于employees表) |
|---|---|---|---|
| + | 加法 | 僅做數(shù)值加法,字符串會嘗試轉(zhuǎn)為數(shù)值(失敗則按 0 計算),與 Java 的字符串拼接不同 | WHERE salary + 1000 > 6000(薪資 + 1000 后大于 6000) |
| - | 減法 | 整數(shù)減整數(shù)結(jié)果為整數(shù),整數(shù)減浮點數(shù)結(jié)果為浮點數(shù) | WHERE salary - bonus > 4000 |
| * | 乘法 | 結(jié)果類型隨操作數(shù)變化(整數(shù) × 浮點數(shù) = 浮點數(shù)) | WHERE salary * 1.2 > 8000(薪資漲 20% 后大于 8000) |
| / | 除法 | 結(jié)果始終為浮點數(shù),除以 0 返回NULL | WHERE salary / 12 > 500(月薪 / 12 后大于 500) |
| % | 取模(余數(shù)) | 返回除法余數(shù),符號與被除數(shù)一致 | WHERE employee_id % 2 = 0(員工 ID 為偶數(shù)) |
2. 關(guān)鍵說明
- 優(yōu)先級:*、/、% 高于 +、-,可通過括號()調(diào)整順序;
- 字符串參與運算時,MySQL 會自動嘗試轉(zhuǎn)換為數(shù)值(如’123’→123,'abc’→0)。
三、比較運算符:條件判斷的核心武器
比較運算符用于判斷值或表達式的關(guān)系,返回結(jié)果為1(真)、0(假)或NULL(未知),是WHERE子句中最常用的條件構(gòu)建工具。
1. 基礎比較運算符(=、<=>、<>/!=)
| 運算符 | 作用 | 規(guī)則與注意事項 | 示例 |
|---|---|---|---|
| = | 等于 | 不能判斷NULL(NULL = NULL返回NULL);字符串按 ANSI 編碼比較,數(shù)字按數(shù)值比較 | WHERE department_id = 30(部門 ID 等于 30) |
| <=> | 安全等于 | 可判斷NULL(NULL <=> NULL返回 1),其他與=一致 | WHERE commission_pct <=> NULL(傭金率為 NULL) |
| <>/!= | 不等于 | 不能判斷NULL(任意操作數(shù)為NULL則返回NULL) | WHERE salary != 5000(薪資不等于 5000) |
2. NULL 相關(guān)運算符(IS NULL、IS NOT NULL)
專門用于判斷NULL值(=無法勝任):
-- 查詢沒有上級的員工(manager_id為NULL) SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL; -- 等價于 ISNULL(manager_id) -- 查詢有上級的員工 SELECT last_name, manager_id FROM employees WHERE manager_id IS NOT NULL;
3. 范圍與集合運算符(BETWEEN AND、IN、NOT IN)
- BETWEEN AND:判斷值是否在指定區(qū)間(閉區(qū)間,包含邊界)
-- 查詢薪資在5000-8000之間的員工(包含5000和8000) SELECT last_name, salary FROM employees WHERE salary BETWEEN 5000 AND 8000;
- IN / NOT IN:判斷值是否在指定集合中
-- 查詢部門ID為30、50、70的員工 SELECT last_name, department_id FROM employees WHERE department_id IN (30, 50, 70); -- 查詢部門ID不在30、50、70的員工 SELECT last_name, department_id FROM employees WHERE department_id NOT IN (30, 50, 70);
注意:集合中包含NULL時,IN/NOT IN返回NULL。
4. 極值運算符(LEAST、GREATEST)
- LEAST(值1, 值2, …):返回參數(shù)中的最小值
- GREATEST(值1, 值2, …):返回參數(shù)中的最大值
-- 查詢薪資、獎金、補貼中的最小值大于2000的員工 SELECT last_name, salary, bonus, subsidy FROM employees WHERE LEAST(salary, bonus, subsidy) > 2000; -- 查詢?nèi)齻€業(yè)績指標中的最大值大于90的員工 SELECT last_name, kpi1, kpi2, kpi3 FROM employees WHERE GREATEST(kpi1, kpi2, kpi3) > 90;
注意:參數(shù)包含NULL時,返回NULL。
5. 模糊匹配(LIKE、REGEXP)
用于字符串的模糊匹配,適合不確定完整值的場景。
(1)LIKE 與通配符
- %:匹配 0 個或多個任意字符;
- _:匹配 1 個任意字符;
- ESCAPE:指定轉(zhuǎn)義符,處理包含%或_的字符串。
-- 1. 查詢姓名以"張"開頭的員工(%匹配后續(xù)任意字符) SELECT last_name FROM employees WHERE last_name LIKE '張%'; -- 2. 查詢姓名第二個字是"小"的員工(_匹配1個字符) SELECT last_name FROM employees WHERE last_name LIKE '_小%'; -- 3. 查詢崗位包含"_IT"的員工(用$轉(zhuǎn)義_) SELECT job_id FROM jobs WHERE job_id LIKE '%$\_IT%' ESCAPE '$'; -- ESCAPE指定$為轉(zhuǎn)義符
(2)REGEXP 與正則匹配
支持更復雜的字符串模式匹配,常用元字符:
- ^:匹配開頭;$:匹配結(jié)尾;
- .:匹配任意單個字符;
- [abc]:匹配 a、b、c 中的任意一個;[0-9]:匹配任意數(shù)字;
- *:匹配前面字符 0 次或多次。
-- 1. 查詢郵箱以"a"開頭的員工
SELECT email
FROM employees
WHERE email REGEXP '^a';
-- 2. 查詢姓名包含"李"或"王"的員工
SELECT last_name
FROM employees
WHERE last_name REGEXP '[李王]';
-- 3. 查詢手機號以138開頭且后8位全為數(shù)字的員工
SELECT phone_number
FROM employees
WHERE phone_number REGEXP '^138[0-9]{8}$';四、核心注意事項
- NULL 的特殊性:
- 不能用=/!=判斷NULL,必須用IS NULL/IS NOT NULL或<=>;
- 任何包含NULL的運算結(jié)果都為NULL。
- 字符串與數(shù)值的比較:
- 字符串會自動轉(zhuǎn)為數(shù)值(如’123’ = 123返回 1),轉(zhuǎn)換失敗按 0 處理(如’abc’ = 0返回 1)。
- 運算符優(yōu)先級:
- 算術(shù)運算符 > 比較運算符;
- 不確定時用括號()明確順序(如WHERE (salary + bonus) > 10000)。
- 性能建議:
- 避免在WHERE子句中對字段做運算(如WHERE salary*1.2 > 8000),可能導致索引失效;
- 模糊匹配時,%放在開頭(如LIKE ‘%abc’)會導致索引失效,盡量用LIKE ‘abc%’。
五、總結(jié):運算符使用速查表
| 類別 | 運算符 | 核心用途 | 關(guān)鍵特點 |
|---|---|---|---|
| 算術(shù)運算符 | +、-、*、/、% | 數(shù)值計算 | +僅做加法,/結(jié)果為浮點數(shù) |
| 基礎比較 | =、<=>、<>/!= | 判斷等于 / 不等于,<=>支持 NULL | =不支持 NULL,<=>是安全等于 |
| NULL 判斷 | IS NULL、IS NOT NULL | 判斷 NULL 值 | 唯一能可靠判斷 NULL 的方式 |
| 范圍集合 | BETWEEN AND、IN | 判斷值在區(qū)間 / 集合內(nèi) | BETWEEN是閉區(qū)間,IN集合含 NULL 返回 NULL |
| 極值判斷 | LEAST、GREATEST | 取多個值中的最小 / 最大值 | 含 NULL 則返回 NULL |
| 模糊匹配 | LIKE、REGEXP | 字符串模糊匹配,REGEXP支持正則 | LIKE用%/_,REGEXP用元字符 |
掌握這些運算符,能讓你寫出更精準、高效的WHERE子句,輕松應對各種數(shù)據(jù)篩選場景。實際使用時,建議結(jié)合具體業(yè)務需求選擇合適的運算符,并注意避免常見的性能陷阱。
到此這篇關(guān)于MySQL 查詢過濾之WHERE 子句與運算符實戰(zhàn)技巧的文章就介紹到這了,更多相關(guān)mysql where子句與運算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL系列關(guān)于NUll值的經(jīng)驗總結(jié)分析教程
這篇文章主要為大家介紹了MySQL系列關(guān)于NUll值的一些經(jīng)驗總結(jié)分析,關(guān)于null值的影響作用以及為什么會出現(xiàn)null值的原因等等問題的解析2021-10-10
SQLyog連接MySQL8.0+報錯:錯誤號碼2058的解決方案
本文將總結(jié)如何解決 SQLyog 連接 MySQL8.0+ 時報錯:錯誤號碼2058,文中通過圖文結(jié)合和代碼示例給大家總結(jié)了三種解決方案,具有一定的參考價值,需要的朋友可以參考下2023-12-12

