1. 程式人生 > >一步一步學MySQL---17 MySQL運算子

一步一步學MySQL---17 MySQL運算子

17.1 算術運算子

MySQL中,算術運算子包含加、減、乘、除、求模。

運算子 描述 表示式形式
+ 加法 x1+x2+x3+…+xn
- 減法 x1-x2-x3…-xn
* 乘法 x1*x2*x3…*xn
/(DIV) 除法 x1/x2/x3…/xn 或 x1 DIV x2 DIV x3…DIVxn
%(MOD) 求餘 x1%x2%x3…%xn 或 x1 MOD x2 MOD x3…MOD xn

例1:執行SQL語句select,獲取各種算術運算後的結果

mysql> select 6+4 加法運算,
-> 6-4 減法運算,
-> 6*4 乘法運算,
-> 6/4 除法運算,
-> 6 div 4 除法運算,
-> 6%4 求餘運算,
-> 6 mod 4 求餘運算;

或者:

mysql> select 6+4 加法運算, 6-4 減法運算, 6*4 乘法運算, 6/4 除法運算, 6 div 4 除法運算, 6%4 求餘運算, 6 mod 4 求餘運算;

這裡寫圖片描述

例2:查詢員工的月工資、年薪

mysql> select ename 員工, salary 月薪, salary*12 年薪 from employee;

這裡寫圖片描述

注意:在做除法運算或者求餘操作時,如果除數為0,將是非法操作,返回結果為NULL,如下所示:

mysql> select 6/0 除法運算, 6 div 0 除法運算, 6%0 求餘運算, 6 mod 0 求餘運算;

這裡寫圖片描述

17.2 比較運算子

MySQL所支援的比較運算子有:

運算子 描述 表示式形式
> 大於 x1>x2
< 小於 x1
= 或者 <=> 等於 x1=x2 或者 x1<=>x2
!= 或者 <> 不等於 x1!=x2 或者 x1<>x2
> 大於等於 x1>=x2
<= 小於等於 x1<=x2
between and 存在於指定範圍 x1 between and x2
is null 為空 x1 is null
in 存在於指定範圍 X1 in(value1,value2,value3,…valuen)
like 萬用字元匹配 x1 like expression
regexp 正則表示式匹配 x1 regexp regularexpression

例1:執行帶有“=”和“<=>”比較運算子的SQL語句select

mysql> #等號的使用

mysql> select 1=1 數值比較,
-> ‘ShangHai’=’ShangHai’,
-> 1+2=3+1 表示式比較,
-> 1<=>1 數值比較,
-> ‘ShangHai’<=>’ShangHai’ 字串比較,
-> 1+2<=>3+3 表示式比較;

也可以寫成:

mysql> select 1=1 數值比較, “ShangHai”=”ShangHai”, 1+2=3+1 表示式比較, 1<=>1 數值比較, “ShangHai”<=>”ShangHai” 字串比較, 1+2<=>3+3 表示式比較;

這裡寫圖片描述

說明:“=”和“<=>”比較運算子可以判斷數值、字串和表示式是否相等。如果相等,則返回1;如果不相等,則返回0。

注意:“=”和“<=>”比較運算子在比較字串是否相等時,依據字元的ASC||碼來進行判斷。前者不能操作NULL(空值),後者可以。如:

mysql> select NULL=NULL “=符號效果”, NULL<=>NULL “<=>符號效果”;

這裡寫圖片描述

例2:執行帶有“!=”和“<>”比較運算子的SQL語句select

mysql> #不等號的使用#

mysql> select 1!=1 數值比較, “Shanghai”!=”ShangHai” 字串比較, 1+2!=3+3 表示式比較, 1<>1 數值比較, “ShangHai”<>”ShangHai” 字串比較, 1+2<>3+3 表示式比較;

說明:符號“!=”和“<>”用來判斷數值、字串和表示式是否不相等。如果不相等則返回1,;如果相等則返回0。
注意:從上面的結果可以看出,字串比較時,MySQL是不區分大小寫的,ShangHai與Shanghai是一樣的。

例3:執行帶有“>”、“>=”、“<”和“<=”比較運算子的SQL語句select。

mysql> select 1>=1 數值比較,
-> ‘abcdefg’>=’abcdfhg’ 字串比較,
-> 1+2>=3+4 表示式比較,
-> 1>1 ‘>符號使用’,
-> ‘abcdefg’<=’abcdeeg’ as ‘<=符號使用’,
-> 1+2<3+4 ‘<符號使用’;

或者

mysql> select 1>=1 數值比較, ‘abcdefg’>=’abcdfhg’ 字串比較, 1+2>=3+4 表示式比較, 1>1 ‘>符號使用’, ‘abcdefg’<=’abcdeeg’ as ‘<=符號使用’, 1+2<3+4 ‘<符號使用’;

這裡寫圖片描述

說明:符號“>”、“>=”、“<”和“<=”主要用來判斷數值、字串和表示式的相關比較,如果表示式成立則返回1,否則返回0。
注意:“>”、“>=”、“<”和“<=”比較運算子也不能操作NULL(空值)

17.3 正則表示式運算子

所謂正則表示式,就是通過模式去匹配一類字串。

MySQL支援的模式字元如下:

模式字元 含義
^ 匹配字串的開始部分
$ 匹配字串的結束部分
. 匹配字串中的任意一個字元
[字元集合] 匹配字元集合中的任意一個字元
[^字元集合] 匹配字元集合外的任意一個字元
這裡寫圖片描述 匹配str1、str2和str3中任意一個字串
* 匹配字元,包含0個和多個
+ 匹配字元,至少包含1個
字串{N} 字串出現N次
字串(M,N) 字串出現至少M次,至多N次

例1:執行帶有“^”模式字元的SQL語句select,實現比較是否以特定字元或字串開頭。

mysql> select “ShangHaiPuDong” regexp “^s” 特定字元開頭,
-> “ShangHaiPuDong” regexp “^Shang” 特定字串開頭,
-> “ShangHaiPuDong” regexp “^P” 特定字元開頭,
-> “ShangHaiPuDong” regexp “^SHANG” 特定字串開頭,
-> “ShangHaiPuDong” regexp “^Hai” 特定字串開頭;

這裡寫圖片描述

說明:通過模式字元“^”可以比較是否以特定字元或特定字串開頭。如果相符,則返回1;如果不符,則返回0
$
例2:執行帶有“$”模式字元的SQL語句select,實現比較是否以特定字元或字串結尾。

mysql> select “Shanghai” regexp 這裡寫圖片描述 特定字元結尾, “Shanghai” regexp 這裡寫圖片描述 特定字串結尾, “ShangHai” regexp 這裡寫圖片描述 特定字元結尾, “Shanghai” regexp 這裡寫圖片描述 特定字串結尾;

或者

mysql> select “Shanghai” regexp “這裡寫圖片描述” 特定字元結尾,
-> “Shanghai” regexp 這裡寫圖片描述 特定字串結尾,
-> “ShangHai” regexp 這裡寫圖片描述 特定字元結尾,
-> “Shanghai” regexp 這裡寫圖片描述特定字串結尾;

這裡寫圖片描述

說明:通過模式字元“$”可以比較是否以特定字元或特定字串結尾。如果相符,則返回1;如果不符,則返回0

例3:執行帶有“.”模式字元的SQL語句select,實現比較是否包含固定數目的任意字元。

mysql> select “shanghaipudong” regexp “^s…” 匹配以字元s開頭的3個任意字元;

這裡寫圖片描述

例4:執行帶有“[]”和“[^]”模式字元的SQL語句select,可以實現比較是否包含指定字元中的任意一個和指定字元外任意一個。

