1. 程式人生 > >MySQL學習之路5(2)

MySQL學習之路5(2)

常見運算子介紹

MySQL的內部運算主要有四大類:
算術運算子、比較運算子、邏輯運算子、位操作運算子。
1.算術運算子
MySQL中的算術運算子

運算子 作用
+ 加法運算
- 減法運算
* 乘法運算
/ 除法運算,返回商
% 求餘運算,返回餘數
例:建立表tmp14,定義資料型別為INT的欄位num,插入值64,對num值進行算術運算:
mysql> CREATE TABLE tmp14(num INT);
Query OK, 0 rows affected (1.26 sec)

mysql> INSERT INTO tmp14 value(64);
Query OK, 1 row affected (0.36 sec)

mysql> SELECT num,num+10,num-3+5,num+36.5 FROM tmp14;
+------+--------+---------+----------+
| num  | num+10 | num-3+5 | num+36.5 |
+------+--------+---------+----------+
|   64 |     74 |      66 |    100.5 |
+------+--------+---------+----------+
1 row in set (0.24 sec)

例:對tmp14中的num進行乘法除法運算:

mysql> SELECT num,num*2,num/2,num/3,num%3 FROM tmp14;
+------+-------+---------+---------+-------+
| num  | num*2 | num/2   | num/3   | num%3 |
+------+-------+---------+---------+-------+
|   64 |   128 | 32.0000 | 21.3333 |     1 |
+------+-------+---------+---------+-------+
1 row in set (0.00 sec)

例:用0除num。

mysql> SELECT num,num/0,num%0 FROM tmp14;
+------+-------+-------+
| num  | num/0 | num%0 |
+------+-------+-------+
|   64 |  NULL |  NULL |
+------+-------+-------+
1 row in set, 2 warnings (0.07 sec)

結果為NULL.

2.比較運算子
2.1等於運算子 =
“=”顧名思義,用來判斷兩東西是否相等(數字、字串、表示式)。
例:使用‘=’來進行相等判斷:

mysql> SELECT 1=0,'2'=2,2=2,'0.02'=0,'B'='B',(1+3)=2+2,NULL=NULL;
+-----+-------+-----+----------+---------+-----------+-----------+
| 1=0 | '2'=2 | 2=2 | '0.02'=0 | 'B'='B' | (1+3)=2+2 | NULL=NULL |
+-----+-------+-----+----------+---------+-----------+-----------+
|   0 |     1 |   1 |        0 |       1 |         1 |      NULL |
+-----+-------+-----+----------+---------+-----------+-----------+
1 row in set (0.29 sec)

數值比較有如下規則:
(1)若有一個或兩個引數為NULL,則比較運算的結果為NULL。
(2)若同一個比較運算中的兩個引數都是字串,則按照則按照字串進行比較。
(3)若兩個引數均為整數,則按照整數進行比較。
(4)若一個字串和數字進行相等判斷,則MySQL可以自動將字串轉換為數字。

2.2安全等於運算子<=>
此操作符與=操作符執行相同的比較,只是多了一個NULL的判斷。
例:使用<=>進行相等的判斷:

mysql> SELECT 1<=>0,'2'<=>2,2<=>2,'0.02'<=>0,'B'<=>'B',(1+3)<=>(2+1),NULL<=>NULL;
+-------+---------+-------+------------+-----------+---------------+-------------+
| 1<=>0 | '2'<=>2 | 2<=>2 | '0.02'<=>0 | 'B'<=>'B' | (1+3)<=>(2+1) | NULL<=>NULL |
+-------+---------+-------+------------+-----------+---------------+-------------+
|     0 |       1 |     1 |          0 |         1 |             0 |           1 |
+-------+---------+-------+------------+-----------+---------------+-------------+
1 row in set (0.10 sec)

2.3不等於運算子<>或!=
這兩個運算子不能判斷NULL,如果不相等返回1,相等返回0。
例:使用<>和!=進行不相等判斷:

mysql> SELECT 'good'<>'god',1<>2,5.5!=5,(1+3)!=(1+2),NULL<>NULL,NULL!=NULL;
+---------------+------+--------+--------------+------------+------------+
| 'good'<>'god' | 1<>2 | 5.5!=5 | (1+3)!=(1+2) | NULL<>NULL | NULL!=NULL |
+---------------+------+--------+--------------+------------+------------+
|             1 |    1 |      1 |            1 |       NULL |       NULL |
+---------------+------+--------+--------------+------------+------------+
1 row in set (0.05 sec)

