第04章 MySQL運算符詳解


第04章 MySQL運算符詳解


1. 算術運算符

算術運算符主要用於數學運算,其可以連接運算符前后的兩個數值或表達式,對數值或表達式進行加(+)、減(-)、乘(*)、除(/)和取模(%)運算。

image-20211012100749193

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()實現)

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。

3.求模(求余)運算符
將t22表中的字段i對3和5進行求模(求余)運算。

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
WHERE employee_id MOD 2 = 0;

可以看到,100對3求模后的結果為3,對5求模后的結果為0。

2. 比較運算符

比較運算符用來對表達式左邊的操作數和右邊的操作數進行比較,比較的結果為真則返回1,比較的結果為假則返回0,其他情況則返回NULL。

比較運算符經常被用來作為SELECT查詢語句的條件來使用,返回符合條件的結果記錄。

image-20211012101110021

image-20211012104955094

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, 0 = 'abc', 1 = 'abc' FROM dual;
+-------+-----------+-----------+
| 1 = 2 | 0 = 'abc' | 1 = 'abc' |
+-------+-----------+-----------+
|     0 |         1 |         0 |
+-------+-----------+-----------+
1 row in set, 2 warnings (0.00 sec)
#查詢salary=10000,注意在Java中比較是==
SELECT employee_id,salary FROM employees WHERE salary = 10000;

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;

#如果把0.40改成 NULL 呢?

可以看到,使用安全等於運算符時,兩邊的操作數的值都為NULL時,返回的結果為1而不是NULL,其他返回結果與等於運算符相同。

3.不等於運算符
不等於運算符(<>和!=)用於判斷兩邊的數字、字符串或者表達式的值是否不相等,如果不相等則返回1,相等則返回0。不等於運算符不能判斷NULL值。如果兩邊的值有任意一個為NULL,或兩邊都為NULL,則結果為NULL。
SQL語句示例如下:

mysql> SELECT 1 <> 1, 1 != 2, 'a' != 'b', (3+4) <> (2+6), 'a' != NULL, NULL <> NULL; 
+--------+--------+------------+----------------+-------------+--------------+
| 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)

此外,還有非符號類型的運算符:

image-20211012105303219

image-20211012105030527

image-20211012105052456

4. 空運算符
空運算符(IS NULL或者ISNULL)判斷一個值是否為NULL,如果為NULL則返回1,否則返回0。
SQL語句示例如下:

mysql> SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL;
+--------------+--------------+-------------+-----------+
| NULL IS NULL | ISNULL(NULL) | ISNULL('a') | 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 commission_pct IS NULL;
SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> NULL;
SELECT employee_id,commission_pct FROM employees WHERE ISNULL(commission_pct);
SELECT employee_id,commission_pct FROM employees WHERE commission_pct = NULL;
SELECT last_name, manager_id
FROM   employees
WHERE  manager_id IS NULL;

5. 非空運算符
非空運算符(IS NOT NULL)判斷一個值是否不為NULL,如果不為NULL則返回1,否則返回0。
SQL語句示例如下:

mysql> SELECT NULL IS NOT NULL, 'a' IS NOT NULL,  1 IS NOT NULL; 
+------------------+-----------------+---------------+
| NULL IS NOT NULL | 'a' IS NOT NULL | 1 IS NOT NULL |
+------------------+-----------------+---------------+
|                0 |               1 |             1 |
+------------------+-----------------+---------------+
1 row in set (0.01 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);

6. 最小值運算符
語法格式為:LEAST(值1,值2,...,值n)。其中,“值n”表示參數列表中有n個值。在有兩個或多個參數的情況下,返回最小值。

mysql> SELECT LEAST (1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2);
+---------------+--------------------+-----------------+
| LEAST (1,0,2) | LEAST('b','a','c') | LEAST(1,NULL,2) |
+---------------+--------------------+-----------------+
|       0       |        a           |      NULL       |
+---------------+--------------------+-----------------+
1 row in set (0.00 sec)

由結果可以看到,當參數是整數或者浮點數時,LEAST將返回其中最小的值;當參數為字符串時,返回字母表中順序最靠前的字符;當比較值列表中有NULL時,不能判斷大小,返回值為NULL。

7. 最大值運算符
語法格式為:GREATEST(值1,值2,...,值n)。其中,n表示參數列表中有n個值。當有兩個或多個參數時,返回值為最大值。假如任意一個自變量為NULL,則GREATEST()的返回值為NULL。

