Mysql 進階查詢 (select 語句的高級用法)


前言、

在mysql 中,可以使用SELECT 語句來查詢數據,查詢數據是指從數據庫中根據需求,使用不同的查詢方式來獲取不同的數據,是使用頻率最高,最重要的操作。

今天給大家帶來查詢語句的高級語法

一、按關鍵字排序

1、使用order by語句來實現排序

2、排序可針對一個或多個字段

3、ASC:升序,默認排序方式

4、DESC:降序

5、order by的語法結構

select 字段1,字段2 from 表明 order by 字段1 desc|asc,字段2 desc|asc;

6、按單子段排序

按照成績降序排序
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      80 |
| 20201002 | zhangsan |      85 |
| 20201003 | mazi     |      90 |
+----------+----------+---------+
mysql> mysql> select id,name,chengji from chengji where chengji>50 ordhengji desc;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201003 | mazi     |      90 |
| 20201002 | zhangsan |      85 |
| 20201001 | lili     |      80 |
+----------+----------+---------+
3 rows in set (0.01 sec)
按照chengji升序排列  且>50
mysql> select id,name,chengji from chengji where chengji>50 order by chengji asc;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      80 |
| 20201002 | zhangsan |      85 |
| 20201003 | mazi     |      90 |
+----------+----------+---------+
3 rows in set (0.00 sec)

 多字段排序 

主參考字段在前面,按照成績降序,輔助參考字段寫在后面,按照ID升序 先比較主參考字段,如果相同再按照輔助字段排序
mysql> select id,name,chengji from chengji where chengji>70 order by chengji desc,id asc;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201003 | mazi     |      90 |
| 20201002 | zhangsan |      85 |
| 20201004 | sisi     |      85 |
| 20201001 | lili     |      80 |
+----------+----------+---------+
4 rows in set (0.00 sec)  

二、對結果進行分組  

1、使用group by 語句來實現分組

2、通常結合聚合函數一起使用

3、可以按照一個或多個字段對結果進行分組

4、group by 的語法結構

按照成績進行分組,並進行計數。統計成績相同的那么數量
mysql> select count(name),chengji from chengji where chengji>79 group by chengji;
+-------------+---------+
| count(name) | chengji |
+-------------+---------+
|           1 |      80 |
|           2 |      85 |
|           1 |      90 |
+-------------+---------+
3 rows in set (0.00 sec)
按照上面的排序 在按照降序排列
mysql> select count(name),chengji from chengji where chengji>79 group by chengji desc;
+-------------+---------+
| count(name) | chengji |
+-------------+---------+
|           1 |      90 |
|           2 |      85 |
|           1 |      80 |
+-------------+---------+
3 rows in set (0.00 sec)  

三、限制結果條目

1、只返回select查詢結果的第一行或前幾行

2、使用limit 語句限制條目

3、limit 語法結構

select 字段1,字段2 from 表名 limit [offset,] number;

offset: 位置偏移量,從0開始

number:返回記錄行的最大數目

mysql> select * from chengji;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      80 |
| 20201002 | zhangsan |      85 |
| 20201003 | mazi     |      90 |
| 20201004 | sisi     |      85 |
+----------+----------+---------+
4 rows in set (0.00 sec)
只顯示前兩行
mysql> select id,name,chengji from chengji limit 2;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      80 |
| 20201002 | zhangsan |      85 |
+----------+----------+---------+
2 rows in set (0.00 sec)
mysql> select * from chengji;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      80 |
| 20201002 | zhangsan |      85 |
| 20201003 | mazi     |      90 |
| 20201004 | sisi     |      85 |
+----------+----------+---------+
4 rows in set (0.00 sec)
限制顯示結果,從第2行開始,顯示兩行
mysql> select id,name,chengji from chengji limit 2,2;
+----------+------+---------+
| id       | name | chengji |
+----------+------+---------+
| 20201003 | mazi |      90 |
| 20201004 | sisi |      85 |
+----------+------+---------+
2 rows in set (0.00 sec)
顯示前三行
mysql> select id,name,chengji from chengji limit 3;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      80 |
| 20201002 | zhangsan |      85 |
| 20201003 | mazi     |      90 |
+----------+----------+---------+
3 rows in set (0.00 sec)  

