運算符 1.算術運算符 算術運算符主要用於數學運算,其可以連接運算符前後的兩個數值或表達式,對數值或表達式進行 +,-,*,/,%運算。 1.1 加法和減法運算符 mysql> SELECT 100,100 + 0,100 - 0,100 + 50,100 + 50 - 30,100 + 35.5, ...
運算符
1.算術運算符
算術運算符主要用於數學運算,其可以連接運算符前後的兩個數值或表達式,對數值或表達式進行 +,-,*,/,%運算。
1.1 加法和減法運算符
mysql> SELECT 100,100 + 0,100 - 0,100 + 50,100 + 50 - 30,100 + 35.5,100 - 35.5
-> FROM dual;
+-----+---------+---------+----------+---------------+------------+------------+
| 100 | 100 + 0 | 100 - 0 | 100 + 50 | 100 + 50 - 30 | 100 + 35.5 | 100 - 35.5 |
+-----+---------+---------+----------+---------------+------------+------------+
| 100 | 100 | 100 | 150 | 120 | 135.5 | 64.5 |
+-----+---------+---------+----------+---------------+------------+------------+
1 row in set (0.00 sec)
由運算結果可以得到以下結論
- 一個整數類型的值對整數進行加法和減法操作,結果還是一個整數。
- 一個整數類型的值對浮點數進行加法和減法操作,結果是一個浮點數。
- 加法和減法的優先順序相同,進行先加後減操作和先減後增操作結果一致。
- 在Java中,+的左右如果有字元串,那麼表示字元串的拼接。但是在MySQL中+只表示數值相加。如果遇到非數值類型,先嘗試轉成數值,如果失敗,就按0計算。(MySQL中字元串拼接,需要使用到字元串函數CONCAT()實現)。
1.2 乘法和除法運算符
mysql> SELECT 100,100 * 1,100 * 1.0, 100/1.0,100 / 2,100 + 2 * 5 / 2, 100 / 3,100 DIV 0
-> FROM dual;
+-----+---------+-----------+----------+---------+-----------------+---------+-----------+
| 100 | 100 * 1 | 100 * 1.0 | 100/1.0 | 100 / 2 | 100 + 2 * 5 / 2 | 100 / 3 | 100 DIV 0 |
+-----+---------+-----------+----------+---------+-----------------+---------+-----------+
| 100 | 100 | 100.0 | 100.0000 | 50.0000 | 105.0000 | 33.3333 | NULL |
+-----+---------+-----------+----------+---------+-----------------+---------+-----------+
1 row in set (0.00 sec)
#計算員工的年基本工資
SELECT employee_id,salary,salary * 12 annual_sal
FROM employees;
由運算結果可以得到如下結論
- 一個數乘以整數1和除以整數1後仍得原數;
- 一個乘以浮點數1和除以浮點數1後變成浮點數,數值與原數相等;
- 一個數除以整數後,不管是否能除盡,結果都為一個浮點數;
- 一個數除以另一個數,除不盡時,結果為一個浮點數,並保留到小數點後4位;
- 乘法和除法的優先順序相同,進行先乘後除的操作和先除後乘操作,得到的結果相同;
- 在數學運算中,0不能用作除數,在MySQL中,一個數除以0得到NULL;
1.3 求模(求餘)運算符
mysql> SELECT 12 % 3,12 MOD 5 FROM dual;
+--------+----------+
| 12 % 3 | 12 MOD 5 |
+--------+----------+
| 0 | 2 |
+--------+----------+
1 row in set (0.00 sec)
#篩選除employee_id是偶數的員工
SELECT * FROM employees
FROM employee_id MOD 2 = 0;
註意,a % b的公式是 a % b = a - (a / b) * b。用於負數的餘數計算。
2.比較運算符
比較運算符用來對錶達式左邊的操作數和右邊的操作數進行比較,比較的結果為真則返回1,結果為假則返回0,其他情況則返回NULL。
比較運算符經常被用來作為SELECT查詢語句的條件來使用,返回符合條件的結果記錄。
2.1等號運算符(=)
- (=)判斷等號兩邊的值,字元串或表達式是否相等,如果相等則返回1,不相等則返回0。
- 在使用等號運算符時,遵循以下規則:
- 如果等號兩邊都為字元串,則MySQL會按照字元串進行比較,其比較的是每個字元串中字元的ANSI編碼是否相等。
- 如果等號兩邊都為整數,則MySQL會按照整數來比較兩個值的大小。
- 如果等號兩邊的值一個是整數,另一個是字元串,則MySQL會將字元串轉化為數字進行比較。
- 如果等號兩邊的值,字元串或表達式中有一個為NULL,則比較結果為NULL。
- 對比,SQL中賦值符號為:=。
mysql> SELECT 1 = 1, 1 = '1', 1 = 0, 'a' = 'a', (5 + 3) = (2 + 6), '' = NULL,NULL = NULL;
+-------+---------+-------+-----------+-------------------+-----------+-------------+
| 1 = 1 | 1 = '1' | 1 = 0 | 'a' = 'a' | (5 + 3) = (2 + 6) | '' = NULL | NULL = NULL |
+-------+---------+-------+-----------+-------------------+-----------+-------------+
| 1 | 1 | 0 | 1 | 1 | NULL | NULL |
+-------+---------+-------+-----------+-------------------+-----------+-------------+
1 row in set (0.00 sec)
mysql> SELECT 1 = 2, 1 = 'abc', 0 = 'abc', 3 = 'abc';
+-------+-----------+-----------+-----------+
| 1 = 2 | 1 = 'abc' | 0 = 'abc' | 3 = 'abc' |
+-------+-----------+-----------+-----------+
| 0 | 0 | 1 | 0 |
+-------+-----------+-----------+-----------+
1 row in set, 3 warnings (0.00 sec)
#從結果可以看出當=左右兩邊一個是數字一個字元串則,會嘗試將字元串轉成數字,轉換失敗就賦值為0
MySQL中 驗證是否相等是一個'=',Java中是 '=='。
2.2 安全等於運算符(<=>)
(<=>)與等於運算符的作用是相似的,唯一的區別
是'<=>'可以用來對NULL進行判斷。在兩個操作數均為NULL時,其返回值是1,而不是NULL,當一個操作數為NULL時,其返回值是0,而不為NULL。
mysql> SELECT 1 <=> '1', 1 <=> 0,'a' <=> 'a',(5 + 3) <=> (2 + 6),'' <=> NULL,NULL <=> NULL FROM dual;
+-----------+---------+-------------+---------------------+-------------+---------------+
| 1 <=> '1' | 1 <=> 0 | 'a' <=> 'a' | (5 + 3) <=> (2 + 6) | '' <=> NULL | NULL <=> NULL |
+-----------+---------+-------------+---------------------+-------------+---------------+
| 1 | 0 | 1 | 1 | 0 | 1 |
+-----------+---------+-------------+---------------------+-------------+---------------+
1 row in set (0.00 sec)
#查詢commission_pct等於0.40
SELECT employee_id,commission_pct FROM employees WHERE commission_pct = 0.40;
SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> 0.40;
2.3 不等於運算符(<>和!=)
不等於運算符(<>和!=)用於判斷兩邊的數字,字元串或表達式的值是否不相等,如果不相等則返回1,相等返回0。不等於運算符不能判斷NULL值。如果兩邊的值有任意一個為NULL,或兩邊都為NULL,則結果為NULL。SQL語句示例如下:
mysql> SELECT 1 <> 1,1 != 2, 'a' != 'b',(3+4) <> (2+6),'a' != NULL,NULL <> NULL FROM dual;
+--------+--------+------------+----------------+-------------+--------------+
| 1 <> 1 | 1 != 2 | 'a' != 'b' | (3+4) <> (2+6) | 'a' != NULL | NULL <> NULL |
+--------+--------+------------+----------------+-------------+--------------+
| 0 | 1 | 1 | 1 | NULL | NULL |
+--------+--------+------------+----------------+-------------+--------------+
1 row in set (0.00 sec)
2.4 空運算符(IS NULL或ISNULL)
空運算符(IS NULL或ISNULL),判斷一個值是否為NULL,如果為NULL則返回1,否則返回0。SQL語句示例如下:
mysql> SELECT NULL IS NULL,ISNULL(NULL),ISNULL('c'), 1 IS NULL FROM dual;
+--------------+--------------+-------------+-----------+
| NULL IS NULL | ISNULL(NULL) | ISNULL('c') | 1 IS NULL |
+--------------+--------------+-------------+-----------+
| 1 | 1 | 0 | 0 |
+--------------+--------------+-------------+-----------+
1 row in set (0.00 sec)
#查詢commission_pct等於NULL。比較如下的四種寫法。
SELECT employee_id,commission_pct FROM employees WHERE ISNULL(commission_pct);
SELECT employee_id,commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> NULL;
#該條語句錯誤 判斷一個值是否是NULL不能使用等號運算符
SELECT employee_id,commission_pct FROM employees WHERE commission_pct = NULL;
2.5 非空運算符(IS NOT NULL)
非空運算符(IS NOT NULL) 判斷一個值是否不為NULL,如果不為NULL返回1,否則返回0。SQL語句示例如下:
mysql> SELECT NULL IS NOT NULL, 'a' IS NOT NULL, 1 IS NOT NULL FROM dual;
+------------------+-----------------+---------------+
| NULL IS NOT NULL | 'a' IS NOT NULL | 1 IS NOT NULL |
+------------------+-----------------+---------------+
| 0 | 1 | 1 |
+------------------+-----------------+---------------+
1 row in set (0.00 sec)
#查詢commission_pct不等於NULL。
SELECT employee_id,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
SELECT employee_id,commission_pct FROM employees WHERE NOT commission_pct <=> NULL;
SELECT employee_id,commission_pct FROM employees WHERE NOT ISNULL(commission_pct);
2.6 最小值運算符
least adj.小的 adv.最小
語法格式為:LEAST(值1,值2,....,值n)。其中,"值n"表示參數列表中有n個值。在有兩個或多個參數的情況下,返回最小值。
mysql> SELECT LEAST(1,0.0,2),LEAST('a','f','e'),LEAST(1,NULL,2) FROM dual;
+----------------+--------------------+-----------------+
| LEAST(1,0.0,2) | LEAST('a','f','e') | LEAST(1,NULL,2) |
+----------------+--------------------+-----------------+
| 0.0 | a | NULL |
+----------------+--------------------+-----------------+
1 row in set (0.00 sec)
從結果得到,當參數是整數或浮點數時,LEAST返回其中最小的值,當參數為字元串時,返回字母表中順序最靠前的字元,當比較值列表有NULL時,不能判斷大小,返回值為NULL。
2.7 最大值運算符
greatest adj.大的,極大的;adv.很好地
語法格式為:GREATEST(值1,值2,...值n)。其中,n表示參數列表中有n個值。當有兩個或多個參數時,返回最大值。但如果值中有NULL,則返回NULL。
mysql> SELECT GREATEST(1,0,2),GREATEST('e','f','a'),GREATEST(1,NULL,2) FROM dual;
+-----------------+-----------------------+--------------------+
| GREATEST(1,0,2) | GREATEST('e','f','a') | GREATEST(1,NULL,2) |
+-----------------+-----------------------+--------------------+
| 2 | f | NULL |
+-----------------+-----------------------+--------------------+
1 row in set (0.00 sec)
從結果得到,當參數是整數或浮點數時,GREATEST返回其中最大的值,當參數為字元串時,返回字母表中順序最靠後的字元,當比較值列表有NULL時,不能判斷大小,返回值為NULL。
2.8 BETWEEN AND運算符
BETWEEN運算符使用的格式通常為SELECT D FROM TABLE WHERE C BETWEEN A AND B,此時,當 A =< C <= B時,結果為1,否則為0;
mysql> SELECT 1 BETWEEN 0 AND 1,10 BETWEEN 11 AND 12,'b' BETWEEN 'a' AND 'c' FROM dual;
+-------------------+----------------------+-------------------------+
| 1 BETWEEN 0 AND 1 | 10 BETWEEN 11 AND 12 | 'b' BETWEEN 'a' AND 'c' |
+-------------------+----------------------+-------------------------+
| 1 | 0 | 1 |
+-------------------+----------------------+-------------------------+
1 row in set (0.00 sec)
SELECT last_name,salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;
2.9 IN運算符
IN運算符用於判斷給定的值是否是IN列表中的一個值,如果是則返回1,否則返回0。如果給定的值為NULL,或者IN列表中存在NULL,則結果為NULL。
mysql> SELECT 'a' IN('a','b','c'),1 IN(2,3),NULL IN('a','b'),'a' IN ('a',NULL) FROM dual;
+---------------------+-----------+------------------+-------------------+
| 'a' IN('a','b','c') | 1 IN(2,3) | NULL IN('a','b') | 'a' IN ('a',NULL) |
+---------------------+-----------+------------------+-------------------+
| 1 | 0 | NULL | 1 |
+---------------------+-----------+------------------+-------------------+
1 row in set (0.00 sec)
SELECT employee_id,last_name,salary,manager_id
FROM employees
WHERE manager_id IN(100,101,201);
2.10 NOT IN運算符
IN運算符相反值
2.11 LIKE運算符
LIKE運算符主要用來匹配字元串,常用於模糊匹配,如果滿足條件則返回1,否則返回0。如果給定的值或者匹配條件為NULL,則返回結果為NULL。
LIKE運算符通常使用如下通配符:
"%":匹配0或多個字元
"_":只能匹配一個字元
mysql> SELECT NULL LIKE 'abc','abc' LIKE NULL FROM dual;
+-----------------+-----------------+
| NULL LIKE 'abc' | 'abc' LIKE NULL |
+-----------------+-----------------+
| NULL | NULL |
+-----------------+-----------------+
1 row in set (0.00 sec)
SELECT first_name
FROM employees
WHERE first_name LIKE 'S%';
SELECT first_name
FROM employees
WHERE first_name LIKE '_o%';
ESCAPE
- 匹配特殊符號的:使用轉義符。例如將[%]轉為[$%]、[]轉為[$],然後再加上[ESCAPE '$']即可。
SELECT job_id
FROM jobs
WHERE job_id LIKE "IT\_%";
- 如果使用\表示轉義,必須省略ESCAPE。如果不是\,需要加上ESCAPE。
SELECT job_id
FROM jobs
WHERE job_id LIKE "IT$_%" ESCAPE '$';
不省略ESCAPE '\'無法執行。
2.12 REGEXP運算符
REGEXP運算符用來匹配字元串,語法格式為:expr REGEXP 匹配條件。如果expr滿足匹配條件,返回1,不滿足,返回0。
若expr或匹配條件任意一個為NULl,結果為NULL。
REGEXP運算符再匹配時,常用的通配符。
mysql> SELECT 'shkstart' REGEXP '^s','shkstart' REGEXP 't$','shkstart' REGEXP 'hk'
-> FROM dual;
+------------------------+------------------------+------------------------+
| 'shkstart' REGEXP '^s' | 'shkstart' REGEXP 't$' | 'shkstart' REGEXP 'hk' |
+------------------------+------------------------+------------------------+
| 1 | 1 | 1 |
+------------------------+------------------------+------------------------+
1 row in set (0.00 sec)
mysql> SELECT 'wind' REGEXP 'w..d','wind' REGEXP '[w]';
+----------------------+---------------------+
| 'wind' REGEXP 'w..d' | 'wind' REGEXP '[w]' |
+----------------------+---------------------+
| 1 | 1 |
+----------------------+---------------------+
1 row in set (0.00 sec)
3.邏輯運算符
邏輯運算符主要用來判斷表達式的真假,在MySQL中,邏輯運算符的返回結果為1,0,NULL。
MySQL中支持的4種邏輯運算符如下
3.1 邏輯非運算符(NOT,!)
邏輯運算符(NOT或!),表示當給定的值為0時返回1,給定的值為非0值時返回0,給定的值為NULL時,返回NULL。
mysql> SELECT NOT 1,NOT 0,NOT (1 + 1),NOT !1,NOT NULL;
+-------+-------+-------------+--------+----------+
| NOT 1 | NOT 0 | NOT (1 + 1) | NOT !1 | NOT NULL |
+-------+-------+-------------+--------+----------+
| 0 | 1 | 0 | 1 | NULL |
+-------+-------+-------------+--------+----------+
1 row in set, 1 warning (0.00 sec)
SELECT last_name,job_id
FROM employees
WHERE job_id NOT IN('IT_PROG','ST_CLERK');
3.2 邏輯與運算符(AND,&&)
邏輯與(AND或&&)運算符是當給定的所有值均為非0值,並且都不為NULL時,返回1;給定的一個值或者多個值為0則返回0,否則返回NULL。SQL Server中只支持AND,不能用&&。
mysql> SELECT 1 AND -1,0 AND 1,0 AND NULL,1 AND NULL FROM dual;
+----------+---------+------------+------------+
| 1 AND -1 | 0 AND 1 | 0 AND NULL | 1 AND NULL |
+----------+---------+------------+------------+
| 1 | 0 | 0 | NULL |
+----------+---------+------------+------------+
1 row in set (0.00 sec)
mysql> SELECT employee_id,last_name,job_id,salary
-> FROM employees
-> WHERE salary >= 10000
-> AND job_id LIKE '%MAN%';
3.3 邏輯或運算符(OR,||)
邏輯或(OR或||)運算符是當給定的值都不為NULL,並且任何一個值為非0值時,則返回1,否則返回0,當一個值為NULL,並且另一個值為非0值時,返回1,否則返回NULL,當兩個值都為NULL時,返回NULL。SQL Server中只支持OR,不能用||
mysql> SELECT 1 OR -1,1 OR 0,1 OR NULL, 0 || NULL,NULL || NULL FROM dual;
+---------+--------+-----------+-----------+--------------+
| 1 OR -1 | 1 OR 0 | 1 OR NULL | 0 || NULL | NULL || NULL |
+---------+--------+-----------+-----------+--------------+
| 1 | 1 | 1 | NULL | NULL |
+---------+--------+-----------+-----------+--------------+
1 row in set, 2 warnings (0.00 sec)
#查詢基本薪資不在9000 - 12000之間的
mysql> SELECT employee_id,salary FROM employees
-> WHERE NOT(salary >= 9000 AND salary <= 12000);
註意,OR可以和AND一起使用,但是在使用時要註意兩者的優先順序,由於AND的優先順序高於OR,因此先對AND的操作數進行操作,再與OR的操作數計算。
3.4 邏輯異或運算符(XOR)
邏輯異或(XOR)運算符是當給定的值中任意一個值為NULL時,則返回NULL;如果兩個非NULL的值都是0或者都不等於0時,返回0;如果一個值為0,另一個值不為0時,則返回1;
mysql> SELECT 1 XOR -1,1 XOR 0,0 XOR 0,1 XOR NULL,1 XOR 1 XOR 1,0 XOR 0 XOR 0 FROM dual;
+----------+---------+---------+------------+---------------+---------------+
| 1 XOR -1 | 1 XOR 0 | 0 XOR 0 | 1 XOR NULL | 1 XOR 1 XOR 1 | 0 XOR 0 XOR 0 |
+----------+---------+---------+------------+---------------+---------------+
| 0 | 1 | 0 | NULL | 1 | 0 |
+----------+---------+---------+------------+---------------+---------------+
1 row in set (0.00 sec)
4.位運算符
位運算是在二進位數上進行計算的運算符。位運算符會先將操作數轉成二進位數,然後進行位運算,最後再將結果從二進位轉會十進位數。
MySQL支持的位運算符如下:
4.1 按位與運算符(&)
按位與(&)運算符將給定對應的二進位數逐位進行邏輯與運算。當給定的對應的二進位位的數值都為1時,則該位返回1,否則返回0。
mysql> SELECT 1 & 10,20 & 30 FROM dual;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
| 0 | 20 |
+--------+---------+
1 row in set (0.00 sec)
假定是int類型32位 前24位是0,只寫後8位。1的二進位數,00000001,10的二進位數,00001010,20的二進位數,00010100,30的二進位數,00011110。所以 1 & 10的結果是00000000,十進位結果為0,20 & 30的結果是00010100,十進位結果是20。
4.2 按位或運算符(|)
按位與(|)運算符將給定對應的二進位數逐位進行邏輯或運算。當給定的對應的二進位位的數值有一個或都為1時,則該位返回1,否則返回0。
mysql> SELECT 1 | 10,20 | 30;
+--------+---------+
| 1 | 10 | 20 | 30 |
+--------+---------+
| 11 | 30 |
+--------+---------+
1 row in set (0.00 sec)
假定是int類型32位 前24位是0,只寫後8位。1的二進位數,00000001,10的二進位數,00001010,20的二進位數,00010100,30的二進位數,00011110。所以 1 | 10的結果是00001011,十進位結果為11,20 | 30的結果是00011110,十進位結果是30。
4.3 按位異或運算符(^)
按位異或(^)運算符將給定對應的二進位數逐位進行邏輯異或運算。當給定的對應的二進位位的數值不同時,則該位返回1,否則返回0。
mysql> SELECT 1 ^ 10,20 ^ 30 FROM dual;
+--------+---------+
| 1 ^ 10 | 20 ^ 30 |
+--------+---------+
| 11 | 10 |
+--------+---------+
1 row in set (0.00 sec)
假定是int類型32位 前24位是0,只寫後8位。1的二進位數,00000001,10的二進位數,00001010,20的二進位數,00010100,30的二進位數,00011110。所以 1 ^ 10的結果是00001011,十進位結果為11,20 | 30的結果是00001010,十進位結果是10。
4.4 按位取反運算符(~)
按位取反(~
)運算符將給定對應的二進位數逐位進行邏輯取反運算。~1 -> 0,~0 -> 1。
mysql> SELECT 20 & ~1 FROM dual;
+---------+
| 20 & ~1 |
+---------+
| 20 |
+---------+
1 row in set (0.00 sec)
取反運算符(~)的優先順序高於按位與(&)運算符的優先順序所以 10 & ~1。首先,對數字1進行按位取反運算 1的二進位 前24位是0,後8位00000001,取反操作,01111111,11111111,11111111,11111110,這是1的取反的二進位結果,20的二級制00000000,00000000,00000000,00010100,再進行與運算,結果是00000000,00000000,00000000,00010100 十進位是20。
4.5 按位右移運算符(>>)
按位右移(>>)運算符,將給定的值的二進位數的所有位右移指定的位數。右移指定的位數後,右邊低位的數值移出丟棄,左邊高位空出的位置補0。
mysql> SELECT 1 >> 2,4 >> 1;
+--------+--------+
| 1 >> 2 | 4 >> 1 |
+--------+--------+
| 0 | 2 |
+--------+--------+
1 row in set (0.00 sec)
1的二進位數,只寫後8位,0000 0001,右移2位 0000 0000,十進位是0。4的二進位是 0000 0100,右移1位為 0000 0010,對應的十進位數位2。
4.6 按位左移運算符(<<)
按位左移(<<)運算符,將給定的值的二進位數的所有位左移指定的位數。左移指定的位數後,左邊高位的數值移出丟棄,右邊低位空出的位置補0
mysql> SELECT 1 << 2,4 << 1;
+--------+--------+
| 1 << 2 | 4 << 1 |
+--------+--------+
| 4 | 8 |
+--------+--------+
1 row in set (0.00 sec)
1的二進位數,只寫後8位,0000 0001,左移2位 0000 0100,十進位是4。4的二進位是 0000 0100,右移1位為 0000 1000,對應的十進位數位8。
區分左右,看符號兩根線匯聚的點的方向。以及左移和右移不改變符號位。也就是對應二進位的首位。
5.運算符的優先順序
數字編號越大,優先順序越高。
6.正則表達式
正則表達式通常被用來檢索和替換,符合某個模式的文本內容,根據指定的匹配模式匹配文本中符合要求的特殊字元串。例如,從一個文本文件中提取電話號碼,查找一篇文章中重覆的單詞或者替換用戶輸入的某些敏感詞語等,這些地方都可以使用正則表達式,正則表達式強大而且靈活,可以應用於非常複雜的查詢。
MySQL中使用REGEXP關鍵字指定正則表達式的字元匹配模式,下表列出了REGEXP操作符中常用字元匹配列表。
只是為了記錄自己的學習歷程,且本人水平有限,不對之處,請指正。