MySQL常用運算子詳解

2020-07-16 10:04:44
MySQL 資料庫中的表結構確立後,表中的資料代表的意義就已經確定。而通過 MySQL 運算子進行運算,就可以獲取到表結構以外的另一種資料。

例如,學生表中存在一個 birth 欄位,這個欄位表示學生的出生年份。而運用 MySQL 的算術運算子用當前的年份減學生出生的年份,那麼得到的就是這個學生的實際年齡資料。

MySQL 支援 4 種運算子,分別是:

1) 算術運算子

執行算術運算,例如:加、減、乘、除等。

2) 比較運算子

包括大於、小於、等於或者不等於,等等。主要用於數值的比較、字串的匹配等方面。例如:LIKE、IN、BETWEEN AND 和 IS NULL 等都是比較運算子,還包括正規表示式的 REGEXP 也是比較運算子。

3) 邏輯運算子

包括與、或、非和互斥或等邏輯運算子。其返回值為布林型,真值(1 或 true)和假值(0 或 false)。

4) 位運算子

包括按位元與、按位元或、按位元取反、按位元互斥或、按位元左移和按位元右移等位運算子。位運算必須先將資料轉換為二進位制,然後在二進位制格式下進行操作,運算完成後,將二進位制的值轉換為原來的型別,返回給使用者。

算術運算子

算術運算子是 SQL 中最基本的運算子,MySQL 中的算術運算子如下表所示。

算術運算子 說明
+ 加法運算
- 減法運算
* 乘法運算
/ 除法運算,返回商
% 求餘運算,返回餘數

比較運算子

比較運算子的語法格式為:

<表示式1> {= | < | <= | > | >= | <=> | < > | !=} <表示式2>

MySQL 支援的比較運算子如下表所示。

比較運算子 說明
= 等於
< 小於
<= 小於等於
> 大於
>= 大於等於
<=> 安全的等於,不會返回 UNKNOWN
<> 或!= 不等於
IS NULL 或 ISNULL 判斷一個值是否為 NULL
IS NOT NULL 判斷一個值是否不為 NULL
LEAST 當有兩個或多個引數時,返回最小值
GREATEST 當有兩個或多個引數時,返回最大值
BETWEEN AND 判斷一個值是否落在兩個值之間
IN 判斷一個值是IN列表中的任意一個值
NOT IN 判斷一個值不是IN列表中的任意一個值
LIKE 萬用字元匹配
REGEXP 正規表示式匹配

下面分別介紹不同的比較運算子的使用方法。

1) 等於運算子“=”

等號“=”用來判斷數位、字串和表示式是否相等。如果相等,返回值為 1,否則返回值為 0。

資料進行比較時,有如下規則:
  • 若有一個或兩個引數為 NULL,則比較運算的結果為 NULL。
  • 若同一個比較運算中的兩個引數都是字串,則按照字串進行比較。
  • 若兩個引數均為正數,則按照整數進行比較。
  • 若一個字串和數位進行相等判斷,則 MySQL 可以自動將字串轉換成數位。

2) 安全等於運算子“<=>”

用於比較兩個表示式的值。當兩個表示式的值中有一個為空值或者都為空值時,將返回 UNKNOWN。

對於運算子“<=>”,當兩個表示式彼此相等或都等於空值時,比較結果為 TRUE;若其中一個是空值或者都是非空值但不相等時,則為 FALSE,不會出現 UNKNOWN 的情況。

3) 不等於運算子“<>”或者“!=”

“<>”或者“!=”用於數位、字串、表示式不相等的判斷。如果不相等,返回值為 1;否則返回值為 0。這兩個運算子不能用於判斷空值(NULL)。

4) 小於或等於運算子“<=”

“<=”用來判斷左邊的運算元是否小於或等於右邊的運算元。如果小於或等於,返回值為 1;否則返回值為 0。“<=”不能用於判斷空值。

5) 小於運算子“<”

“<”用來判斷左邊的運算元是否小於右邊的運算元。如果小於,返回值為 1;否則返回值為 0。“<”不能用於判斷空值。

6) 大於或等於運算子“>=”

“>=”用來判斷左邊的運算元是否大於或等於右邊的運算元。如果大於或等於,返回值為 1;否則返回值為 0。“>=”不能用於判斷空值。

7) 大於運算子“>”

“>”用來判斷左邊的運算元是否大於右邊的運算元。如果大於,返回值為 1;否則返回值為 0。“>”不能用於判斷空值。

8) IS NULL(或者 ISNULL)

IS NULL 和 ISNULL 用於檢驗一個值是否為 NULL,如果為 NULL,返回值為 1;否則返回值為 0。

9) IS NOT NULL

IS NOT NULL 用於檢驗一個值是否為非 NULL,如果為非 NULL,返回值為 1;否則返回值為 0。

10) BETWWEN AND

語法格式為:

<表示式> BETWEEN <最小值> AND <最大值>

<表示式>大於或等於<最小值>,且小於或等於<最大值>,則 BETWEEN 的返回值為 1;否則返回值為 0。

11) LEAST

語法格式為:

LEAST(<值1>,<值2>,…,<值n>)

其中,值 n 表示參數列中有 n 個值。存在兩個或多個引數的情況下,返回最小值。若任意一個自變數為 NULL,則 LEAST() 的返回值為 NULL。

12) GREATEST

語法格式為:

GREATEST (<值1>,<值2>,…,<值n>)

其中,值 n 表示參數列中有 n 個值。存在兩個或多個引數的情況下,返回最大值。若任意一個自變數為 NULL,則 GREATEST() 的返回值為 NULL。

13) IN

IN 運算子用來判斷運算元是否為 IN 列表中的一個值。如果是,返回值為 1;否則返回值為 0。

14) NOT IN

NOT IN 運算子用來判斷表示式是否為 IN 列表中的一個值。如果不是,返回值為 1;否則返回值為 0。

邏輯運算子

在 SQL 語言中,所有邏輯運算子求值所得的結果均為 TRUE、FALSE 或 NULL。在 MySQL 中分別體現為 1(TRUE)、0(FALSE)和 NULL。

MySQL 中的邏輯運算子如下表所示。

邏輯運算子 說明
NOT 或者 ! 邏輯非
AND 或者 && 邏輯與
OR 或者 || 邏輯或
XOR 邏輯互斥或

下面分別介紹不同的邏輯運算子的使用方法。

1) NOT 或者 !

邏輯非運算子 NOT 或者 !,表示當運算元為 0 時,返回值為 1;當運算元為非零值時,返回值為 0;當運算元為 NULL 時,返回值為 NULL。

2) AND 或者 &&

邏輯與運算子 AND 或者 &&,表示當所有運算元均為非零值並且不為 NULL 時,返回值為 1;當一個或多個運算元為 0 時,返回值為 0;其餘情況返回值為 NULL。

3) OR 或者 ||

邏輯或運算子 OR 或者 ||,表示當兩個運算元均為非 NULL 值且任意一個運算元為非零值時,結果為 1,否則結果為 0;當有一個運算元為 NULL 且另一個運算元為非零值時,結果為 1,否則結果為 NULL;當兩個運算元均為 NULL 時,所得結果為 NULL。

4) XOR

邏輯互斥或運算子 XOR。當任意一個運算元為 NULL 時,返回值為 NULL;對於非 NULL 的運算元,若兩個運算元都不是 0 或者都是 0 值,則返回結果為 0;若一個為 0,另一個不為非 0,則返回結果為 1。

位運算子

位運算子是用來對二進位制位元組中的位進行移位或者測試處理的。

MySQL 中提供的位運算子如下表所示。

位運算子 說明
| 按位元或
& 按位元與
^ 按位元互斥或
<< 按位元左移
>> 按位元右移
~ 按位元取反,反轉所有位元

下面分別介紹不同的位運算子的使用方法。

1) 位或運算子“|”

位或運算的實質是將參與運算的兩個資料按對應的二進位制數逐位進行邏輯或運算。若對應的二進位制位有一個或兩個為 1,則該位的運算結果為 1,否則為 0。

2) 位與運算子“&”

位與運算的實質是將參與運算的兩個資料按對應的二進位制數逐位進行邏輯與運算。若對應的二進位制位都為 1,則該位的運算結果為 1,否則為 0。

3) 位互斥或運算子“^”

位互斥或運算的實質是將參與運算的兩個資料按對應的二進位制數逐位進行邏輯互斥或運算。對應的二進位制位不同時,對應位的結果才為 1。如果兩個對應位都為 0 或者都為 1,則對應位的結果為 0。

4) 位左移運算子“<<”

位左移運算子“<<”使指定的二進位制值的所有位都左移指定的位數。左移指定位數之後,左邊高位的數值將被移出並丟棄,右邊低位空出的位置用 0 補齊。

語法格式為表示式<<n,這裡 n 指定值要移位的位數。

5) 位右移運算子“>>”

位右移運算子“>>”使指定的二進位制值的所有位都右移指定的位數。右移指定位數之後,右邊高位的數值將被移出並丟棄,左邊低位空出的位置用 0 補齊。

語法格式為表示式>>n,這裡 n 指定值要移位的位數。

6) 位取反運算子“~”

位取反運算子的實質是將參與運算的資料按對應的二進位制數逐位反轉,即 1 取反後變 0,0 取反後變為 1。

運算子的優先順序決定了不同的運算子在表示式中計算的先後順序,下表列出了 MySQL 中的各類運算子及其優先順序。

優先順序由低到高排列 運算子
1 =(賦值運算)、:=
2 II、OR
3 XOR
4 &&、AND
5 NOT
6 BETWEEN、CASE、WHEN、THEN、ELSE
7 =(比較運算)、<=>、>=、>、<=、<、<>、!=、 IS、LIKE、REGEXP、IN
8 |
9 &
10 <<、>>
11 -(減號)、+
12 *、/、%
13 ^
14 -(負號)、?(位反轉)
15 !

可以看出,不同運算子的優先順序是不同的。一般情況下,級別高的運算子優先進行計算,如果級別相同,MySQL 按表示式的順序從左到右依次計算。

另外,在無法確定優先順序的情況下,可以使用圓括號“()”來改變優先順序,並且這樣會使計算過程更加清晰。