列屬性:注釋和唯一鍵
關(guān)系:一對一,多對一,多對多
范式:規范數據表設計的方式
外鍵:外鍵約束(嚴格,置空,級聯(lián))
高級數據操作:增刪改查
完整語(yǔ)法
select select選項 表達式 from子句 where子句 group by子句 having子句 order by子句 limit子句
group by就是根據某個(gè)條件對數據進(jìn)行分組。
語(yǔ)法:group by 字段

分組之后,會(huì )對數據進(jìn)行取第一條。
分組主要是用來(lái)進(jìn)行數據統計。
(分組統計函數)
max:求最大值
min:最小值
avg:平均值
count:總記錄數,如果使用count(*)那么是統計記錄數,如果count(字段)其實(shí)也是統計記錄數,如果改字段某個(gè)值為null,那么不統計。
sum:求和

count不統計為空的字段(以字段為統計單位)


group_concat:將分組統計中的某個(gè)字段的所有數據進(jìn)行連接操作

group by字段1,字段2….

語(yǔ)法:group by 字段 [asc|desc]

注:能理解就去花時(shí)間
系統根據分組的情況,逐層向上回溯,最終直到頂層。
語(yǔ)法:在所有的分組字段之后使用 with rollup;

having子句與where子句一樣,都是用于條件判斷的。
where是判斷數據從磁盤(pán)讀入內存的時(shí)候
having是判斷分組統計之前的所有條件

區別原理

having子句中可以使用字段別名,而where不能使用

having能夠使用統計函數,但是where不能使用

排序子句,對對應的字段進(jìn)行排序。排序依賴(lài)校對集。
語(yǔ)法
order by 字段 [asc|desc];

多字段排序
order by 字段 [asc|desc],字段2 [asc|desc];

limit的基本使用用于限制數據的訪(fǎng)問(wèn)量。

limit標準使用語(yǔ)法
limit offset,length;
從指定位置(offset)開(kāi)始,獲取對應長(cháng)度(length)條記錄

limit的應用:分頁(yè)
分頁(yè)必須知道的條件:頁(yè)碼,每頁(yè)顯示的數據長(cháng)度
length:長(cháng)度
offset:(頁(yè)碼 – 1) * length
聯(lián)合查詢(xún):將多個(gè)查詢(xún)的結果,進(jìn)行縱向的聯(lián)合,而不改變字段數,只改變記錄數。
select 語(yǔ)句
union union選項
select 語(yǔ)句
union選項:與select選項完全一致,union選項默認的是distinct(去重)

注意
1. union使用的時(shí)候,必須保證多條查詢(xún)語(yǔ)句之間的字段數要求一致

2. union使用的時(shí)候,沒(méi)有數據的類(lèi)型的概念,只有列數相同的概念。

1. 合并不同表的數據(數據量太大,導致一張表存不下),往往是用于數據的統計
2. 對同一張表進(jìn)行數據的不同形式的展示。
需求:將學(xué)生表中1班的學(xué)生按照年齡升序排序,2班的學(xué)生按照年齡降序排序
(select 語(yǔ)句 order by子句)
union
(select 語(yǔ)句 order by 子句);
在union中使用order by必須搭配limit
(select 語(yǔ)句 order by子句 limit子句)
union
(select 語(yǔ)句 order by 子句 limit子句);

需求:
1. 獲取1班的所有學(xué)生
select * from student where c_id = 1;
2. 獲取1班的所有學(xué)生,還要獲取對應的班級信息
連接查詢(xún):將兩個(gè)表中的數據,進(jìn)行字段上的拼接,字段數一定會(huì )增加。
連接查詢(xún)分為幾類(lèi):內連接,外連接,交叉連接,自然連接
連接關(guān)鍵字:join
左表:join關(guān)鍵字左邊的表是左表
右表:join關(guān)鍵字右邊的表是右表
select * from 表1,表2;

交叉連接:cross join

交叉連接得到的結果是笛卡爾積,所以應該盡量避免笛卡爾積出現。
內連接:左表中出現的數據,在右表中也同樣存在,那么記錄保存,如果不存在就不需要該記錄。
語(yǔ)法:
l_table [inner] join r_table on 連接條件
沒(méi)有連接條件的內連接

內連接

內連接原理

內連接的條件匹配可以使用where,on可以用where代替

外連接:以某一張表為主表,拿著(zhù)表中的所有記錄去另外的一張表中匹配,如果匹配成功,保留全部記錄,如果匹配失敗,那么未匹配成功的字段全部置空。
語(yǔ)法:
左(外)連接:左表為主表,右表為副表,l_table left [out] join r_table on 連接條件
右(外)連接:右表為主表,左表為副表,l_table right [out] join r_table on 連接條件
左連接

右連接

左連接轉右連接

需求:獲取學(xué)生以及對應的班級信息,要求只獲取1班的所有的學(xué)生

自然連接:在連接表的時(shí)候,不需要指定連接條件,系統自動(dòng)匹配。
自然連接包括:自然內連接,自然外連接
語(yǔ)法:
l_table natural [left/right] join r_table;

自然內連接
修改student表的name字段之后

自然連接在匹配之后,只會(huì )保留一個(gè)同名字段(保留的是左表)
自然外連接

內連接和外連接模擬自然連接:使用同名字段作為連接條件,并且合并同名字段。
語(yǔ)法:using(字段列表)
內連接模擬

外連接模擬

using模擬多字段自然連接

注意:實(shí)際項目開(kāi)發(fā)中,需求上的滿(mǎn)足通常是使用內連接和外連接,很少使用自然連接和交叉連接。
多表連接:與兩張表完全一樣
A join B on A.字段 = B.字段 join C on A.字段 = C.字段 …

