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 按表達式的順序從左到右依次計算。
另外,在無法確定優先級的情況下,可以使用圓括號“()”來改變優先級,並且這樣會使計算過程更加清晰。