四、設置別名

1、使用as語句設置別名,關鍵字as可shenglue

2、設置別名時,保證不能從庫中其他表或字段名稱沖突

3、別名的語法結構

字段別名:

select 字段 from 表名 as 別名

設置字段的別名、
、mysql> select count(*) as 總行數 from chengji;
+-----------+
| 總行數    |
+-----------+
|         4 |
+-----------+
1 row in set (0.00 sec)  

 五、通配符

1、用於替換字符串中的部分字符

2、通常配合like一起使用,並協同where完成查詢

3、常用的通配符

%:表示零個,一個或多個即任意字符

_: 表示單個字符

name字段中以z開頭的任意記錄
mysql> select id,name from chengji where name like 'z%';
+----------+----------+
| id       | name     |
+----------+----------+
| 20201002 | zhangsan |
+----------+----------+
1 row in set (0.00 sec)
name字段中有‘mazi’,匹配最后的單個字符
mysql> select id,name from chengji where name like 'maz_';
+----------+------+
| id       | name |
+----------+------+
| 20201003 | mazi |
+----------+------+
1 row in set (0.00 sec)
‘hang‘前面一個字符,后面任意多個字符
mysql> select id,name from chengji where name like '_hang%';
+----------+----------+
| id       | name     |
+----------+----------+
| 20201002 | zhangsan |
+----------+----------+
1 row in set (0.00 sec)  

六、子查詢

1、也稱作為內查詢或者嵌套查詢

2、先於主查詢被執行,其結果將作為外層主查詢的條件

3、在增刪改查中都可以使用子查詢

4、支持多層嵌套

5、in 語句用來判斷某個值是否在給定的結果集中

查看chengji表的ID是否有(20201001,20201002)

mysql> select id,name from chengji where id in(20201001,20201002);
+----------+----------+
| id       | name     |
+----------+----------+
| 20201001 | lili     |
| 20201002 | zhangsan |
+----------+----------+
2 rows in set (0.00 sec)
先進行子查詢 是否有chengji>85  有則繼續執行
mysql> select id,name from chengji where id in(select id from chengji where chengji>85);
+----------+------+
| id       | name |
+----------+------+
| 20201003 | mazi |
+----------+------+
1 row in set (0.00 sec)
沒有則輸出無

mysql> select id,name from chengji where id in(select id from chengji where chengji>100);
Empty set (0.01 sec)  

多層嵌套

select、update、delete都支持多層嵌套

mysql> select * from chengji where id in (select a.id from (select id from chengji where chengji=85) a);
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201002 | zhangsan |      85 |
| 20201004 | sisi     |      85 |
+----------+----------+---------+
2 rows in set (0.00 sec)

mysql> 
講chengji表中chengji低於90的賦給臨時表a,選擇a表中的成績字段的值進行修改,自身chengji減5
mysql> update chengji set chengji=chengji-5 where id in (select a.id from (select id from chengji where chengji<90) a);
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from chengji 
    -> ;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      75 |
| 20201002 | zhangsan |      80 |
| 20201003 | mazi     |      90 |
| 20201004 | sisi     |      80 |
+----------+----------+---------+
4 rows in set (0.00 sec)
mysql> delete from chengji where id in(select a.id from (select id from chengji where chengji=90) a);
Query OK, 1 row affected (0.01 sec)

mysql> select * from chengji;
+----------+----------+---------+
| id       | name     | chengji |
+----------+----------+---------+
| 20201001 | lili     |      75 |
| 20201002 | zhangsan |      80 |
| 20201004 | sisi     |      80 |
+----------+----------+---------+
3 rows in set (0.00 sec)  

exit的用法

exists類似於if 后面執行成功前面的語句才會執行
mysql> select name from chengji where exists (select id from chengji where name='lili');
+----------+
| name     |
+----------+
| lili     |
| zhangsan |
| sisi     |
+----------+
3 rows in set (0.00 sec)

exists后面只能加select語句,執行成功前面的才執行,不成功前面不執行。

七、null值  

null:真空(什么都沒有)

'':還有空氣

表示缺失的值

與數字0或空白(spaces)不同

使用is null 或者is not null 進行判斷

null值和真空('')的區別

