MySQL提供的系統函數及運算子的清單如下列連結網頁:
http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html
因為實在太多, 所以今天我們先進行和運算子有關的討論, 明天再談談系統函數...
MySQL提供的運算子實在很多, 只要經常使用Java或C語言寫程式的人, 大多數都可以瞭解其用法, 我就不再詳述各運算子的用法了.
1 優先順多
自從小學教四則運算開始, 優先順序就是要計算出正確答不可或缺的判斷, MySQL的運算子的優先順序是
INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
&&, AND
XOR
||, OR
:=
由上到下即為優先順序, 越上方的優先順序越高...
2 資料型態自轉換
有時候, 在運算的過程中, 我們會希望系統能自動做些資料型態轉換的工作, 不用寫程式控制, 例如:
mysql> SELECT 1+'1';
MySQL會把字串'1'自動轉換為整數1, 然後再計算出結果為2. 而這個例子:
mysql> SELECT CONCAT(2,' test');
則會將2轉換字串'2', 再和字串' test'合併起來為'2 test'.
資料型態自動轉換的原則是, 在四則運算中, 將會把字串轉換為數值, 如果字串中包英文字母或其他非數字字元, 會轉換為0, 如果是數字字串, 就會轉換對等的數值來計算, 例如:
mysql> SELECT '1'+'1', '1'+'a', '12'+'a2', 12*'2', '1.23'+'1.23', '12'/3;
+---------+---------+-----------+--------+---------------+--------+
| '1'+'1' | '1'+'a' | '12'+'a2' | 12*'2' | '1.23'+'1.23' | '12'/3 |
+---------+---------+-----------+--------+---------------+--------+
| 2 | 1 | 12 | 24 | 2.46 | 4 |
+---------+---------+-----------+--------+---------------+--------+
1 row in set, 2 warnings (0.03 sec)
如果是數值函數呢? 例如餘數運算函數MOD():
mysql> SELECT MOD('123', '10');
+------------------+
| MOD('123', '10') |
+------------------+
| 3 |
+------------------+
1 row in set (0.00 sec)
MySQL會自動把字串'123'和'10'都轉換成數字再運算.
對於字串的合併就要用CONCAT函數來處理了...如前例:
mysql> SELECT CONCAT(2,' test');
因為在字串函數中, MySQL會自動將2轉換字串來處理.
3 比較運算子和函數
MySQL提供的比較運算函數相當豐富, 有下列:
- COALESCE(): 回傳第一個非NULL的值, 例如:
[code]mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,3);
-> 3
GREATEST(): 回傳最大參數值
IN(): 回傳比較的值是否在參數列中
INTERVAL(): 回傳頭函數中第一個參數在其後參數的那個區間內, 例如:
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
-> 0
ISNULL(): 檢查是否為NULL值
LEAST(): 回傳最小參數值
NOT IN(): 回傳比較的值是否'不'在參數列中
STRCMP(): 比較字串是否相等, 回傳1, 如果左字串排序上後於右字串; 回傳-1, 如果左字串排序先於右字串; 回傳0, 如果相同, 例如:
mysql> SELECT STRCMP('text', 'text2');
-> -1
mysql> SELECT STRCMP('text2', 'text');
-> 1
mysql> SELECT STRCMP('text', 'text');
-> 0
比較運算子有:
<=>: 如有NULL值來比較時, 不會回傳NULL值, 例如:
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
=: 比較是否相等
=: 大於或等於
: 大於, 且不等於
IS NOT NULL: 非NULL值
IS NULL: 測試某值是否NULL值
IS NOT: 測試某值為非布林值, 布林值有True、False及Unknown三種, 例如:
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
-> 1, 1, 0
IS: 測試某值為布林值, 例如:
mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
-> 1, 1, 1
<=: 小於或等於
<: 小於, 且不等於
LIKE: 萬用字元比較, %表示不管有多少字元; ?號則是每一個問號代表一個不指定字元
NOT LIKE: LIKE的相反
BETWEEN ... AND ...: 比較是否在範圍內
NOT BETWEEN ... AND ...: 比較是否不在範圍內
!=, <>: 不等於