萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 運算子優先序完整表:從低到高詳細解析

運算子優先序總表(由低到高)

優先序越高越先運算。同一行者優先序相同,依左結合性(左至右)計算。

優先序運算子類型說明
1 (最低):=指派變數指派(如 SELECT @a := 1)
2||, OR, XOR邏輯或邏輯 OR、XOR
3&&, AND邏輯與邏輯 AND
4NOT邏輯非邏輯 NOT(受 HIGH_NOT_PRECEDENCE 影響)
5BETWEEN, CASE, WHEN, THEN, ELSE流程控制範圍判斷、CASE 運算式
6=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN比較比較運算子、NULL 安全比較 <=>
7|位元或Bitwise OR
8&位元與Bitwise AND
9<<, >>位元位移左移、右移
10-, +加減減法、加法
11*, /, DIV, %, MOD乘除乘法、除法、整數除法、取餘
12^位元異或Bitwise XOR
13- (一元), ~ (一元)一元運算負號、位元取反
14!邏輯非非標準 NOT(優先序高於標準 NOT)
15 (最高)BINARY, COLLATE型別轉換二進位字串轉換、排序規則指定

關鍵特殊規則

1. NOT 優先序變化

啟用 HIGH_NOT_PRECEDENCE SQL 模式時,NOT 優先序等同 !(第 14 級),否則為第 4 級。

-- 未啟用 HIGH_NOT_PRECEDENCE(預設)
SELECT NOT 1 = 0;  -- 解析為 NOT (1 = 0) → NOT 0 → 1

-- 啟用後
SET sql_mode = 'HIGH_NOT_PRECEDENCE';
SELECT NOT 1 = 0;  -- 解析為 (NOT 1) = 0 → 0 = 0 → 1

2. 括號強制分組(最高實際優先序)

SELECT 1 + 2 * 3;      -- 7  (先乘後加)
SELECT (1 + 2) * 3;    -- 9  (括號優先)

SELECT 10 - 5 - 2;     -- 3  (左結合: (10-5)-2)
SELECT 10 - (5 - 2);   -- 7  (括號改變順序)

3. 比較運算子鏈結

-- 解析為 (a = b) = c,通常非預期
SELECT 1 = 1 = 1;  -- (1=1)=1 → 1=1 → 1

-- 正確寫法
SELECT 1 = 1 AND 1 = 1;  -- 1

實戰陷阱與最佳實務

陷阱 1:邏輯運算子與比較運算子混用

-- 預期:a=1 且 b=2
SELECT * FROM t WHERE a = 1 AND b = 2;  -- 正確

-- 危險:|| 優先序低於 =
SELECT * FROM t WHERE a = 1 || b = 2;   -- 解析為 a = (1 || b) = 2  錯誤!
-- 應寫成
SELECT * FROM t WHERE a = 1 OR b = 2;

陷阱 2:指派運算子 := 在 SELECT 中

SELECT @a := 1, @b := @a + 1;  -- @a=1, @b=2
-- 注意::= 優先序最低,整個運算式最後才指派

陷阱 3:負號與冪次

SELECT -2 ^ 2;   -- (-2) ^ 2 = 4  (一元負號優先序 13 > ^ 的 12)
SELECT - (2 ^ 2); -- -4  (括號改變)

實用測試查詢

-- 快速驗證優先序
SELECT 
    1 + 2 * 3 AS '加乘',
    (1 + 2) * 3 AS '括號優先',
    10 - 5 - 2 AS '左結合減法',
    10 - (5 - 2) AS '括號改變',
    NOT 0 = 1 AS 'NOT比較',
    1 = 1 = 1 AS '比較鏈結',
    -2 ^ 2 AS '負號冪次';

開發者建議

  1. 善用括號:明確表達意圖,不要依賴記憶優先序
  2. 避免混用:|| 與 OR、&& 與 AND 擇一使用
  3. 比較鏈結拆開:用 AND 連接多個比較
  4. 檢查 SQL 模式:SELECT @@sql_mode 確認 HIGH_NOT_PRECEDENCE 狀態
  5. 複雜運算式拆分:用 CTE 或子查詢分步計算,提升可讀性

熟悉運算子優先序能避免微妙邏輯錯誤,但「明確括號」永遠是最好的文件與保護!

copyright © 萬盛學電腦網 all rights reserved