空值長度為零,不占空間,null值得長度為null,占用空間

is null無法判斷空值

空值使用‘=’或者‘<>’ 來處理

count()計算是,null會忽略,空值會加入計算

count()計算時,null會被忽略
mysql> select * from aa;
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
+------+------+--------+
4 rows in set (0.00 sec)

mysql> select count(fenshu) from aa;
+---------------+
| count(fenshu) |
+---------------+
|             3 |
+---------------+
1 row in set (0.00 sec)
查詢fenshu字段為null的記錄
mysql> select * from aa;                                               
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
|    5 | titi |   NULL |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    4 | didi |   NULL |
+------+------+--------+
29 rows in set (0.00 sec)

mysql> select * from aa where fenshu is null;
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    4 | didi |   NULL |
|    5 | titi |   NULL |
|    4 | didi |   NULL |
|    4 | didi |   NULL |
|    4 | didi |   NULL |
|    4 | didi |   NULL |
|    4 | didi |   NULL |
|    4 | didi |   NULL |
+------+------+--------+
8 rows in set (0.00 sec)
查詢fenshu字段不為null的記錄
mysql> select * from aa where fenshu is not null;
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
|    1 | qiqi |     80 |
|    2 | sisi |     85 |
|    3 | lili |     85 |
+------+------+--------+
21 rows in set (0.00 sec)  
count計數時 空值也會加入計數
mysql> select * from cc;
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    1 | qiqi | 80     |
|    2 | sisi | 85     |
|    3 | lili | 85     |
|    4 | didi | NULL   |
|    5 | didi |        |
+------+------+--------+
5 rows in set (0.00 sec)

mysql> select count(fenshu) from cc;
+---------------+
| count(fenshu) |
+---------------+
|             4 |
+---------------+
1 row in set (0.00 sec)

  

八、正則表達式

1、根據指定的匹配模式匹配記錄中符合要求的特殊字符

2、使用regexp關鍵字指定匹配模式

3、常用匹配模式

 

 ①:以特定字符串開頭的記錄

mysql> select id,name,fenshu from cc where name regexp ‘^z’;

②:以特定字符串結尾的記錄

mysql> select id,name,fenshu from cc where name regexp ‘u$’;

③:包含指定字符串的記錄

mysql> select id,name,fenshu from cc where name regexp 'lili';
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    3 | lili | 85     |
+------+------+--------+
1 row in set (0.00 sec)

mysql>   

④、

mysql> select id,name,fenshu from cc where name regexp 'l..i';
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    3 | lili | 85     |
+------+------+--------+
1 row in set (0.00 sec)  

 ⑤、匹配包含或者關系的記錄

mysql> select id,name,fenshu from cc where name regexp 'li|qi';
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    1 | qiqi | 80     |
|    3 | lili | 85     |
+------+------+--------+
2 rows in set (0.00 sec)  

⑥、“*”匹配前面字符的任意多次

正表達式中*代表匹配前面字符任意多次,只寫一個*沒意義
name字段中匹配l任意多次,則匹配所有
mysql> select * from cc where name regexp '*';
ERROR 1139 (42000): Got error 'repetition-operator operand invalid' from regexp
mysql> select * from cc where name regexp 'l*';
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    1 | qiqi | 80     |
|    2 | sisi | 85     |
|    3 | lili | 85     |
|    4 | didi | NULL   |
|    5 | didi |        |
+------+------+--------+
5 rows in set (0.00 sec)  

⑦、“+”匹配前面字符至少一次
mysql> select * from cc where name regexp ‘z+’;

⑧、匹配指定字符集中的任意一個

mysql> select * from cc where name regexp '^[d-l]';
+------+------+--------+
| id   | name | fenshu |
+------+------+--------+
|    3 | lili | 85     |
|    4 | didi | NULL   |
|    5 | didi |        |
+------+------+--------+
3 rows in set (0.00 sec)

方括號“[]”指定了一個字符集合,只匹配其中的一個字符。“”不僅可以放到左側,也可以放到方括號內,放到左側表示以這些字符集內的字符開頭,而放到方括號內則表示不在指定的字符集合內的字符。例如“[d-f]”表示除 d、e、f 以外的任何字符。

九、運算符

