MySQL的四種運算子(算術運算子、比較運算子、邏輯運算子和位運算子)

wulimingde發表於2020-10-15

一、算術運算子

MySQL 支援使用的算術運算子。
運算子註釋
+加法
-減法
*乘法
/除法
%取餘數
用法例項
 mysql> select 1+2,5-3,3*4,4/3,7%2;
+-----+-----+-----+--------+------+
| 1+2 | 5-3 | 3*4 | 4/3    | 7%2  |
+-----+-----+-----+--------+------+
|   3 |   2 |  12 | 1.3333 |    1 |
+-----+-----+-----+--------+------+
1 row in set (0.00 sec)

1)在除法運算和求餘數運算中,除數不能為0,若除數是O,返回的結果則為NULL。需要注意的是,如果有多個運算子,按照先乘除後加減的優先順序進行運算,相同優先順序的運算―符沒有先後順序。

2)在MySQL的欄位值內還有一種情況,某些字串型別的欄位儲存的數字型字串,這些欄位在進行算術運算時將會被自動轉換為數字的值。如果字串的開始部分是數字,在轉換時將被轉換為這個數字。如果是既包含字元又包含數字得的混合字串,無法轉換為數字時,將被轉換為0。這些細節在進行算術運算時需多加註意。

二、比較運算子

比較運算子是查詢資料記錄時經常使用的一類運算子。通過使用比較運算子可以判斷出表中有哪些記錄是符合條件的,如果比較的結果為真則返回1,如果為假則返回0,比較的結果如果不確定則返回NULL。其中字串在進行比較的時候預設是不區分大小寫的。

MySQL常用的比較運算子
運算子註釋
=等於
>大於
<小於
<=小於等於
>=大於等於
!=或<>不等於
IS NULL判斷一個值是否為NULL
IS NOT NULL判斷一個值是否不為 NULL
BETWEEN AND兩者之間
IN在集合中
LIKE萬用字元匹配,模糊查詢
GREATEST兩個或多個引數時返回最大值
LEAST兩個或多個引數時返回最小值
1、等於運算子

“=”是用來判斷數字、字串和表示式是否相等的,如果相等則返回1,如果不相等則返回0。如果比較的兩者有一個值是NULL,則比較的結果就是NULL。其中字元的比較是根據ASCII碼來判斷的,如果ASCII碼相等,則表示兩個字元相同;如果ASCIl碼不相等,則表示兩個字元不相同。

  • 常用的ASCII值I
    在這裡插入圖片描述
用法例項
mysql> select 5=5,'e'='e',(2+6)=(3+5),6='6',4=null;
+-----+---------+-------------+-------+--------+
| 5=4 | 'a'='e' | (2+6)=(3+5) | 6='6' | 4=null |
+-----+---------+-------------+-------+--------+
|   0 |       0 |           1 |     1 |   NULL |
+-----+---------+-a------------+-------+--------+
1 row in set (0.00 sec)

注意項

1)如果兩者都是整數,則按照整數值進行比較。
2)如果一個整數一個字串,欄位值的型別相同,則會自動將字串轉換為數字,再進行比較。
3)如果兩者都是字串,則按照字串進行比較。
4)如果兩者中至少有一個值是NULL,則比較的結果是NULL。

2、不等於運算子

不等於號有兩種寫法,分別是<>或者=,用於針對數字、字串和表示式不相等的比較。
如果不相等則返回1,如果相等則返回0,這點正好跟等於的返回值相反。需要注意的是不等
於運算子不能用於判斷 NULL。

用法例項
mysql> select 3<>3,4!='a','abc'!='cba',0<>null;
+------+--------+--------------+---------+
| 3<>3 | 4!='a' | 'abc'!='cba' | 0<>null |
+------+--------+--------------+---------+
|    0     |      1 |            1      |    NULL |
+------+--------+--------------+---------+
1 row in set, 1 warning (0.00 sec)
3、大於、大於等於、小於、小於等於運算子
  • 大於(>)運算子用來判斷左側的運算元是否大於右側的運算元,若大於返回1,否則返回0,不能用於判斷NULL。
  • 小於(<)運算子用來判斷左側的運算元是否小於右側的運算元,若小於返回1,否則返回0,不能用於判斷NULL。
  • 大於等於(>=)判斷左側的運算元是否大於等於右側的運算元,若大於等於返回1,否則返回0,不能用於判斷NULL。
  • 小於等於(<=)判斷左側的運算元是否小於等於右側的運算元,若小於等於返回1,否則返回,不能用於判斷NULL。
