MySQL 運算符詳解:邏輯、位運算與正則表達式應用
在 MySQL 中,運算符是構建復雜查詢條件的基礎。除了基礎的算術和比較運算符,邏輯運算符、位運算符以及正則表達式的靈活運用,能讓數據篩選更加精準高效。本文將系統講解這些運算符的用法、規則及實戰技巧,幫助你掌握復雜查詢的核心技能。
一、邏輯運算符:多條件組合的核心
邏輯運算符用于組合多個條件,判斷表達式的真假,返回結果為1(真)、0(假)或NULL(未知)。常用的有四種:
1. 邏輯非(NOT / !)
作用:對條件結果取反
語法:NOT 條件 或 ! 條件
規則:
-
條件為0(假)時返回1;
-
條件為非0(真)時返回0;
-
條件為NULL時返回NULL。
示例:
-- 查詢薪資不在9000-12000之間的員工
SELECT employee_id, salary
FROM employees
WHERE NOT (salary >= 9000 AND salary <= 12000);
2. 邏輯與(AND / &&)
作用:所有條件同時為真時返回1
語法:條件1 AND 條件2 或 條件1 && 條件2
規則:
-
所有條件非0且非NULL時返回1;
-
任意條件為0時返回0;
-
存在NULL且無0時返回NULL。
示例:
-- 查詢部門30中薪資>5000的員工
SELECT last_name, salary
FROM employees
WHERE department_id = 30 AND salary > 5000;
3. 邏輯或(OR / ||)
作用:任意條件為真時返回1
語法:條件1 OR 條件2 或 條件1 || 條件2
規則:
-
任意條件非0時返回1;
-
所有條件為0時返回0;
-
存在NULL且無真條件時返回NULL。
注意:AND優先級高于OR,建議用括號明確邏輯
示例:
-- 正確:查詢薪資>10000 或 (崗位含MAN且薪資>5000)的員工
SELECT last_name, job_id, salary
FROM employees
WHERE salary > 10000 OR (job_id LIKE '%MAN%' AND salary > 5000);
4. 邏輯異或(XOR)
作用:兩個條件一真一假時返回1(“異” 即不同)
語法:條件1 XOR 條件2
規則:
-
一真一假(非0和0)時返回1;
-
同真或同假時返回0;
-
任意條件為NULL時返回NULL。
示例:
-- 查詢部門為10/20 或 薪資>8000,但不同時滿足的員工
SELECT last_name, department_id, salary
FROM employees
WHERE department_id IN (10, 20) XOR salary > 8000;
二、位運算符:二進制層面的運算
位運算符直接對數值的二進制位進行操作,適用于底層數據處理(如權限控制)。運算時先將數值轉為二進制,計算后再轉回十進制。
運算符 | 名稱 | 作用說明 | 示例(6→110,3→011) |
---|---|---|---|
& | 按位與 | 對應位都為 1 則返回 1,否則 0 | 6 & 3 = 2(110 & 011=010) |
| | | | 按位或 | 對應位有一個為 1 則返回 1,否則 0 |
^ | 按位異或 | 對應位不同則返回 1,相同則 0 | 6 ^ 3 = 5(110 ^ 011=101) |
~ | 按位取反 | 0→1,1→0(結果為原數的補碼) | ~6 = -7(補碼運算) |
>> | 按位右移 | 二進制位右移指定位數,高位補 0 | 6 >> 1 = 3(110→11) |
<< | 按位左移 | 二進制位左移指定位數,低位補 0 | 6 << 1 = 12(110→1100) |
示例:
-- 判斷權限位是否包含某角色(假設8對應二進制1000,代表管理員權限)
SELECT user_id, role_bits
FROM users
WHERE (role_bits & 8) = 8; -- 結果為8表示包含管理員權限
三、運算符優先級:避免邏輯混亂
運算符優先級決定計算順序,優先級高的先執行。記不清時,用括號**()**強制指定順序(推薦)。
優先級從高到低(核心):
-
括號()(最高)
-
位運算符(~、<<、>>、&、^、|)
-
算術運算符(*、/、% 高于 +、-)
-
比較運算符(=、>、BETWEEN、IN等)
-
邏輯運算符(NOT > AND > OR、XOR)
-
賦值運算符(=,最低)
示例:
-- 錯誤:因AND優先級高,可能不符合預期
SELECT * FROM employees WHERE salary>5000 OR salary<3000 AND department_id=30;-- 正確:用括號明確先算OR的兩邊
SELECT * FROM employees WHERE (salary>5000 OR salary<3000) AND department_id=30;
四、正則表達式:復雜字符串匹配
REGEXP支持靈活的字符串模式匹配,比LIKE更適合復雜場景。常用匹配規則如下:
模式符號 | 作用 | 示例 |
---|---|---|
^ | 匹配開頭 | ‘^b’ 匹配以 b 開頭的字符串 |
$ | 匹配結尾 | ‘y$’ 匹配以 y 結尾的字符串 |
. | 匹配任意單個字符 | ‘a.g’ 匹配 a 和 g 之間有一個任意字符 |
* | 匹配前面字符 0 次或多次 | ‘ba*’ 匹配 b 后接 0 個或多個 a(b、ba 等) |
+ | 匹配前面字符至少 1 次 | ‘ba+’ 匹配 b 后接 1 個或多個 a(ba、baa) |
` | ` | 匹配多個選項之一 |
[] | 匹配括號內任意單個字符 | ‘[ot]’ 匹配 o 或 t |
[^] | 匹配括號外任意字符 | ‘[^0-9]’ 匹配非數字字符 |
{n,} | 匹配前面字符至少 n 次 | ‘x{2,}’ 匹配 x 至少出現 2 次 |
{n,m} | 匹配前面字符 n 到 m 次 | ‘ba{1,3}’ 匹配 ba、baa、baaa |
示例:
-- 1. 匹配以b開頭且后面有至少1個a的字符串
SELECT f_name FROM fruits WHERE f_name REGEXP '^ba+';-- 2. 匹配包含on或ap的字符串
SELECT f_name FROM fruits WHERE f_name REGEXP 'on|ap';-- 3. 匹配x連續出現至少2次的字符串
SELECT f_name FROM fruits WHERE f_name REGEXP 'x{2,}';
與 LIKE 的區別:
-
REGEXP匹配字符串中任意位置的模式(如’bon’ REGEXP 'on’返回 1);
-
LIKE需用通配符才能匹配中間內容(如’bon’ LIKE '%on%'才返回 1)。
五、總結:核心要點速覽
- 邏輯運算符:
-
- NOT取反,AND需全真,OR需一真,XOR需一真一假;
-
- 注意AND優先級高于OR,用括號明確邏輯。
- 位運算符:
-
- 對二進制位操作,適用于權限控制等底層場景;
-
- 常用&(判斷位是否為 1)、<</>>(移位運算)。
- 優先級:
-
- 括號最高,賦值最低;不確定時用括號強制順序。
- 正則表達式:
-
- REGEXP支持復雜模式匹配,靈活度遠超LIKE;
-
- 掌握^/$/[]/{}等符號,可應對多數字符串篩選需求。
熟練運用這些運算符,能讓你在處理多條件查詢和復雜字符串匹配時更加得心應手,寫出高效、精準的 SQL 語句。