2.4小於或等於運算子<=

mysql> SELECT 'GOOD'<='GOD',1<=2,4<=4,4<='5',(1+3)<=(2+1),NULL<=NULL;
+---------------+------+------+--------+--------------+------------+
| 'GOOD'<='GOD' | 1<=2 | 4<=4 | 4<='5' | (1+3)<=(2+1) | NULL<=NULL |
+---------------+------+------+--------+--------------+------------+
|             0 |    1 |    1 |      1 |            0 |       NULL |
+---------------+------+------+--------+--------------+------------+
1 row in set (0.16 sec)

2.5小於運算子<

mysql> SELECT 'GOOD'<'GOD',1<2,4<4,4<'5',(1+3)<(2+1),NULL<NULL;
+--------------+-----+-----+-------+-------------+-----------+
| 'GOOD'<'GOD' | 1<2 | 4<4 | 4<'5' | (1+3)<(2+1) | NULL<NULL |
+--------------+-----+-----+-------+-------------+-----------+
|            0 |   1 |   0 |     1 |           0 |      NULL |
+--------------+-----+-----+-------+-------------+-----------+
1 row in set (0.81 sec)

2.6 大於等於運算子>=

mysql> SELECT 1>=0,'2'>=2,2>=2,'0.02'>=0,'B'>='B',(1+3)>=2+2,NULL>=NULL;
+------+--------+------+-----------+----------+------------+------------+
| 1>=0 | '2'>=2 | 2>=2 | '0.02'>=0 | 'B'>='B' | (1+3)>=2+2 | NULL>=NULL |
+------+--------+------+-----------+----------+------------+------------+
|    1 |      1 |    1 |         1 |        1 |          1 |       NULL |
+------+--------+------+-----------+----------+------------+------------+
1 row in set (0.00 sec)

2.7大於符號>

mysql> SELECT 1>0,'2'>2,2>2,'0.02'>0,'B'>'B',(1+3)>2+2,NULL>NULL;
+-----+-------+-----+----------+---------+-----------+-----------+
| 1>0 | '2'>2 | 2>2 | '0.02'>0 | 'B'>'B' | (1+3)>2+2 | NULL>NULL |
+-----+-------+-----+----------+---------+-----------+-----------+
|   1 |     0 |   0 |        1 |       0 |         0 |      NULL |
+-----+-------+-----+----------+---------+-----------+-----------+
1 row in set (0.00 sec)

2.8 IS NULL(SNULL),IS NOT NULL運算子

mysql> SELECT NULL IS NULL,ISNULL(NULL),ISNULL(10),10 IS NOT NULL;
+--------------+--------------+------------+----------------+
| NULL IS NULL | ISNULL(NULL) | ISNULL(10) | 10 IS NOT NULL |
+--------------+--------------+------------+----------------+
|            1 |            1 |          0 |              1 |
+--------------+--------------+------------+----------------+
1 row in set (0.96 sec)

2.9BETWEEN AND 運算子

mysql> SELECT 4 BETWEEN 4 AND 6,4 BETWEEN 2 AND 5,12 BETWEEN 9 AND 10;
+-------------------+-------------------+---------------------+
| 4 BETWEEN 4 AND 6 | 4 BETWEEN 2 AND 5 | 12 BETWEEN 9 AND 10 |
+-------------------+-------------------+---------------------+
|                 1 |                 1 |                   0 |
+-------------------+-------------------+---------------------+
1 row in set (0.03 sec)

mysql> SELECT 'X' BETWEEN 'F' AND 'G','b' BETWEEN 'a' AND 'b';
+-------------------------+-------------------------+
| 'X' BETWEEN 'F' AND 'G' | 'b' BETWEEN 'a' AND 'b' |
+-------------------------+-------------------------+
|                       0 |                       1 |
+-------------------------+-------------------------+
1 row in set (0.00 sec)

2.10 LEAST運算子
返回最小值。

mysql> SELECT LEAST(2,1),least(20.0,3.0,100.5),least('a','b','c'),least(10,null),least(2,2.0);
+------------+-----------------------+--------------------+----------------+--------------+
| LEAST(2,1) | least(20.0,3.0,100.5) | least('a','b','c') | least(10,null) | least(2,2.0) |
+------------+-----------------------+--------------------+----------------+--------------+
|          1 |                   3.0 | a                  |           NULL |          2.0 |
+------------+-----------------------+--------------------+----------------+--------------+
1 row in set (0.25 sec)

mysql> select least(2.00,2.0),least(3.0,2);
+-----------------+--------------+
| least(2.00,2.0) | least(3.0,2) |
+-----------------+--------------+
|            2.00 |          2.0 |
+-----------------+--------------+
1 row in set (0.00 sec)

2.11 GREATEST(value 1,value 2)

mysql> SELECT GREATEST(2,1),GREATEST(20.0,3.0),GREATEST('A','B','C'),GREATEST(10,NULL);
+---------------+--------------------+-----------------------+-------------------+
| GREATEST(2,1) | GREATEST(20.0,3.0) | GREATEST('A','B','C') | GREATEST(10,NULL) |
+---------------+--------------------+-----------------------+-------------------+
|             2 |               20.0 | C                     |              NULL |
+---------------+--------------------+-----------------------+-------------------+
1 row in set (0.02 sec)

2.12 IN、NOT IN運算子

mysql> SELECT 2 IN (1,3,5,'THKS'),'THKS' IN (1,3,5,'THKS');
+---------------------+--------------------------+
| 2 IN (1,3,5,'THKS') | 'THKS' IN (1,3,5,'THKS') |
+---------------------+--------------------------+
|                   0 |                        1 |
+---------------------+--------------------------+
1 row in set, 2 warnings (0.04 sec)

在左側表示式為NULL的情況下,或表中找不到匹配項並且表中一個表示式為NULL的情況下,IN的返回值均為NULL。

2.13 LIKE)(模糊查詢)
LIKE運算子用來匹配字元,可以使用下面兩種萬用字元:
(1)‘%’,匹配任何數目的字元,甚至包括零字元。
(2)‘_’,只能匹配一個字元。
例:使用運算子LIKE進行字串匹配運算,SQL語句如下:

mysql> SELECT 'stud' LIKE 'stud','stud' LIKE 'stu_','stud' LIKE '%d','stud' LIKE 't___','s' LIKE null;
+--------------------+--------------------+------------------+--------------------+---------------+
| 'stud' LIKE 'stud' | 'stud' LIKE 'stu_' | 'stud' LIKE '%d' | 'stud' LIKE 't___' | 's' LIKE null |
+--------------------+--------------------+------------------+--------------------+---------------+
|                  1 |                  1 |                1 |                  0 |          NULL |
+--------------------+--------------------+------------------+--------------------+---------------+
1 row in set (0.12 sec)

當使用使用資料表做統計或者管理時常用到類似如下語句:

SELECT name FROM WHERE name LIKE '%小%';
SELECT name FROM WHERE phone LIKE '139_ _ _ _ _ _ 89';

這總做法可加快我們匹配到所需的事物。

2.14 REGEXP(正則表示式)
REGEXP用來匹配字串,REGEXP運算子在進行匹配時,常用的有下面幾種萬用字元:
(1)‘^’ 匹配以 ^後面的字元開頭的字串。 ^a:以a開頭
(2)‘$ ’ 匹配以 $ 後面的字元結尾的字串。 a$:以a結尾
(3)‘.’ 匹配任何一個單字元。 .+字串,以.後面的字串結尾
(4)‘[…]’匹配在方括號內的任何字元。 [abc]匹配a、b或c。為了命名字元的 範圍,使用‘-’。“[a-z]”匹配任何字母,“[1-9]”匹配任何數字。
(5)‘ *’匹配零個或多個在它前面的字元。 “x * ”匹配任何數量的‘x’字元,“. *”匹配任何數量的任何字元。
例:使用REGEXP進行字串匹配運算,SQL語句如下:

mysql> SELECT 'sssky' REGEXP '^s','ssky' REGEXP 'y$','ssky' REGEXP '.sky','ssky' REGEXP '[ab]';
+---------------------+--------------------+----------------------+----------------------+
| 'sssky' REGEXP '^s' | 'ssky' REGEXP 'y$' | 'ssky' REGEXP '.sky' | 'ssky' REGEXP '[ab]' |
+---------------------+--------------------+----------------------+----------------------+
|                   1 |                  1 |                    1 |                    0 |
+---------------------+--------------------+----------------------+----------------------+
1 row in set (0.81 sec)