用於對記錄中的字段值進行運算

Mysql 的運算符共有四種,分別是:算術運算符、比較運算符、邏輯運算符和位運算符

1、算術運算符

 

以select命令來實現最基礎的加減乘除運算,具體操作如下

mysql> select 1+2,1-2,1*2,10/2,10%3;
+-----+-----+-----+--------+------+
| 1+2 | 1-2 | 1*2 | 10/2   | 10%3 |
+-----+-----+-----+--------+------+
|   3 |  -1 |   2 | 5.0000 |    1 |
+-----+-----+-----+--------+------+
1 row in set (0.00 sec)

整數相除,出來的結果是浮點型的。
在除法運算和求余數運算中,除數不能為 0,若除數是 0,返回的結果則為 NULL。
需要注意的是,如果有多個運算符,按照先乘除后加減的優先級進行運算。  

 

mysql> select 10/0,10%0;
+------+------+
| 10/0 | 10%0 |
+------+------+
| NULL | NULL |
+------+------+
1 row in set (0.00 sec)
mysql> select 1+2*3;
+-------+
| 1+2*3 |
+-------+
|     7 |
+-------+
1 row in set (0.00 sec)
mysql> select (1+2)*3;
+---------+
| (1+2)*3 |
+---------+
|       9 |
+---------+
1 row in set (0.00 sec)

  注意:某些字符串類型的字段存儲的數字型字符串,這些字段在進行算術運算時將會被自動轉換為數字的值。如果字符串的開始部分是數字,在轉換時將被轉換為這個數字。如果是既包含字符又包含數字得的混合字符串,無法轉換為數字時,將被轉換為 0。

mysql> select 3*'3i'
    -> ;
+--------+
| 3*'3i' |
+--------+
|      9 |
+--------+
1 row in set, 1 warning (0.00 sec)

mysql> select 3*'i3i';
+---------+
| 3*'i3i' |
+---------+
|       0 |
+---------+
1 row in set, 1 warning (0.00 sec)

2、比較運算符

 

 

 (1) 等於運算符
用來判斷數字、字符串和表達式是否相等的,如果相等則返回 1,如果不相等則返回 0。其中字符的比較是根據 ASCII 碼來判斷的。
ASCII碼表轉換:
0-48,1-49,…9-57
A-65,B-66
a-97,b-98

mysql> select 1=3,2='2','e'='e','r'=null;
+-----+-------+---------+----------+
| 1=3 | 2='2' | 'e'='e' | 'r'=null |
+-----+-------+---------+----------+
|   0 |     1 |       1 |     NULL |
+-----+-------+---------+----------+
1 row in set (0.00 sec)

比較規則:
如果兩者都是整數,則按照整數值進行比較。
如果一個整數一個字符串,則會自動將字符串轉換為數字,再進行比較。
如果兩者都是字符串,則按照字符串進行比較。
如果兩者中至少有一個值是 NULL,則比較的結果是 NULL。
(2) 不等於運算符
不等於號有兩種寫法,分別是<>或者!=,用於針對數字、字符串和表達式不相等的比較。如果不相等則返回 1,如果相等則返回 0。
需要注意的是不等於運算符不能用於判斷 NULL。