mysql> SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2);
+-----------------+-----------------------+--------------------+
| GREATEST(1,0,2) | GREATEST('b','a','c') | GREATEST(1,NULL,2) |
+-----------------+-----------------------+--------------------+
|               2 | c                     |               NULL |
+-----------------+-----------------------+--------------------+
1 row in set (0.00 sec)

由結果可以看到,當參數中是整數或者浮點數時,GREATEST將返回其中最大的值;當參數為字符串時,返回字母表中順序最靠后的字符;當比較值列表中有NULL時,不能判斷大小,返回值為NULL。

8. BETWEEN AND運算符
BETWEEN運算符使用的格式通常為SELECT D FROM TABLE WHERE C BETWEEN A AND B,此時,當C大於或等於A,並且C小於或等於B時,結果為1,否則結果為0。

mysql> SELECT 1 BETWEEN 0 AND 1, 10 BETWEEN 11 AND 12, 'b' BETWEEN 'a' AND 'c';
+-------------------+----------------------+-------------------------+
| 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;

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);
+----------------------+------------+-------------------+--------------------+
| '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);

10. NOT IN運算符
NOT IN運算符用於判斷給定的值是否不是IN列表中的一個值,如果不是IN列表中的一個值,則返回1,否則返回0。

mysql> SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3);
+--------------------------+----------------+
| 'a' NOT IN ('a','b','c') | 1 NOT IN (2,3) |
+--------------------------+----------------+
|                 0        |            1   |
+--------------------------+----------------+
1 row in set (0.00 sec)

11. LIKE運算符
LIKE運算符主要用來匹配字符串,通常用於模糊匹配,如果滿足條件則返回1,否則返回0。如果給定的值或者匹配條件為NULL,則返回結果為NULL。

LIKE運算符通常使用如下通配符:

“%”:匹配0個或多個字符。
“_”:只能匹配一個字符。

SQL語句示例如下:

mysql> SELECT NULL LIKE 'abc', 'abc' LIKE NULL;  
+-----------------+-----------------+
| 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 last_name
FROM   employees
WHERE  last_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 ‘$‘;

12. REGEXP運算符

REGEXP運算符用來匹配字符串,語法格式為:expr REGEXP 匹配條件。如果expr滿足匹配條件,返回1;如果不滿足,則返回0。若expr或匹配條件任意一個為NULL,則結果為NULL。

REGEXP運算符在進行匹配時,常用的有下面幾種通配符:

(1)‘^’匹配以該字符后面的字符開頭的字符串。
(2)‘$’匹配以該字符前面的字符結尾的字符串。
(3)‘.’匹配任何一個單字符。
(4)“[...]”匹配在方括號內的任何字符。例如,“[abc]”匹配“a”或“b”或“c”。為了命名字符的范圍,使用一個‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何數字。
(5)‘*’匹配零個或多個在它前面的字符。例如,“x*”匹配任何數量的‘x’字符,“[0-9]*”匹配任何數量的數字,而“*”匹配任何數量的任何字符。

SQL語句示例如下:

mysql> SELECT 'shkstart' REGEXP '^s', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk';
+------------------------+------------------------+-------------------------+
| 'shkstart' REGEXP '^s' | 'shkstart' REGEXP 't$' | 'shkstart' REGEXP 'hk'  |
+------------------------+------------------------+-------------------------+
|                      1 |                      1 |                       1 |
+------------------------+------------------------+-------------------------+
1 row in set (0.01 sec)
mysql> SELECT 'atguigu' REGEXP 'gu.gu', 'atguigu' REGEXP '[ab]';
+--------------------------+-------------------------+
| 'atguigu' REGEXP 'gu.gu' | 'atguigu' REGEXP '[ab]' |
+--------------------------+-------------------------+
|                        1 |                       1 |
+--------------------------+-------------------------+
1 row in set (0.00 sec)

3. 邏輯運算符

邏輯運算符主要用來判斷表達式的真假,在MySQL中,邏輯運算符的返回結果為1、0或者NULL。

MySQL中支持4種邏輯運算符如下:

image-20211012110241418

