前言、
在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)--修改表列名