用法例項
mysql> select 5>2,'a'>4,'b'<'a','abc'< 'baa',null<9,(5+3)<=(6+8);
+-----+-------+---------+--------------+--------+--------------+
| 5>2 | 'a'>4 | 'b'<'a' | 'abc'< 'baa' | null<9 | (5+3)<=(6+8) |
+-----+-------+---------+--------------+--------+--------------+
 |   1 |     0 |       0 |            1 |   NULL |            1 |
+-----+-------+---------+--------------+--------+--------------+
1 row in set, 1 warning (0.00 sec)

//字串做比較時預設只會比較第一個字元的的大小。
//不同型別的欄位型別無法比較,返回值為0
4、IS NULL、IS NOTNULL運算子

IS NULL判斷一個值是否為NULL,如果為NULL返回1,否則返回0
IS NOT NULL判斷一個值是否不為NULL,如果不為NULL返回1,否則返回0

用法例項
mysql> select 2 IS NULL,'' IS NOT NULL,NULL IS NULL,0 IS NULL;
+-----------+----------------+--------------+-----------+
| 2 IS NULL | '' IS NOT NULL | NULL IS NULL | 0 IS NULL |
+-----------+----------------+--------------+-----------+
|         0 |              1 |            1 |         0 |
+-----------+----------------+--------------+-----------+
1 row in set (0.00 sec)

//空值不等於NULL。空值雖然不佔用空間,但是也表示一個值。
//NULL雖然佔用空間,但是不表示一個值,只表示一個NULL物件。
5、BETWEEN AND運算子

BETWEENAND比較運算通常用於判斷一個值是否落在某兩個值之間。可以用於判斷整數或者英文是否在某個數字或者字母之間。

用法例項
mysql> select 5 between 2 and 8,'a' between 'a' and 'b',6 between 1 and 6,'a' between 'b' and 'z';
+-------------------+-------------------------+-------------------+-------------------------+
| 5 between 2 and 8 | 'a' between 'a' and 'b' | 6 between 1 and 6 | 'a' between 'b' and 'z' |
+-------------------+-------------------------+-------------------+-------------------------+
|                 1 |                       1 |                 1 |                       0 |
+-------------------+-------------------------+-------------------+-------------------------+
1 row in set (0.00 sec)

// between對於取值之間的頭尾是包含的。類似與小於等於和大於等於。
6、LEAST、 GREATEST運算子

LEAST :當有兩個或者多個引數時,返回其中的最小值。如果其中一個值為NULL,則
返回結果就為NULL。
GREATEST :當有兩個或者多個引數時,返回其中的最大值。如果其中一個值為NULL.
則返回結果就為NULL。

用法例項
 mysql> select least(1,2,3,3.1),least('a','b','c'),least('a',5,'b'),least(1,4,8);
+------------------+--------------------+------------------+--------------+
| least(1,2,3,3.1) | least('a','b','c') | least('a',5,'b') | least(1,4,8) |
+------------------+--------------------+------------------+--------------+
|              1.0 | a                  | 0                |            1 |
+------------------+--------------------+------------------+--------------+
1 row in set, 2 warnings (0.00 sec)

//least :可以比較整數型別和浮點型的最小值,輸出型別自動轉換為浮點型的最小值。
//least:不能比較整數和字串型別的最小值。

mysql> select greatest('a','c',5),greatest(4,5,7),greatest(4.5,5,7),greatest('a','y','b');
+---------------------+-----------------+-------------------+-----------------------+
| greatest('a','c',5) | greatest(4,5,7) | greatest(4.5,5,7) | greatest('a','y','b') |
+---------------------+-----------------+-------------------+-----------------------+
| 5                   |               7 |               7.0 | y                     |
+---------------------+-----------------+-------------------+-----------------------+
1 row in set, 2 warnings (0.00 sec)

//greatest:可以比較整數型別和浮點型的最大值,輸出型別自動轉換為浮點型的最大值
//greatest:可以比較整數型和字元型的最大值,但是會將字串型別的值忽略不參與比較
7、IN、NOTIN運算子

