MySQL運算符總結
MySQL提供了豐富的運算符,用于在SQL語句中進行各種計算和比較操作。這些運算符可以分為算術運算符、比較運算符、邏輯運算符、位運算符等幾大類。合理使用這些運算符可以構建復雜的查詢條件和計算表達式。
一、算術運算符
MySQL支持基本的算術運算,包括:
-
加法運算符(+): 用于兩個數值相加
SELECT 10 + 5; -- 結果為15
-
減法運算符(-): 用于兩個數值相減
SELECT 10 - 5; -- 結果為5
-
乘法運算符(*): 用于兩個數值相乘
SELECT 10 * 5; -- 結果為50
-
除法運算符(/): 用于兩個數值相除
SELECT 10 / 5; -- 結果為2.0000
-
取模運算符(%)或MOD(): 返回兩個數相除的余數
SELECT 10 % 3; -- 結果為1 SELECT MOD(10,3); -- 同樣結果為1
二、比較運算符
比較運算符用于比較兩個表達式,返回布爾值(TRUE/FALSE/UNKNOWN):
-
等于(=): 判斷兩個值是否相等
SELECT * FROM users WHERE age = 25;
-
不等于(!=或<>): 判斷兩個值是否不相等
SELECT * FROM users WHERE age != 25;
-
大于(>)和小于(<): 判斷一個值是否大于或小于另一個值
SELECT * FROM products WHERE price > 100;
-
大于等于(>=)和小于等于(<=): 包含等于條件的大小比較
SELECT * FROM orders WHERE amount >= 500;
-
BETWEEN...AND...: 判斷值是否在某個范圍內
SELECT * FROM employees WHERE salary BETWEEN 5000 AND 10000;
-
IN: 判斷值是否在指定列表中
SELECT * FROM customers WHERE country IN ('USA','UK','China');
-
LIKE: 模式匹配,常用于模糊查詢
SELECT * FROM products WHERE name LIKE '%apple%';
-
IS NULL/IS NOT NULL: 判斷值是否為NULL
SELECT * FROM users WHERE phone IS NOT NULL;
三、邏輯運算符
邏輯運算符用于組合多個條件:
-
AND(&&): 邏輯與,所有條件都為真時返回真
SELECT * FROM students WHERE age > 18 AND gender = 'M';
-
OR(||): 邏輯或,任一條件為真時返回真
SELECT * FROM products WHERE category = 'Electronics' OR price < 100;
-
NOT(!): 邏輯非,反轉布爾值
SELECT * FROM employees WHERE NOT department = 'HR';
-
XOR: 邏輯異或,當且僅當一個條件為真時返回真
SELECT * FROM users WHERE is_active XOR is_premium;
四、位運算符
位運算符對二進制位進行操作:
-
按位與(&): 對兩個數的二進制表示逐位進行與操作
SELECT 5 & 3; -- 結果為1 (0101 & 0011 = 0001)
-
按位或(|): 對兩個數的二進制表示逐位進行或操作
SELECT 5 | 3; -- 結果為7 (0101 | 0011 = 0111)
-
按位異或(^): 對兩個數的二進制表示逐位進行異或操作
SELECT 5 ^ 3; -- 結果為6 (0101 ^ 0011 = 0110)
-
按位取反(~): 對一個數的二進制表示逐位取反
SELECT ~1; -- 結果為-2 (取決于位數)
-
左移(<<)和右移(>>): 將二進制位向左或向右移動指定位數
SELECT 1 << 3; -- 結果為8 (0001左移3位變為1000) SELECT 8 >> 2; -- 結果為2 (1000右移2位變為0010)
五、運算符優先級
MySQL運算符按照以下優先級順序計算(從高到低):
-
一元運算符(如NOT、~)
-
算術運算符(*、/、%、+、-)
-
移位運算符(<<、>>)
-
位運算符(&、^、|)
-
比較運算符(=、!=、>、<、>=、<=、LIKE等)
-
邏輯運算符(NOT、AND、OR)
當不確定運算順序時,建議使用括號明確指定運算順序,這不僅能確保正確性,還能提高代碼可讀性。
六、注意事項
-
NULL處理:與NULL比較時需特別注意,使用
=
無法正確比較NULL值,應使用IS NULL
或IS NOT NULL
。 -
數據類型轉換:MySQL會嘗試自動轉換數據類型進行比較,但有時可能導致意外結果,建議確保比較的數據類型一致。
-
性能考慮:在索引列上使用函數或運算符可能導致索引失效,如
WHERE YEAR(date_column) = 2023
會使date_column上的索引無法使用。 -
浮點數比較:浮點數比較可能存在精度問題,建議使用范圍比較或轉換為DECIMAL后再比較。
REGEXP 運算符
在SQLSERVER里是沒有正則函數或者運算符的,MYSQL在這方面的確比較完善用來匹配字符串,語法格式為:expr REGEXP 匹配條件,如果expr滿足匹配條件,返回1;如果不滿足,則返回0;若expr或匹配條件任意一個為NULL,則結果為NULL
常用的幾種通配符:
(1)'^'匹配以該字符后面的字符開頭的字符串
(2)'$'匹配以該字符后面的字符結尾的字符串
(3)'.'匹配任何一個單字符
(4)'[...]'匹配在方括號內的任何字符。例如,“[abc]" 匹配a、b或c。字符的范圍可以使用一個'-',“[a-z]”匹配任何字母,而“[0-9]”匹配任何數字
(5) '' 匹配零個或多個在他前面的字符。例如,“x”匹配任何數量的''字符,“[0-9]”匹配任何數量的數字,而“.*”匹配任何數量的任何字符。
使用REGEXP 運算符進行字符串匹配運算,SQL語句如下:
SELECT 'ssky' REGEXP '^s','ssky' REGEXP 'y$' ,'ssky' REGEXP '.sky','ssky' REGEXP'[ab]';
由結果可以看到,指定匹配字符串為ssky。
'^s'表示匹配任何以字母s開頭的字符串,因此滿足匹配條件,返回1;
'y$'表示匹配任何以字母y結尾的字符串,因此滿足匹配條件,返回1;
'.sky'表示匹配任何以sky結尾,字符長度為4的字符串,因此滿足匹配條件,返回1;
'^s'表示匹配任何以字母s開頭的字符串,因此滿足匹配條件,返回1;
'[ab]'表示匹配任何包含字母a或者b的字符串,指定字符串中沒有字母a也沒有字母b,因此不滿足匹配條件,返回0;
注意:正則表達式是一個可以進行復雜查詢的強大工具,相對于LIKE字符串匹配,他可以使用更多的通配符類型,查詢結果更加靈活