mysql> select 'ta'!='tat',1<>2,2.4<>2,'r'<>null;
+-------------+------+--------+-----------+
| 'ta'!='tat' | 1<>2 | 2.4<>2 | 'r'<>null |
+-------------+------+--------+-----------+
|           1 |    1 |      1 |      NULL |
+-------------+------+--------+-----------+
1 row in set (0.00 sec

(3) 大於、大於等於、小於、小於等於運算符
注意:都不能用於判斷NULL。

mysql> select 'a'<'b',(2+3)>=(4+1),4>4,'p'>null;
+---------+--------------+-----+----------+
| 'a'<'b' | (2+3)>=(4+1) | 4>4 | 'p'>null |
+---------+--------------+-----+----------+
|       1 |            1 |   0 |     NULL |
+---------+--------------+-----+----------+
1 row in set (0.00 sec)

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

mysql> select 'p' is null,null is null,'null' is not null;
+-------------+--------------+--------------------+
| 'p' is null | null is null | 'null' is not null |
+-------------+--------------+--------------------+
|           0 |            1 |                  1 |
+-------------+--------------+--------------------+
1 row in set (0.00 sec)
'null'是字符串,不是null

(5) between and
用於判斷一個值是否落在某兩個值之間
例如,判斷某數字是否在另外兩個數字之間,也可以判斷某英文字母是否在另外兩個字母之間

mysql> select 15 between 8 and 20,'c' between 'd' and 'z';
+---------------------+-------------------------+
| 15 between 8 and 20 | 'c' between 'd' and 'z' |
+---------------------+-------------------------+
|                   1 |                       0 |
+---------------------+-------------------------+
1 row in set (0.00 sec)

(6) least、greatest
LEAST:當有兩個或者多個參數時,返回其中的最小值。如果其中一個值為 NULL,則返回結果就為 NULL。
GREATEST:當有兩個或者多個參數時,返回其中的最大值。如果其中一個值為 NULL, 則返回結果就為 NULL。

mysql> select least(1,2,3) as zishu,greatest('j','d','z') as max;
+-------+-----+
| zishu | max |
+-------+-----+
|     1 | z   |
+-------+-----+
1 row in set (0.00 sec)

mysql> select least(1,2,3,null) as zishu,greatest('j','d','z') as max;
+-------+-----+
| zishu | max |
+-------+-----+
|  NULL | z   |
+-------+-----+
1 row in set (0.00 sec)

(7) in、not in
IN 判斷一個值是否在對應的列表中,如果是返回 1,否則返回 0。
NOT IN 判斷一個值是否不在對應的列表中,如果不是返回 1,否則返回 0。

mysql> select 3 in (1,3,4),'c' not in ('c','d','b');
+--------------+--------------------------+
| 3 in (1,3,4) | 'c' not in ('c','d','b') |
+--------------+--------------------------+
|            1 |                        0 |
+--------------+--------------------------+
1 row in set (0.00 sec)

(8) like、not like
LIKE 用來匹配字符串,如果匹配成功則返回 1,反之返回 0;NOT LIKE 正好跟 LIKE 相反。
LIKE 支持兩種通配符:’%’ 用於匹配任意數目的字符,而’_’只能匹配一個字符。  

mysql> select 'zhangsan' like 'zh%','lisi' like 'lis_','asc' not like '_sc';
+-----------------------+--------------------+----------------------+
| 'zhangsan' like 'zh%' | 'lisi' like 'lis_' | 'asc' not like '_sc' |
+-----------------------+--------------------+----------------------+
|                     1 |                  1 |                    0 |
+-----------------------+--------------------+----------------------+
1 row in set (0.00 sec)

3.邏輯運算符
又被稱為布爾運算符
用來判斷表達式的真假

 

 (1)邏輯非
邏輯非將跟在它后面的邏輯測試取反,把真變為假,把假變為真。
如果 NOT 后面的操作數為 0 時,所得值為 1;如果操作數為非 0 時,所得值為 0;如果操作數為 NULL 時,所得值為 NULL。
注意:非0值都是1

mysql> select not 2,! 0,not (5-5),! null;
+-------+-----+-----------+--------+
| not 2 | ! 0 | not (5-5) | ! null |
+-------+-----+-----------+--------+
|     0 |   1 |         1 |   NULL |
+-------+-----+-----------+--------+
1 row in set (0.00 sec)

(2)邏輯與
如果所有值都是真返回 1,否則返回 0。

邏輯與運算只要遇到0就是0
mysql> select 3 and 4,5 && 0,0 && null,2 and null;
+---------+--------+-----------+------------+
| 3 and 4 | 5 && 0 | 0 && null | 2 and null |
+---------+--------+-----------+------------+
|       1 |      0 |         0 |       NULL |
+---------+--------+-----------+------------+
1 row in set (0.00 sec)

(3)邏輯或(最好用or)
邏輯或表示包含的操作數,任意一個為非零值並且不是 NULL 值時,返回 1,否則返回0

mysql> select 2 or 0,3 or 5,0 or 0,0 or null,2 or null;
+--------+--------+--------+-----------+-----------+
| 2 or 0 | 3 or 5 | 0 or 0 | 0 or null | 2 or null |
+--------+--------+--------+-----------+-----------+
|      1 |      1 |      0 |      NULL |         1 |
+--------+--------+--------+-----------+-----------+
1 row in set (0.00 sec)

(4)邏輯異或
兩個非 NULL 值的操作數,如果兩者都是 0 或者都是非 0,則返回 0;如果一個為 0, 另一個為非 0,則返回結果為 1;
當任意一個值為 NULL 時,返回值為 NULL。

mysql> select 0 xor 0,0 xor 1,2 xor 3,3 xor null;
+---------+---------+---------+------------+
| 0 xor 0 | 0 xor 1 | 2 xor 3 | 3 xor null |
+---------+---------+---------+------------+
|       0 |       1 |       0 |       NULL |
+---------+---------+---------+------------+
1 row in set (0.00 sec)

運算總結:
and運算,只要碰到0就是0,(非0和null是null)
or運算,只要碰到非0值就是1,(0和null是null)
異或運算,只要碰到null都是null

 

 

 

 4.位運算符
位運算符實際上是對二進制數進行計算的運算符

 

mysql> select 12&13,11|12,10^15,3&~1;
+-------+-------+-------+------+
| 12&13 | 11|12 | 10^15 | 3&~1 |
+-------+-------+-------+------+
|    12 |    15 |     5 |    2 |
+-------+-------+-------+------+
1 row in set (0.00 sec)

位運算方法:
按位與運算
10–》1010
15–》1111
1010 --》10
按位與運算(&),是對應的二進制位都是 1 的,它們的運算結果為 1,否則為 0

按位或運算
10–》1010
15–》1111
1111–》15
按位或運算(|),是對應的二進制位只要是 1 的,它們的運算結果就為 1,否則為 0

按位異或運算
10–》1010
15–》1111
0101–》5
按位異或運算(^),是對應的二進制位不相同時,運算結果 1,否則為 0

按位取反運算
1–》0001
~1–》1110
5–》0101
0100–》4
按位取反(~),是對應的二進制數逐位反轉,即 1 取反后變為 0, 0 取反后變為 1

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

按位左移運算
1<<2
1–》0001
按位左移2位,空缺處補0
0100–》4

10<<3
10–》1010
按位左移3位,空缺處補0
1010000–》80
按位右移運算
10>>2
10–》1010
按位右移2位,多余的位數直接刪除
0010–》2

15>>2
15–》1111
按位右移2位,多余的位數直接刪除
0011–》3
常用的運算符優先級

 

 十、連接查詢

通常都是將來自兩個或多個表的行結合起來,基於這些表之間的共同字段,進行數據的拼接。
要先確定一個主表作為結果集,然后將其他表的行有選擇性的連接到選定的主表結果集上。

使用較多的連接查詢包括:內連接、左連接和右連接
1.內連接
在from子句中使用關鍵字 inner join 來連接多張表,並使用 on子句設置連接條件。
mysql> select info.name,hob.hobbyname from info inner join hob on info.hobby=hob.id;
±---------±-------------+
| name | hobbyname |
±---------±-------------+
| zhangsan | 人工智能 |
| zhaosi | 人工智能 |
| wangwu | 雲計算 |
| zhaoliu | 人工智能 |
| heiqi | 雲計算 |
±---------±-------------+
內連接是系統默認的表連接,所以在 FROM 子句后可以省略 INNER 關鍵字,只使用關鍵字 JOIN。同時有多個表時,也可以連續使用 INNER JOIN 來實現多表的內連接,不過為了更好的性能,建議最好不要超過三個表。
2.外連接
左連接,主表在左邊,主表內容會全部顯示出來,在從表中沒匹配到的以NULL顯示出來

 

 

 右連接,主表在右邊,主表內容會全部顯示出來,在從表中沒匹配到的以NULL顯示出來

 

 修改表的結構

alter table old_name rename new_name; --修改表名

alter table test add  column add_name varchar(10); --添加表列

alter table test drop  column del_name; --刪除表列

alter table test modify address char(10) --修改表列類型
# alter table test change address address  char(40)


alter table test change  column address address1 varchar(30)--修改表列名

  

 

  

 

 

  

 

  

  

  

  

  

  

  

  

  

  

  

 

  

  

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  


免責聲明!

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



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