IN:判斷一個值是否在對應的列表中,如果是返回1,否則返回0
NOT IN:判斷一個值是否不在對應的列表中,如果不是返回1,否則返回0

用法例項
mysql> select 'a' in ('a','b', 'c'),'c' not in ('a','b','c');
+-----------------------+--------------------------+
| 'a' in ('a','b', 'c') | 'c' not in ('a','b','c') |
+-----------------------+--------------------------+
|                     1 |                        0 |
+-----------------------+--------------------------+
1 row in set (0.00 sec)

8、LIKE、NOTLIKE運算子

LIKE用來匹配字串,如果匹配成功則返回1,反之返回0。LIKE支援兩種萬用字元: ‘%’ 用於匹配任意數目的字元,而 ’_’ 只能匹配一個字元。
NOT LIKE正好跟LIKE相反,如果沒有匹配成功則返回1,反之返回0

用法例項
mysql> select 'abc' like 'a%',12 like '1_' ,35 not like '3_67','ac'not like '__';
+-----------------+--------------+--------------------+-------------------+
| 'abc' like 'a%' | 12 like '1_' | 35 not like '3_67' | 'ac'not like '__' |
+-----------------+--------------+--------------------+-------------------+
|               1 |            1 |                  1 |                 0 |
+-----------------+--------------+--------------------+-------------------+
1 row in set (0.00 sec)

三、邏輯運算子

邏輯運算子又被稱為布林運算子,通常用來判斷表示式的真假,如果為真返回1,否則返回0,真和假也可以用TRUE和FALSE表示。

MySQL中支援使用的邏輯運算子有四種
運算子註釋
NOT或!邏輯非
AND或&&邏輯與
OR或 II邏輯或
XOR邏輯異或
  • 理解方式
                  1表示為真TURE,0表示為假FALSE
邏輯非                 1!= 0              0!= 1
 真的為假,假的為真
 
邏輯與              0&&0=0             1&&0=0       0&&!=0      1&&1=1  
兩個條件都為真為真,兩個為假為假

邏輯或              0||0=0               1||0=1          0||1=1         1||1=1  
兩個條件有一個為真則為真,兩個為假為假

邏輯異或          0xor0=0             1xor0=1       0&&1=1     1xor1=0
兩個條件一個為真即為真,兩個為真或兩個為假為假
1、邏輯非

邏輯運算子中最簡單的運算子就是邏輯非,邏輯非使用NOT或!表示。

例項操作
mysql> select not 2,!3,not 0,!(4%2),!NULL;
+-------+----+-------+--------+-------+
| not 2 | !3 | not 0 | !(4%2) | !NULL |
+-------+----+-------+--------+-------+
|     0 |  0 |     1 |      1 |  NULL |
+-------+----+-------+--------+-------+
1 row in set (0.00 sec)
  • 邏輯非將跟在它後面的邏輯測試取反,把真變為假,把假變為真。
    1)如果NOT後面的運算元為0時,所得值為1;
    2)如果運算元為非0時,所得值為0;
    3)如果運算元為NULL時,所得值為NULL。
2、邏輯與

邏輯與通常用於判斷兩個值或多個值得有效性,邏輯與使用AND或&&表示

例項操作
mysql> select 2 and 5,6 && 0,0&&NULL,1 and NULL;
+---------+--------+---------+------------+
| 2 and 5 | 6 && 0 | 0&&NULL | 1 and NULL |
+---------+--------+---------+------------+
|       1 |      0 |       0 |       NULL |
+---------+--------+---------+------------+
1 row in set (0.00 sec)
  • 邏輯與將邏輯測試判斷,所有值返回都是真返回真,否者返回假。

NULL在邏輯判斷中的含義

NULL本真並不表示0或1即真假。當判斷條件因為有NULL存在的時候無法判斷真假時就返回一個NULL值

判斷條件&&IIxor
1與NULLNULL11
NULL與1NULL11
0與NULL0NULLNULL
NULL與00NULLNULL
NULL與NULLNULLNULLNULL
3、邏輯或

邏輯或表示兩個值或多個值,其中有任意一個非零值,即返回真。邏輯或用||或OR表示