3.邏輯運算子
在SQL中,邏輯運算子的求值所得結果均為TRUE(1)、FALSE(0)或NULL。
3.1 NOT 或者!(邏輯非)
當運算元為0時,得1;運算元非0時,得0;運算元為NULL時,返回NULL。
例:分別使用非運算子“NOT”和“!”進行邏輯判斷,SQL語句如下:

mysql> SELECT NOT 10,NOT (1-1),NOT NULL,NOT 1+1;
+--------+-----------+----------+---------+
| NOT 10 | NOT (1-1) | NOT NULL | NOT 1+1 |
+--------+-----------+----------+---------+
|      0 |         1 |     NULL |       0 |
+--------+-----------+----------+---------+
1 row in set (0.03 sec)

mysql> SELECT ! 10,! (1-1),! -5,!NULL,! 1+1;
+------+---------+------+-------+-------+
| ! 10 | ! (1-1) | ! -5 | !NULL | ! 1+1 |
+------+---------+------+-------+-------+
|    0 |       1 |    0 |  NULL |     1 |
+------+---------+------+-------+-------+
1 row in set (0.11 sec)

! 1+1之所以為1是因為!的優先順序高於+,因此計算步驟為(!1)+1=0+1=1。

3.2 AND 或者 &&(邏輯與運算子)
邏輯與運算子表示當所有運算元均為非零值、並且不為NULL時,結果為1。
例:分別使用“AND”和“&&”進行邏輯判斷,SQL語句如下:

mysql> SELECT 1 AND -1,1 AND 0, 1 AND NULL, 0 AND NULL;
+----------+---------+------------+------------+
| 1 AND -1 | 1 AND 0 | 1 AND NULL | 0 AND NULL |
+----------+---------+------------+------------+
|        1 |       0 |       NULL |          0 |
+----------+---------+------------+------------+
1 row in set (0.02 sec)

注意:當一個或多個運算元為0時,返回0!

mysql> SELECT 1&&-1,1 && 0 ,1&&NULL,0 AND NULL;
+-------+--------+---------+------------+
| 1&&-1 | 1 && 0 | 1&&NULL | 0 AND NULL |
+-------+--------+---------+------------+
|     1 |      0 |    NULL |          0 |
+-------+--------+---------+------------+
1 row in set (0.00 sec)

提示:AND 兩邊一定要用空格隔開,&&不需要空格,但是可以使用。

3.3 OR 或者 ||(邏輯或運算子)
表示當兩個運算元均為非NULL值,且任意一個運算元非0時,結果為1,否則結果為0;當一個為NULL,另一個非零時,結果為1,否則結果為NULL;當兩個運算元均為NULL時,所得結果為NULL。
例:分別使用運算子“OR”和“||”進行邏輯判斷, SQL語句如下:

mysql> SELECT 1 OR -1,1 OR 2,1 OR NULL,0 OR NULL,NULL OR NULL;
+---------+--------+-----------+-----------+--------------+
| 1 OR -1 | 1 OR 2 | 1 OR NULL | 0 OR NULL | NULL OR NULL |
+---------+--------+-----------+-----------+--------------+
|       1 |      1 |         1 |      NULL |         NULL |
+---------+--------+-----------+-----------+--------------+
1 row in set (0.01 sec)

mysql> SELECT 1 || -1,1 || 2,1 || NULL,0 || NULL,NULL || NULL;
+---------+--------+-----------+-----------+--------------+
| 1 || -1 | 1 || 2 | 1 || NULL | 0 || NULL | NULL || NULL |
+---------+--------+-----------+-----------+--------------+
|       1 |      1 |         1 |      NULL |         NULL |
+---------+--------+-----------+-----------+--------------+
1 row in set (0.00 sec)

練習:

mysql> SELECT TRUE AND (NOT (FALSE OR (NULL AND FALSE)));
+--------------------------------------------+
| TRUE AND (NOT (FALSE OR (NULL AND FALSE))) |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.02 sec)

這裡原理是這樣的min{ 1 , (1 - max {0 , min {1/2 , 0 } } ) }

3.4 XOR(邏輯異或運算子)
當任意一個運算元為NULL時,返回值為NULL;對於非NULL的運算元,如果兩個運算元都是非零或者都是零,則返回0;如果一個為零,另一個非零,返回結果為1。
例:使用異或運算子“XOR”進行邏輯判斷,SQL語句如下:

mysql> SELECT  1 XOR 1,0 XOR 0, 1 XOR 0, 1 XOR NULL,0 XOR NULL,1 XOR 1 XOR 1;
+---------+---------+---------+------------+------------+---------------+
| 1 XOR 1 | 0 XOR 0 | 1 XOR 0 | 1 XOR NULL | 0 XOR NULL | 1 XOR 1 XOR 1 |
+---------+---------+---------+------------+------------+---------------+
|       0 |       0 |       1 |       NULL |       NULL |             1 |
+---------+---------+---------+------------+------------+---------------+
1 row in set (0.10 sec)

提示:a XOR b =(a AND (NOT b))=((NOT a)AND b)
例項:

mysql> SELECT 1 XOR 3,(1 AND (NOT 3)),((NOT 1) AND 3);
+---------+-----------------+-----------------+
| 1 XOR 3 | (1 AND (NOT 3)) | ((NOT 1) AND 3) |
+---------+-----------------+-----------------+
|       0 |               0 |               0 |
+---------+-----------------+-----------------+
1 row in set (0.00 sec)

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

4.1 位或運算子 |

位或運算子的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯或運算。對應的二進位制位有一個或兩個為1則該位的運算結果為1,否則為0。
例:使用位或運算子進行運算,SQL語句如下:

mysql> SELECT 10|15,9|4|2;
+-------+-------+
| 10|15 | 9|4|2 |
+-------+-------+
|    15 |    15 |
+-------+-------+
1 row in set (0.10 sec)

10的二進位制值:1010
15的二進位制值:1111
9的二進位制值:1001
4的二進位制值:0100
2的二進位制值:0010
按位或運算後均為1111。即15,其結果為一個64位無符號整數。

4.2 位與運算子 &
對應的二進位制位都為1,則該位的運算結果為1,其餘為0。
例:使用位與運算子進行運算:

mysql> SELECT 10 & 15,9&4&2;
+---------+-------+
| 10 & 15 | 9&4&2 |
+---------+-------+
|      10 |     0 |
+---------+-------+
1 row in set (0.00 sec)

4.3 位異或運算子 ^
對應位的二進位制不同結果為1,相同為0。
例:使用位異或運算子進行運算:

mysql> SELECT 10^15,9^4^2,1^0,1^1;
+-------+-------+-----+-----+
| 10^15 | 9^4^2 | 1^0 | 1^1 |
+-------+-------+-----+-----+
|     5 |    15 |   1 |   0 |
+-------+-------+-----+-----+
1 row in set (0.11 sec)

4.4 位左移運算子 <<
使指定的二進位制值的所有位都左移指定的位數。左移指定位數之後,左邊高位的數值將被移出並丟棄,右邊低位空出的位置補零。
例:使用位左移運算子進行運算,SQL語句如下:

mysql> SELECT 1<<2,4<<2;
+------+------+
| 1<<2 | 4<<2 |
+------+------+
|    4 |   16 |
+------+------+
1 row in set (0.00 sec)

1的二進位制值:0000 0001 左移兩位後變成0000 0100,即十進位制整數4;
十進位制4左移兩位後變成0001 0000,即變成十進位制整數16。

4.5 位右移運算子 >>
與位左移運算子類似。右移指定位數之後,右邊低位的數值將被移出並丟棄,左邊高位空出來的位置用0補齊。

例:使用位右移運算子進行運算:

mysql> SELECT 1>>1,16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
|    0 |     4 |
+------+-------+
1 row in set (0.00 sec)

4.6 位取反運算子 ~
按對應的二進位制數逐位反轉,1->0,0->1。
例:使用位取反運算子進行運算:

mysql> SELECT 5&~1;
+------+
| 5&~1 |
+------+
|    4 |
+------+
1 row in set (0.00 sec)

1:0001
~1:1110
5:0101
0101&1110=0100->4

可以使用BIN()檢視取反之後的結果:

mysql> SELECT BIN(~1);
+------------------------------------------------------------------+
| BIN(~1)                                                          |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111110 |
+------------------------------------------------------------------+
1 row in set (0.10 sec)

mysql> SELECT BIN(~5);
+------------------------------------------------------------------+
| BIN(~5)                                                          |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111010 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

5.運算子的優先順序
這裡不作說明。