mysql> select “shanghaipudong” regexp “[aefgh]” 指定字元集合中任一字元,
-> “shanghaipudong” regexp “[a-zA-Z]” 指定字元中的集合區間,
-> “shanghaipudong” regexp “[^aefgh]” 指定字元集合外的任一字元,
-> “shanghaipudong” regexp “[^a-zA-Z0-9]” 指定字元外集合區間;

這裡寫圖片描述

說明:通過模式字元“[]”和“[^]”可以匹配指定的字元中合字元外的任意一個字元。如果相符,則返回1;如果不符,則返回0

例5:執行帶有“*”和“+”模式字元的SQL語句select,可以實現比較是否包含多個指定字元。

mysql> select “shanghai” regexp “b*g”,”shanghai” regexp “b+n”;

這裡寫圖片描述

說明:通過模式字元“*”和“+”可以匹配字元g之前是否有多個字元a,前者可以表示有0個或任意個字元,後者至少表示一個字元。因此結果是1和0。

例6:執行帶有“|”模式字元的SQL語句select,可以實現比較是否包含指定字串中任意一個字串。

mysql> select “mysqljavapython” regexp “java” 指定單個字串,
-> “mysqljavapython” regexp “mysql|java” 指定多個字串,
-> “mysqljavapython” regexp “mysql|java|python” 指定多個字串,
-> “mysqljavapython” regexp “spark|python” 指定多個字串,
-> “mysqljavapython” regexp “spark|html” 指定多個字串;

或者:

mysql> select “mysqljavapython” regexp “java” 指定單個字串, “mysqljavapython” regexp “mysql|java” 指定多個字串, “mysqljavapython” regexp “mysql|java|python” 指定多個字串, “mysqljavapython” regexp “spark|python” 指定多個字串, “mysqljavapython” regexp “spark|html” 指定多個字串;

這裡寫圖片描述

說明:通過模式字元“|”可以匹配指定的任意一個字串,如果只有一個字串,則不需要模式字元“|”。如果相符,則返回1,否則返回0

例7:執行帶有“{M}”和“{M,N}”模式字元的SQL語句select,可以實現比較是否包含多個指定字串。

mysql> select “cccjgong” regexp “c{3}” 匹配3個c,
-> “cccjgongg” regexp “g{2}” 匹配2個g,
-> “cgong” regexp “cj{1,2}” 至少1個最多2個,
-> “cjcjgong” regexp “cj{1,2}” 至少1個最多2個;

這裡寫圖片描述

說明:c{3}表示字元c連續出現3次,cj{1,2}表示字串cj至少出現1次,最多出現2次。

mysql> select “cccjgong” regexp “c{3}” 匹配3個c,
-> “chccjgong” regexp “c{3}” 匹配3個c,
-> “chccjggong” regexp “g{3}” 匹配3個g,
-> “chccjggong” regexp “g{2}” 匹配2個g,
-> “chccjggong” regexp “cj{1,2}” 至少1個最多2個cj,
-> “cjccjggong” regexp “cj{1,2}” 至少1個最多2個cj,
-> “cjccjcjgng” regexp “cj{1,2}” 至少1個最多2個cj,
-> “cjcjcjcjgng” regexp “cj{1,2}” 至少1個最多2個cj;

17.4 邏輯運算子

在MySQL中,邏輯運算子包含與、或、非、異或運算。

運算子 描述 表示式形式
and(&&) x1 and x2 或者 x1 && x2
or(這裡寫圖片描述 x1 or x2 或者 x1
not(!) not x1 或者 !x1
xor 異或 x1 xor x2

例1:執行帶有“and”或者“&&”邏輯運算子的SQL語句select

mysql> select 3 and 4, 3 && 4,
-> 0 and 4, 0 && 4,
-> 0 and NULL, 0 && null,
-> 3 and NULL, 3 && NULL;

說明:與運算子“and”和“&&”作用一樣,所有運算元不為0且不為NUL(空值)時,結果返回1;存在一個運算元為0時,結果返回0;存在任意一個運算元為NULL且沒有運算元為0時,結果返回NULL。

例2:執行帶有“or”或者“||”邏輯運算子的SQL語句select

mysql> select 3 or 4,
-> 3 || 4,
-> 0 or 4,
-> 0 || 4,
-> 3 or NULL,
-> 3 || NULL,
-> 0 or NULL,
-> 0 || NULL,
-> 0 or 0,
-> 0 || 0;

這裡寫圖片描述

說明:或運算子“or”和“||”作用一樣,所有運算元中存在任何一個運算元不為0,結果返回1;所有運算元中不包含非0的數字,但包含NULL(空值),結果返回NULL;所有運算元都為0,結果返回0。

例3:執行帶有“not”或者“!”邏輯運算子的SQL語句select

mysql> select not 3,
-> !3,
-> not 0,
-> !0,
-> not NULL,
-> !NULL;

這裡寫圖片描述

說明:非運算子“not”和“!”作用一樣,如果運算元為非0數字,結果返回0;如果運算元為0,結果返回1;如果運算元為NULL(空值),結果返回NULL。

例4:執行帶有“xor”邏輯運算子的SQL語句select

mysql> select 3 xor 4,
-> 0 xor 0,
-> NULL xor NULL,
-> 0 xor 4,
-> 0 xor NULL,
-> 3 xor NULL,
->3 xor 4 xor 5;

這裡寫圖片描述

說明:對於異或xor運算子,如果運算元中包含NULL(空值),結果返回NULL;如果運算元同為0或者同為非0,結果返回0;如果一個運算元為0,另一個不為0,結果返回1。

17.5 位運算

MySQL支援的位運算子如下:

運算子 描述 表示式形式
& 按位與 x1 & x2
這裡寫圖片描述 按位或 x1 x2
~ 按位取反 ~x1
^ 按位異或 x1 ^ x2
<< 按位左移 x1 << x2
這裡寫圖片描述 按位右移 x1 >> x2

例1:執行帶有“&”位運算子的SQL語句select

mysql> select bin(1 & 1), bin(1 & 0), bin(0 & 0);

這裡寫圖片描述

mysql> select 5 & 6, bin(5 & 6) 二進位制表示,
-> 4 & 5 & 6, bin(4 & 5 & 6) 二進位制表示;

這裡寫圖片描述

說明:按位與運算(&)時,首先將十進位制數轉換成二進位制數,然後按位與操作,即兩個數都為1時,結果才為1,其他都為0,最後將與後的結果轉換成十進位制數。

例2:執行帶有“|”位運算子的SQL語句select

mysql> select bin(1 | 1), bin(1 | 0), bin(0 | 0);

這裡寫圖片描述

mysql> select 5 | 6, bin(5 | 6) 二進位制表示,
-> 4 | 5 | 6, bin(4 | 5 | 6) 二進位制表示;

說明:按位或運算(|)時,首先將十進位制數轉換成二進位制數,然後按位或操作,即只要有一個運算元為1,按位或的結果就為1,0與0按位或的結果為0。

例3:執行帶有“~”位運算子的SQL語句select

mysql> select bin(~1), bin(~0);

這裡寫圖片描述

mysql> select ~4, bin(~4) 二進位制表示;

這裡寫圖片描述

說明:按位取反運算(~)時,1取反的結果為0,0取反的結果為1。

例4:執行帶有“^”位運算子的SQL語句select

mysql> select bin(1 ^ 1), bin(1 ^ 0), bin(0 ^ 1), bin(0 ^ 0);

這裡寫圖片描述

mysql> select 4 ^ 5, bin(4 ^ 5);

這裡寫圖片描述

說明:按位異或(^)運算時,相同的數異或的結果為0,不同的數異或的結果為1。

例5:執行帶有“<<”和“>>”位運算子的SQL語句select
mysql> select bin(5) 二進位制表示,
-> 5<<2, bin(5<<2) 二進位制表示,
-> 5>>3, bin(5>>3) 二進位制表示;

這裡寫圖片描述

說明:左移右邊補0,右移左邊補0。