例項操作
MySQL 5.6  識別 “||” 符號的或運算子 
mysql>  select 4||5,6 or 0,0||5;
+------+--------+------+
| 4||5 | 6 or 0 | 0||5 |
+------+--------+------+
| 45   |      1 | 05   |
+------+--------+------+
1 row in set (0.00 sec)

MySQL 5.7  不識別 “||” 符號的或運算子,5.7邏輯與判斷的時候建議都使用 “or” 或運算子
mysql>  select 4||5,6 or 0,0||5;
+------+--------+------+
| 4||5 | 6 or 0 | 0||5 |
+------+--------+------+
| 45   |      1 | 05   |
+------+--------+------+
1 row in set (0.00 sec)
4、邏輯異或

任意兩個值的運算元,如果兩者都是0或者都是非0,則返回0;如果一個為0,另一個為非0,則返回結果為1;當任意一個值為 NULL時,返回值為NULL。邏輯異或用 “xor” 表示

例項操作
mysql> select 5 xor 6,0 xor 0,0 xor 5;
+---------+---------+---------+
| 5 xor 6 | 0 xor 0 | 0 xor 5 |
+---------+---------+---------+
|       0 |       0 |       1 |
+---------+---------+---------+
1 row in set (0.00 sec)

四、位運算子

位運算子實際上是對二進位制數進行計算的運算子。
MySQL內位運算會先將運算元變成二進位制格式,然後進行位運算,最後在將計算結果從二進位制變回到十進位制格式,方便使用者檢視。

MySQL支援6種位運算子
位運算子註釋
&按位與
I按位或
~按位取反
^按位異或
<<按位左移
>>按位右移
例項操作
  • 按位與、或、異或、取反
mysql> select 15&5,8|5,5^10,10&~1;
+------+-----+------+-------+
| 15&5 | 8|5 | 5^10 | 10&~1 |
+------+-----+------+-------+
|    5 |  13 |   15 |    10 |
+------+-----+------+-------+
1 row in set (0.00 sec)

運算過程                           15&5                          8|5                    5^10                      10&~1
第一步轉換為二進位制           15=1111      5=101              8=1000   5=101         5=101    10=1010            10=1010  1=1
第二步將二進位制數一位一位對其進行運算子判斷,對其方式為右對其向左補零。                                                 ~1=1110   
                                15=1111                        8=1000                  5=0101                     10=1010
                                 5=0101                        5=0101                 10=1010                     ~1=1110
                      得到          0101=5                        1101=13                 1111=15                     1010=10
  • 按位與運算(&),是對應的二進位制位都是1的,它們的運算結果為1,否則為0.

  • 按位或運算(|),是對應的二進位制位有一個或兩個為1的,運算結果為1,否則為0.

  • 按位異或運算(^),是對應的二進位制位不相同時,運算結果1,否則為0.

  • 按位取反(~),是對應的二進位制數逐位反轉,即1取反後變為0,0取反後變為1.通常結合其他的位運算一起使用,先對值取反在按另一個值補齊在進行其他的位運算子運算.

  • 按位左移、右移

mysql> select 5<<2,2<<5,15>>3,25>>5;
+------+------+-------+-------+
| 5<<2 | 2<<5 | 15>>3 | 25>>5 |
+------+------+-------+-------+
|   20 |   64 |     1 |     0 |
+------+------+-------+-------+
1 row in set (0.00 sec)

向左位移過程  5<<2
轉換為二進位制 5=101
將5的二進位制數整體向左移動兩個位置空出來的補零得到 10100
轉換為十進位制為25

向右位移的過程 15>>3
轉換為二進位制 15=1111
將15的二進位制數整體向右移動三個位置,移出的數丟棄得到 1
轉換為十進位制為1

:左移或右移運算子,都是將數轉換為二進位制後,然後在左移或右移指定的位數,超出的位數將被移除並丟棄,空出來的位置用0補齊。

五、運算子的優先順序

運算子,在使用過程中都有優先順序問題。運算子的優先順序決定了不同的運算子在計算過程中的先後順序。級別高的運算子會先進行計算,如果運算子的級別相同,MySQL會按照順序從左到右依次進行計算。如果不確定所使用的運算子的優先順序,可以使用()改變優先順序。

MySQL常用運算子的優先順序表

在這裡插入圖片描述

相關文章