回顧
列屬性:注釋和唯一鍵
關(guān)系:一對(duì)一,多對(duì)一,多對(duì)多
范式:規(guī)范數(shù)據(jù)表設(shè)計(jì)的方式
外鍵:外鍵約束(嚴(yán)格,置空,級(jí)聯(lián))
高級(jí)數(shù)據(jù)操作:增刪改查
查詢操作
完整語(yǔ)法
選項(xiàng) 表達(dá)式 from子句 where子句 group by子句 子句 order by子句 limit子句
group by分組分組語(yǔ)法
group by就是根據(jù)某個(gè)條件對(duì)數(shù)據(jù)進(jìn)行分組。
語(yǔ)法: 字段
分組之后,會(huì)對(duì)數(shù)據(jù)進(jìn)行取第一條。
分組主要是用來(lái)進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。
統(tǒng)計(jì)函數(shù)
(分組統(tǒng)計(jì)函數(shù))
max:求最大值
min:最小值
avg:平均值
count:總記錄數(shù),如果使用count(*)那么是統(tǒng)計(jì)記錄數(shù),如果count(字段)其實(shí)也是統(tǒng)計(jì)記錄數(shù),如果改字段某個(gè)值為null,那么不統(tǒng)計(jì)。
sum:求和
count不統(tǒng)計(jì)為空的字段(以字段為統(tǒng)計(jì)單位)
分組統(tǒng)計(jì)原理
:將分組統(tǒng)計(jì)中的某個(gè)字段的所有數(shù)據(jù)進(jìn)行連接操作
多字段分組
group by字段1,字段2….
分組排序
語(yǔ)法: 字段 [asc|desc]
回溯統(tǒng)計(jì)
注:能理解就去花時(shí)間
系統(tǒng)根據(jù)分組的情況,逐層向上回溯,最終直到頂層。
語(yǔ)法:在所有的分組字段之后使用 with ;
子句
子句與where子句一樣,都是用于條件判斷的。
區(qū)別1
where是判斷數(shù)據(jù)從磁盤讀入內(nèi)存的時(shí)候
是判斷分組統(tǒng)計(jì)之前的所有條件
區(qū)別原理
區(qū)別2
子句中可以使用字段別名,而where不能使用
區(qū)別3
能夠使用統(tǒng)計(jì)函數(shù),但是where不能使用
order by子句
排序子句,對(duì)對(duì)應(yīng)的字段進(jìn)行排序。排序依賴校對(duì)集。
語(yǔ)法
order by 字段 [asc|desc];
多字段排序
order by 字段 [asc|desc],字段2 [asc|desc];
limit子句
limit的基本使用用于限制數(shù)據(jù)的訪問(wèn)量。
limit標(biāo)準(zhǔn)使用語(yǔ)法
limit ,;
從指定位置()開(kāi)始,獲取對(duì)應(yīng)長(zhǎng)度()條記錄
limit的應(yīng)用:分頁(yè)
分頁(yè)必須知道的條件:頁(yè)碼,每頁(yè)顯示的數(shù)據(jù)長(zhǎng)度
:長(zhǎng)度
:(頁(yè)碼 – 1) *
聯(lián)合查詢
聯(lián)合查詢:將多個(gè)查詢的結(jié)果,進(jìn)行縱向的聯(lián)合,而不改變字段數(shù),只改變記錄數(shù)。
語(yǔ)法
語(yǔ)句
選項(xiàng)
語(yǔ)句
union選項(xiàng):與選項(xiàng)完全一致,union選項(xiàng)默認(rèn)的是(去重)
注意
1.union使用的時(shí)候,必須保證多條查詢語(yǔ)句之間的字段數(shù)要求一致
2.union使用的時(shí)候,沒(méi)有數(shù)據(jù)的類型的概念,只有列數(shù)相同的概念。
union意義
1.合并不同表的數(shù)據(jù)(數(shù)據(jù)量太大,導(dǎo)致一張表存不下),往往是用于數(shù)據(jù)的統(tǒng)計(jì)
2.對(duì)同一張表進(jìn)行數(shù)據(jù)的不同形式的展示。
需求:將學(xué)生表中1班的學(xué)生按照年齡升序排序,2班的學(xué)生按照年齡降序排序
order by使用
( 語(yǔ)句 order by子句)
union
( 語(yǔ)句 order by 子句);
在union中使用order by必須搭配limit
( 語(yǔ)句 order by子句 limit子句)
union
( 語(yǔ)句 order by 子句 limit子句);
需求:
1.獲取1班的所有學(xué)生
* from where c_id = 1;
2.獲取1班的所有學(xué)生,還要獲取對(duì)應(yīng)的班級(jí)信息
連接查詢
連接查詢:將兩個(gè)表中的數(shù)據(jù),進(jìn)行字段上的拼接,字段數(shù)一定會(huì)增加。
連接查詢分為幾類:內(nèi)連接,外連接,交叉連接,自然連接
連接關(guān)鍵字:join
左表:join關(guān)鍵字左邊的表是左表
右表:join關(guān)鍵字右邊的表是右表
交叉連接
* from 表1,表2;
交叉連接:
交叉連接得到的結(jié)果是笛卡爾積,所以應(yīng)該盡量避免笛卡爾積出現(xiàn)。
內(nèi)連接
內(nèi)連接:左表中出現(xiàn)的數(shù)據(jù),在右表中也同樣存在,那么記錄保存,如果不存在就不需要該記錄。
語(yǔ)法:
[inner] join on 連接條件
沒(méi)有連接條件的內(nèi)連接
內(nèi)連接
內(nèi)連接原理
內(nèi)連接的條件匹配可以使用where,on可以用where代替
外連接
外連接:以某一張表為主表,拿著表中的所有記錄去另外的一張表中匹配,如果匹配成功,保留全部記錄,如果匹配失敗,那么未匹配成功的字段全部置空。
語(yǔ)法:
左(外)連接:左表為主表,右表為副表, left [out] join on 連接條件
右(外)連接:右表為主表,左表為副表, right [out] join on 連接條件
左連接
右連接
左連接轉(zhuǎn)右連接
需求:獲取學(xué)生以及對(duì)應(yīng)的班級(jí)信息,要求只獲取1班的所有的學(xué)生
自然連接
自然連接:在連接表的時(shí)候,不需要指定連接條件,系統(tǒng)自動(dòng)匹配。
自然連接包括:自然內(nèi)連接,自然外連接
語(yǔ)法:
[left/right] join ;
自然內(nèi)連接
修改表的name字段之后
自然連接在匹配之后,只會(huì)保留一個(gè)同名字段(保留的是左表)
自然外連接
內(nèi)連接和外連接模擬自然連接:使用同名字段作為連接條件,并且合并同名字段。
語(yǔ)法:using(字段列表)
內(nèi)連接模擬
外連接模擬
using模擬多字段自然連接
注意:實(shí)際項(xiàng)目開(kāi)發(fā)中,需求上的滿足通常是使用內(nèi)連接和外連接,很少使用自然連接和交叉連接。
多表連接:與兩張表完全一樣
A join B on A.字段 = B.字段 join C on A.字段 = C.字段 …
需求:
1.查出所有1班的學(xué)生;
* from where c_id =1;
2.查出所有班的學(xué)生
解決方案1: * from s class c on s.c_id = c.id where c.name = '’;
解決方案2:
找出對(duì)應(yīng)的班級(jí)id: id from class where name= '’;
通過(guò)id找出所有該班級(jí)學(xué)生: * from id = ?;
子查詢
一條查詢語(yǔ)句出現(xiàn)在另外一條查詢語(yǔ)句的內(nèi)部,這條語(yǔ)句就被稱之為子查詢語(yǔ)句。
子查詢分類
子查詢可以根據(jù)子查詢返回的結(jié)果以及子查詢出現(xiàn)的位置兩種方式進(jìn)行分類
按結(jié)果分類:
標(biāo)量子查詢:子查詢返回的結(jié)果是一行一列,一個(gè)字段的某一個(gè)值
列子查詢:子查詢返回的結(jié)果是一列,多行修改視圖關(guān)鍵字,一個(gè)字段有多個(gè)值
行子查詢:子查詢返回的結(jié)果是一行多列,多行多列
表子查詢:子查詢返回的結(jié)果多行多列
按照位置分類:
where子查詢:子查詢出現(xiàn)在where條件之后
from子查詢:子查詢出現(xiàn)在from之后
子查詢:出現(xiàn)在之后,出現(xiàn)在where之后
標(biāo)量子查詢
子查詢返回的結(jié)果是一個(gè)標(biāo)量
列子查詢
子查詢返回的結(jié)果是一列。
需求:獲取所有班級(jí)的所有學(xué)生,學(xué)生必須在班級(jí)中存在。
* from where c_id is ; -- 無(wú)法解決
解決方案
1.獲取所有的現(xiàn)有班級(jí)的id: id from class;
2.從學(xué)生表中查出所有數(shù)據(jù),判斷學(xué)生的班級(jí)id是否在剛查出來(lái)的班級(jí)id中存在
集合判斷條件(理解性知識(shí))
集合(1,2,3,4,5)
any:任意一個(gè),1 = any(集合),只要結(jié)果在集合中出現(xiàn)過(guò),就返回true
all:全部,必須滿足全部條件才返回真
some:等于其中的一部分,與any完全一致
行子查詢
子查詢返回的結(jié)果是一行多列
需求:找出所有班級(jí)中年齡最大,同時(shí)身高最高的學(xué)生;
行子查詢必須構(gòu)建行元素:有多個(gè)字段的元素
* from 表名 where (字段1,字段2…) =/in ( 字段1,字段2… from 表名);
表子查詢
表子查詢從返回結(jié)果的層面上講與行子查詢完全一樣。因?yàn)槠涑霈F(xiàn)的位置不是在where之后,而是在where之前,from之后。from后接數(shù)據(jù)源。
需求:求出每個(gè)班中身高最高的1個(gè)學(xué)生。
表子查詢出現(xiàn)的原因:因?yàn)槟承r(shí)候,希望order by在group by之前先執(zhí)行。
視圖
視圖:視圖是一張?zhí)摂M表,存在表結(jié)構(gòu),但是沒(méi)有數(shù)據(jù)。
視圖關(guān)鍵字:view
創(chuàng)建視圖
語(yǔ)法:
view 視圖名字 as 語(yǔ)句;
視圖創(chuàng)建之后發(fā)生了什么?
1.創(chuàng)建視圖結(jié)構(gòu)(虛擬表)
2.在數(shù)據(jù)庫(kù)對(duì)應(yīng)的文件夾下創(chuàng)建結(jié)構(gòu)文件
視圖是虛擬表,只有結(jié)構(gòu)修改視圖關(guān)鍵字,沒(méi)有數(shù)據(jù)。
視圖查看
1.視圖可以像表一樣的查看
show /show table/desc 視圖名
2.可以通過(guò)視圖查看創(chuàng)建語(yǔ)句的方法
show view 視圖名;
3.查看視圖數(shù)據(jù):與查看表完全一致
視圖不保存數(shù)據(jù):數(shù)據(jù)的來(lái)源指的是當(dāng)視圖被調(diào)用的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用視圖的創(chuàng)建語(yǔ)句中的語(yǔ)句去執(zhí)行。
修改視圖
視圖修改的本質(zhì)是修改視圖的數(shù)據(jù)來(lái)源。
語(yǔ)法
alter view 視圖名字 as 語(yǔ)句;
刪除視圖
語(yǔ)法
drop view 視圖名字;
視圖作用
1.節(jié)省查詢語(yǔ)句的長(zhǎng)度
2.對(duì)外提供訪問(wèn)接口
保證數(shù)據(jù)表(基表)的數(shù)據(jù)安全性。
視圖能夠選擇性的從基表獲取數(shù)據(jù),并提供給外部。
3.對(duì)外友好性
視圖能夠?qū)ν馓峁┎煌臄?shù)據(jù)信息。(不同的接口定義不同的視圖)
視圖數(shù)據(jù)增刪改
視圖可以為基表進(jìn)行數(shù)據(jù)的增刪改操作,必須滿足以下條件
視圖新增數(shù)據(jù)
1.視圖的數(shù)據(jù)來(lái)源(基表)只能有一個(gè)
多表視圖不能插入數(shù)據(jù)
2.視圖中的所有字段,必須包含了基表中不為空或者沒(méi)有默認(rèn)值的全部字段。
更新數(shù)據(jù):基本沒(méi)有限制
單表視圖更新
多表視圖更新
刪除數(shù)據(jù):與插入數(shù)據(jù)條件一致,只有單表視圖可以刪除,多表不能刪除
單表視圖刪除
多表視圖刪除
視圖算法
視圖在執(zhí)行的過(guò)程中(視圖被查詢),到底是如何去執(zhí)行視圖對(duì)應(yīng)的查詢語(yǔ)句。
視圖算法分為三種:
合并:,先將視圖的SQL查詢與與外部的查詢語(yǔ)句進(jìn)行語(yǔ)法合并
臨時(shí)表:,先執(zhí)行視圖里面的查詢語(yǔ)句,結(jié)果變成一個(gè)臨時(shí)表
未定義:,系統(tǒng)自己判斷到底使用合并還是臨時(shí)表,默認(rèn)的
算法指定語(yǔ)法
view = 算法 視圖名字 as 語(yǔ)句