MySQL 擁有幾個獨有或與 SQL Server 行為不同的運算符,熟悉它們能寫出更簡潔、高效的查詢。本文系統梳理並附實測結果。
<=>相當於 =,但能正確處理 NULL:
NULL <=> NULL → 1 (真)NULL <=> 1 → 0 (假)1 <=> 1 → 1SELECT NULL <=> 1, 1 <=> 0, NULL <=> NULL; -- 結果:0, 0, 1
場景:WHERE col <=> val 可直接匹配 NULL,無需 IS NULL 分支。
LEAST(v1, v2, ...):返回最小值;任一參數為 NULL → 結果 NULL。GREATEST(v1, v2, ...):返回最大值;任一參數為 NULL → 結果 NULL。SELECT LEAST(2,0), LEAST('a','b','c'), LEAST(10,NULL);
-- 0, 'a', NULL
SELECT GREATEST(2,0), GREATEST('a','b','c'), GREATEST(10,NULL);
-- 2, 'c', NULL
字符串按字典序比較;數值按數值比較;混合類型會隱式轉換,建議保持同類型。
語法:expr REGEXP pattern,匹配返回 1,否則 0;任一方為 NULL → NULL。
| 元字符 | 含義 | 示例 |
|---|---|---|
^ | 行首 | 'abc' REGEXP '^a' → 1 |
$ | 行尾 | 'abc' REGEXP 'c$' → 1 |
. | 任意單字符 | 'abc' REGEXP '.bc' → 1 |
[...] | 字符集合 | 'abc' REGEXP '[ab]' → 1 |
[a-z] | 範圍 | 'abc' REGEXP '[a-c]' → 1 |
* | 前字符 0+ 次 | 'abc' REGEXP 'ab*c' → 1 |
SELECT 'ssky' REGEXP '^s', 'ssky' REGEXP 'y$', 'ssky' REGEXP '.sky', 'ssky' REGEXP '[ab]'; -- 1, 1, 1, 0
比 LIKE 強大得多,支援複雜模式提取、校驗(如手機號、郵箱、身份證)。
| 運算 | MySQL | SQL Server |
|---|---|---|
| AND | AND / && | AND / & (位與) |
| OR | OR / || | OR / | (位或) |
| XOR | XOR | ^ (位異或) |
| 運算符 | 含義 | 示例 (BIN(20)=10100) |
|---|---|---|
| | 位或 | 20 | 3 = 23 (10111) |
& | 位與 | 20 & 3 = 0 (00000) |
^ | 位異或 | 20 ^ 3 = 23 (10111) |
<< | 左移 | 20 << 1 = 40 (101000) |
>> | 右移 | 20 >> 1 = 10 (1010) |
~ | 位取反 | ~20 = -21 (補碼) |
SQL Server 僅支援 & | ^ ~,無移位運算符(需用 POWER(2,n) 模擬)。
| 目標字符 | MySQL 轉義 | SQL Server 轉義 |
|---|---|---|
單引號 ' | \' | '' (兩個單引號) |
雙引號 " | \" | "" |
反斜槓 \ | \\ | 無需 (單引號字串中) |
| 換行 | \n | CHAR(10) |
| 回車 | \r | CHAR(13) |
| 製表 | \t | CHAR(9) |
| 退格 | \b | CHAR(8) |
-- MySQL 插入包含單引號的字串
INSERT INTO t(name) VALUES('O\'Reilly');
-- SQL Server
INSERT INTO t(name) VALUES('O''Reilly');
<=> 簡化 NULL 判斷;LEAST/GREATEST 替代 CASE 多值極值;REGEXP 解決複雜模式匹配。&&/|| 讓代碼更像 C/Java 風格;XOR 適用於奇偶校驗、開關切換邏輯。PreparedStatement) 避免手工拼接。