iT邦幫忙

DAY 29
5

只談MySQL系列 第 29

只談MySQL (第29天) MySQL的運算子

  • 分享至 

  • xImage
  •  

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 ...: 比較是否不在範圍內

  • !=, <>: 不等於

  1. 邏輯運算子
  • AND, &&: 且, 兩者均為真時才為真, 例如:
    mysql> SELECT 1 && 1;
    -> 1
    mysql> SELECT 1 && 0;
    -> 0
    mysql> SELECT 1 && NULL;
    -> NULL
    mysql> SELECT 0 && NULL;
    -> 0
    mysql> SELECT NULL && 0;
    -> 0
  • NOT, !: 非, 真時為假, 假時為真, 例如:
    mysql> SELECT NOT 10;
    -> 0
    mysql> SELECT NOT 0;
    -> 1
    mysql> SELECT NOT NULL;
    -> NULL
    mysql> SELECT ! (1+1);
    -> 0
    mysql> SELECT ! 1+1;
    -> 1
  • ||, OR: 或, 兩者有一真的即為真, 例如:
    mysql> SELECT 1 || 1;
    -> 1
    mysql> SELECT 1 || 0;
    -> 1
    mysql> SELECT 0 || 0;
    -> 0
    mysql> SELECT 0 || NULL;
    -> NULL
    mysql> SELECT 1 || NULL;
    -> 1
  • XOR: 除外或(Exclusive OR), 同時為真或為假時為假, 例如:
    mysql> SELECT 1 XOR 1;
    -> 0
    mysql> SELECT 1 XOR 0;
    -> 1
    mysql> SELECT 1 XOR NULL;
    -> NULL
    mysql> SELECT 1 XOR 1 XOR 1;
    -> 1

上一篇
只談MySQL (第28天) 語法結構
下一篇
只談MySQL (第30天) 系統函數(上)
系列文
只談MySQL30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

加油~!

我要留言

立即登入留言