需求:
1. 查出所有1班的學(xué)生;
select * from student where c_id =1;
2. 查出所有PHP141115班的學(xué)生
解決方案1:select * from student s left join class c on s.c_id = c.id where c.name = 'PHP141115’;
解決方案2:
找出php141115對應的班級id:select id from class where name = 'PHP141115’;
通過(guò)id找出所有該班級學(xué)生:select * from student where id = ?;
一條查詢(xún)語(yǔ)句出現在另外一條查詢(xún)語(yǔ)句的內部,這條語(yǔ)句就被稱(chēng)之為子查詢(xún)語(yǔ)句。
子查詢(xún)可以根據子查詢(xún)返回的結果以及子查詢(xún)出現的位置兩種方式進(jìn)行分類(lèi)
按結果分類(lèi):
標量子查詢(xún):子查詢(xún)返回的結果是一行一列,一個(gè)字段的某一個(gè)值
列子查詢(xún):子查詢(xún)返回的結果是一列,多行,一個(gè)字段有多個(gè)值
行子查詢(xún):子查詢(xún)返回的結果是一行多列,多行多列
表子查詢(xún):子查詢(xún)返回的結果多行多列
按照位置分類(lèi):
where子查詢(xún):子查詢(xún)出現在where條件之后
from子查詢(xún):子查詢(xún)出現在from之后
exists子查詢(xún):出現在exists之后,exists出現在where之后
子查詢(xún)返回的結果是一個(gè)標量

子查詢(xún)返回的結果是一列。
需求:獲取所有班級的所有學(xué)生,學(xué)生必須在班級中存在。
select * from student where c_id is not null; -- 無(wú)法解決
解決方案
1. 獲取所有的現有班級的id:select id from class;
2. 從學(xué)生表中查出所有數據,判斷學(xué)生的班級id是否在剛查出來(lái)的班級id中存在

集合判斷條件(理解性知識)
集合(1,2,3,4,5)
any:任意一個(gè),1 = any(集合),只要結果在集合中出現過(guò),就返回true
all:全部,必須滿(mǎn)足全部條件才返回真
some:等于其中的一部分,與any完全一致

子查詢(xún)返回的結果是一行多列
需求:找出所有班級中年齡最大,同時(shí)身高最高的學(xué)生;
行子查詢(xún)必須構建行元素:有多個(gè)字段的元素
select * from 表名 where (字段1,字段2…) =/in (select 字段1,字段2… from 表名);

表子查詢(xún)從返回結果的層面上講與行子查詢(xún)完全一樣。因為其出現的位置不是在where之后,而是在where之前,from之后。from后接數據源。
需求:求出每個(gè)班中身高最高的1個(gè)學(xué)生。

表子查詢(xún)出現的原因:因為某些時(shí)候,希望order by在group by之前先執行。
視圖:視圖是一張虛擬表,存在表結構,但是沒(méi)有數據。
視圖關(guān)鍵字:view
語(yǔ)法:
create view 視圖名字 as select語(yǔ)句;

視圖創(chuàng )建之后發(fā)生了什么?
1. 創(chuàng )建視圖結構(虛擬表)

2. 在數據庫對應的文件夾下創(chuàng )建結構文件

視圖是虛擬表,只有結構,沒(méi)有數據。
1. 視圖可以像表一樣的查看
show tables/show create table/desc 視圖名

2. 可以通過(guò)視圖查看創(chuàng )建語(yǔ)句的方法
show create view 視圖名;

3. 查看視圖數據:與查看表完全一致

視圖不保存數據:數據的來(lái)源指的是當視圖被調用的時(shí)候,系統會(huì )自動(dòng)調用視圖的創(chuàng )建語(yǔ)句中的select語(yǔ)句去執行。

視圖修改的本質(zhì)是修改視圖的數據來(lái)源。
語(yǔ)法
alter view 視圖名字 as select語(yǔ)句;

語(yǔ)法
drop view 視圖名字;

1. 節省查詢(xún)語(yǔ)句的長(cháng)度

2. 對外提供訪(fǎng)問(wèn)接口
保證數據表(基表)的數據安全性。
視圖能夠選擇性的從基表獲取數據,并提供給外部。
3. 對外友好性
視圖能夠對外提供不同的數據信息。(不同的接口定義不同的視圖)
視圖可以為基表進(jìn)行數據的增刪改操作,必須滿(mǎn)足以下條件
視圖新增數據
1. 視圖的數據來(lái)源(基表)只能有一個(gè)

多表視圖不能插入數據

2. 視圖中的所有字段,必須包含了基表中不為空或者沒(méi)有默認值的全部字段。

更新數據:基本沒(méi)有限制
單表視圖更新

多表視圖更新

刪除數據:與插入數據條件一致,只有單表視圖可以刪除,多表不能刪除
單表視圖刪除

多表視圖刪除

視圖在執行的過(guò)程中(視圖被查詢(xún)),到底是如何去執行視圖對應的查詢(xún)語(yǔ)句。
視圖算法分為三種:
合并:merged,先將視圖的SQL查詢(xún)與與外部的查詢(xún)語(yǔ)句進(jìn)行語(yǔ)法合并
臨時(shí)表:temptable,先執行視圖里面的查詢(xún)語(yǔ)句,結果變成一個(gè)臨時(shí)表
未定義:undefined,系統自己判斷到底使用合并還是臨時(shí)表,默認的

算法指定語(yǔ)法
create view algorithm = 算法 視圖名字 as select語(yǔ)句

聯(lián)系客服