1.邏輯非運算符
邏輯非(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', 'SA_REP');

2.邏輯與運算符
邏輯與(AND或&&)運算符是當給定的所有值均為非0值,並且都不為NULL時,返回1;當給定的一個值或者多個值為0時則返回0;否則返回NULL。

mysql> SELECT 1 AND -1, 0 AND 1, 0 AND NULL, 1 AND NULL;
+----------+---------+------------+------------+
| 1 AND -1 | 0 AND 1 | 0 AND NULL | 1 AND NULL |
+----------+---------+------------+------------+
|        1 |       0 |          0 |       NULL |
+----------+---------+------------+------------+
1 row in set (0.00 sec)
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >=10000
AND    job_id LIKE '%MAN%';

3.邏輯或運算符
邏輯或(OR或||)運算符是當給定的值都不為NULL,並且任何一個值為非0值時,則返回1,否則返回0;當一個值為NULL,並且另一個值為非0值時,返回1,否則返回NULL;當兩個值都為NULL時,返回NULL。

mysql> SELECT 1 OR -1, 1 OR 0, 1 OR NULL, 0 || NULL, NULL || NULL;     
+---------+--------+-----------+-----------+--------------+
| 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之間的員工編號和基本薪資
SELECT employee_id,salary FROM employees 
WHERE NOT (salary >= 9000 AND salary <= 12000);

SELECT employee_id,salary FROM employees 
WHERE salary <9000 OR salary > 12000;

SELECT employee_id,salary FROM employees 
WHERE salary NOT BETWEEN 9000 AND 12000;
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >= 10000
OR     job_id LIKE '%MAN%';

注意:

OR可以和AND一起使用,但是在使用時要注意兩者的優先級,由於AND的優先級高於OR,因此先對AND兩邊的操作數進行操作,再與OR中的操作數結合。

4.邏輯異或運算符
邏輯異或(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;
+----------+---------+---------+------------+---------------+---------------+
| 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)
select last_name,department_id,salary 
from employees
where department_id in (10,20) XOR salary > 8000;

4. 位運算符

位運算符是在二進制數上進行計算的運算符。位運算符會先將操作數變成二進制數,然后進行位運算,最后將計算結果從二進制變回十進制數。

MySQL支持的位運算符如下:

image-20211012110511223

1.按位與運算符
按位與(&)運算符將給定值對應的二進制數逐位進行邏輯與運算。當給定值對應的二進制位的數值都為1時,則該位返回1,否則返回0。

mysql> SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
|      0 |      20 |
+--------+---------+
1 row in set (0.00 sec)

1的二進制數為0001,10的二進制數為1010,所以1 & 10的結果為0000,對應的十進制數為0。20的二進制數為10100,30的二進制數為11110,所以20 & 30的結果為10100,對應的十進制數為20。

2. 按位或運算符
按位或(|)運算符將給定的值對應的二進制數逐位進行邏輯或運算。當給定值對應的二進制位的數值有一個或兩個為1時,則該位返回1,否則返回0。

mysql> SELECT 1 | 10, 20 | 30; 
+--------+---------+
| 1 | 10 | 20 | 30 |
+--------+---------+
|     11 |      30 |
+--------+---------+
1 row in set (0.00 sec)

1的二進制數為0001,10的二進制數為1010,所以1 | 10的結果為1011,對應的十進制數為11。20的二進制數為10100,30的二進制數為11110,所以20 | 30的結果為11110,對應的十進制數為30。

3. 按位異或運算符
按位異或(^)運算符將給定的值對應的二進制數逐位進行邏輯異或運算。當給定值對應的二進制位的數值不同時,則該位返回1,否則返回0。

mysql> SELECT 1 ^ 10, 20 ^ 30; 
+--------+---------+
| 1 ^ 10 | 20 ^ 30 |
+--------+---------+
|     11 |      10 |
+--------+---------+
1 row in set (0.00 sec)

1的二進制數為0001,10的二進制數為1010,所以1 ^ 10的結果為1011,對應的十進制數為11。20的二進制數為10100,30的二進制數為11110,所以20 ^ 30的結果為01010,對應的十進制數為10。

再舉例:

mysql> SELECT 12 & 5, 12 | 5,12 ^ 5 FROM DUAL;
+--------+--------+--------+
| 12 & 5 | 12 | 5 | 12 ^ 5 |
+--------+--------+--------+
|      4 |     13 |      9 |
+--------+--------+--------+
1 row in set (0.00 sec)
image-20211023115738415

4. 按位取反運算符
按位取反(~)運算符將給定的值的二進制數逐位進行取反操作,即將1變為0,將0變為1。

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

由於按位取反(~)運算符的優先級高於按位與(&)運算符的優先級,所以10 & ~1,首先,對數字1進行按位取反操作,結果除了最低位為0,其他位都為1,然后與10進行按位與操作,結果為10。

5. 按位右移運算符
按位右移(>>)運算符將給定的值的二進制數的所有位右移指定的位數。右移指定的位數后,右邊低位的數值被移出並丟棄,左邊高位空出的位置用0補齊。

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

1的二進制數為0000 0001,右移2位為0000 0000,對應的十進制數為0。4的二進制數為0000 0100,右移2位為0000 0001,對應的十進制數為1。

6. 按位左移運算符
按位左移(<<)運算符將給定的值的二進制數的所有位左移指定的位數。左移指定的位數后,左邊高位的數值被移出並丟棄,右邊低位空出的位置用0補齊。

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的二進制數為0000 0100,左移兩位為0001 0000,對應的十進制數為16。

5. 運算符的優先級

image-20211012111042395

image-20211012110731059

數字編號越大,優先級越高,優先級高的運算符先進行計算。可以看到,賦值運算符的優先級最低,使用“()”括起來的表達式的優先級最高。

拓展:使用正則表達式查詢

正則表達式通常被用來檢索或替換那些符合某個模式的文本內容,根據指定的匹配模式匹配文本中符合要求的特殊字符串。例如,從一個文本文件中提取電話號碼,查找一篇文章中重復的單詞或者替換用戶輸入的某些敏感詞語等,這些地方都可以使用正則表達式。正則表達式強大而且靈活,可以應用於非常復雜的查詢。

MySQL中使用REGEXP關鍵字指定正則表達式的字符匹配模式。下表列出了REGEXP操作符中常用字符匹配列表。

image-20210926151249943

1. 查詢以特定字符或字符串開頭的記錄
字符‘^’匹配以特定字符或者字符串開頭的文本。

在fruits表中,查詢f_name字段以字母‘b’開頭的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP '^b';

2. 查詢以特定字符或字符串結尾的記錄
字符‘$’匹配以特定字符或者字符串結尾的文本。

在fruits表中,查詢f_name字段以字母‘y’結尾的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP 'y$';

3. 用符號"."來替代字符串中的任意一個字符
字符‘.’匹配任意一個字符。
在fruits表中,查詢f_name字段值包含字母‘a’與‘g’且兩個字母之間只有一個字母的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP 'a.g';

4. 使用"*"和"+"來匹配多個字符
星號‘*’匹配前面的字符任意多次,包括0次。加號‘+’匹配前面的字符至少一次。

在fruits表中,查詢f_name字段值以字母‘b’開頭且‘b’后面出現字母‘a’的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba*';

在fruits表中,查詢f_name字段值以字母‘b’開頭且‘b’后面出現字母‘a’至少一次的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba+';

5. 匹配指定字符串
正則表達式可以匹配指定字符串,只要這個字符串在查詢文本中即可,如要匹配多個字符串,多個字符串之間使用分隔符‘|’隔開。

在fruits表中,查詢f_name字段值包含字符串“on”的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP 'on';

在fruits表中,查詢f_name字段值包含字符串“on”或者“ap”的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP 'on|ap';

之前介紹過,LIKE運算符也可以匹配指定的字符串,但與REGEXP不同,LIKE匹配的字符串如果在文本中間出現,則找不到它,相應的行也不會返回。REGEXP在文本內進行匹配,如果被匹配的字符串在文本中出現,REGEXP將會找到它,相應的行也會被返回。對比結果如下所示。

在fruits表中,使用LIKE運算符查詢f_name字段值為“on”的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name like 'on';
Empty set(0.00 sec)

6. 匹配指定字符中的任意一個
方括號“[]”指定一個字符集合,只匹配其中任何一個字符,即為所查找的文本。

在fruits表中,查找f_name字段中包含字母‘o’或者‘t’的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP '[ot]';

在fruits表中,查詢s_id字段中包含4、5或者6的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE s_id REGEXP '[456]';

7. 匹配指定字符以外的字符
“[^字符集合]”匹配不在指定集合中的任何字符。

在fruits表中,查詢f_id字段中包含字母ae和數字12以外字符的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_id REGEXP '[^a-e1-2]';

8. 使用{n,}或者{n,m}來指定字符串連續出現的次數
“字符串{n,}”表示至少匹配n次前面的字符;“字符串{n,m}”表示匹配前面的字符串不少於n次,不多於m次。例如,a{2,}表示字母a連續出現至少2次,也可以大於2次;a{2,4}表示字母a連續出現最少2次,最多不能超過4次。

在fruits表中,查詢f_name字段值出現字母‘x’至少2次的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP 'x{2,}';

在fruits表中,查詢f_name字段值出現字符串“ba”最少1次、最多3次的記錄,SQL語句如下:

mysql> SELECT * FROM fruits WHERE f_name REGEXP 'ba{1,3}';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM