mysql 3_mysql3
回顧
字段類型(列類型): 數(shù)值型, 時(shí)間日期型和字符串類型
數(shù)值型: 整型和小數(shù)型(浮點(diǎn)型和定點(diǎn)型)
時(shí)間日期型: datetime, date,time,timestamp, year
字符串類型: 定長, 變長, 文件字符串(text和blob), 枚舉和集合
Mysql記錄長度: 65535個(gè)字節(jié), varchar達(dá)不到理論長度, NULL占用一個(gè)字節(jié), text文本不占用記錄長度(但是本身占據(jù)十個(gè)字節(jié))
字段屬性: 空屬性, 列描述, 默認(rèn)值
字段屬性
主鍵, 唯一鍵和自增長.
主鍵
主鍵: primary
key,主要的鍵. 一張表只能有一個(gè)字段可以使用對(duì)應(yīng)的鍵, 用來唯一的約束該字段里面的數(shù)據(jù), 不能重復(fù): 這種稱之為主鍵.
一張表只能有最多一個(gè)主鍵.
增加主鍵
SQL操作中有多種方式可以給表增加主鍵: 大體分為三種.
方案1: 在創(chuàng)建表的時(shí)候,直接在字段之后,跟primary key關(guān)鍵字(主鍵本身不允許為空)
優(yōu)點(diǎn): 非常直接; 缺點(diǎn): 只能使用一個(gè)字段作為主鍵
方案2: 在創(chuàng)建表的時(shí)候, 在所有的字段之后, 使用primary key(主鍵字段列表)來創(chuàng)建主鍵(如果有多個(gè)字段作為主鍵,可以是復(fù)合主鍵)
方案3: 當(dāng)表已經(jīng)創(chuàng)建好之后, 額外追加主鍵: 可以通過修改表字段屬性, 也可以直接追加.
Alter table 表名? add primary key(字段列表);
前提: 表中字段對(duì)應(yīng)的數(shù)據(jù)本身是獨(dú)立的(不重復(fù))
主鍵約束
主鍵對(duì)應(yīng)的字段中的數(shù)據(jù)不允許重復(fù): 一旦重復(fù),數(shù)據(jù)操作失敗(增和改)
更新主鍵 & 刪除主鍵
沒有辦法更新主鍵: 主鍵必須先刪除,才能增加.
Alter table 表名 drop primary key;
主鍵分類
在實(shí)際創(chuàng)建表的過程中, 很少使用真實(shí)業(yè)務(wù)數(shù)據(jù)作為主鍵字段(業(yè)務(wù)主鍵,如學(xué)號(hào),課程號(hào)); 大部分的時(shí)候是使用邏輯性的字段(字段沒有業(yè)務(wù)含義,值是什么都沒有關(guān)系), 將這種字段主鍵稱之為邏輯主鍵.
Create table my_student(
Id int primary key auto_increment comment ‘邏輯主鍵: 自增長’,??? -- 邏輯主鍵
Number char(10) not null? comment ‘學(xué)號(hào)’,
Name varchar(10) not null
)
自動(dòng)增長
自增長: 當(dāng)對(duì)應(yīng)的字段,不給值,或者說給默認(rèn)值,或者給NULL的時(shí)候, 會(huì)自動(dòng)的被系統(tǒng)觸發(fā), 系統(tǒng)會(huì)從當(dāng)前字段中已有的最大值再進(jìn)行+1操作,得到一個(gè)新的在不同的字段.
自增長通常是跟主鍵搭配.
新增自增長
自增長特點(diǎn):
auto_increment
任何一個(gè)字段要做自增長必須前提是本身是一個(gè)索引(key一欄有值)
自增長字段必須是數(shù)字(整型)
一張表最多只能有一個(gè)自增長
自增長使用
當(dāng)自增長被給定的值為NULL或者默認(rèn)值的時(shí)候會(huì)觸發(fā)自動(dòng)增長.
自增長如果對(duì)應(yīng)的字段輸入了值,那么自增長失效: 但是下一次還是能夠正確的自增長(從最大值+1)
如何確定下一次是什么自增長呢?
可以通過查看表創(chuàng)建語句看到.
修改自增長
自增長如果是涉及到字段改變:
必須先刪除自增長,后增加(一張表只能有一個(gè)自增長)
修改當(dāng)前自增長已經(jīng)存在的值:
修改只能比當(dāng)前已有的自增長的最大值大,不能小(小不生效)
Alter table 表名 auto_increment? = 值;
向上修改可以
思考: 為什么自增長是從1開始?為什么每次都是自增1呢?
所有系統(tǒng)的變現(xiàn)(如字符集,校對(duì)集)都是由系統(tǒng)內(nèi)部的變量進(jìn)行控制的.
查看自增長對(duì)應(yīng)的變量:
show variables like ‘a(chǎn)uto_increment%’;
可以修改變量實(shí)現(xiàn)不同的效果:
修改是對(duì)整個(gè)數(shù)據(jù)修改,而不是單張表: (修改是會(huì)話級(jí))
Set auto_increment_increment = 5; -- 一次自增5
測試效果: 自動(dòng)使用自增長
刪除自增長
自增長是字段的一個(gè)屬性: 可以通過modify來進(jìn)行修改(保證字段沒有auto_increment即可)
Alter table 表名 modify 字段 類型;
唯一鍵
一張表往往有很多字段需要具有唯一性,數(shù)據(jù)不能重復(fù): 但是一張表中只能有一個(gè)主鍵: 唯一鍵(unique key)就可以解決表中有多個(gè)字段需要唯一性約束的問題.
唯一鍵的本質(zhì)與主鍵差不多: 唯一鍵默認(rèn)的允許自動(dòng)為空,而且可以多個(gè)為空(空字段不參與唯一性比較)
增加唯一鍵
基本與主鍵差不多: 三種方案
方案1: 在創(chuàng)建表的時(shí)候,字段之后直接跟unique/ unique key
方案2: 在所有的字段之后增加unique key(字段列表); -- 復(fù)合唯一鍵
方案3: 在創(chuàng)建表之后增加唯一鍵
唯一鍵約束
唯一鍵與主鍵本質(zhì)相同: 唯一的區(qū)別就是唯一鍵默認(rèn)允許為空,而且是多個(gè)為空.
如果唯一鍵也不允許為空: 與主鍵的約束作用是一致的.
更新唯一鍵 & 刪除唯一鍵
更新唯一鍵: 先刪除后新增(唯一鍵可以有多個(gè): 可以不刪除).
刪除唯一鍵
Alter table 表名 drop unique key; -- 錯(cuò)誤: 唯一鍵有多個(gè)
Alter table 表名 drop index 索引名字; -- 唯一鍵默認(rèn)的使用字段名作為索引名字
索引
幾乎所有的索引都是建立在字段之上.
索引: 系統(tǒng)根據(jù)某種算法, 將已有的數(shù)據(jù)(未來可能新增的數(shù)據(jù)),單獨(dú)建立一個(gè)文件: 文件能夠?qū)崿F(xiàn)快速的匹配數(shù)據(jù), 并且能夠快速的找到對(duì)應(yīng)表中的記錄.
索引的意義
提升查詢數(shù)據(jù)的效率
約束數(shù)據(jù)的有效性(唯一性等)
增加索引的前提條件: 索引本身會(huì)產(chǎn)生索引文件(有時(shí)候有可能比數(shù)據(jù)文件還大) ,會(huì)非常耗費(fèi)磁盤空間.
如果某個(gè)字段需要作為查詢的條件經(jīng)常使用, 那么可以使用索引(一定會(huì)想辦法增加);
如果某個(gè)字段需要進(jìn)行數(shù)據(jù)的有效性約束, 也可能使用索引(主鍵,唯一鍵)
Mysql中提供了多種索引
主鍵索引: primary key
唯一索引: unique key
全文索引: fulltext index
普通索引: index
全文索引: 針對(duì)文章內(nèi)部的關(guān)鍵字進(jìn)行索引
全文索引最大的問題: 在于如何確定關(guān)鍵字
英文很容易: 英文單詞與單詞之間有空格
中文很難: 沒有空格, 而且中文可以各種隨意組合(分詞: sphinx)
關(guān)系
將實(shí)體與實(shí)體的關(guān)系, 反應(yīng)到最終數(shù)據(jù)庫表的設(shè)計(jì)上來: 將關(guān)系分成三種: 一對(duì)一, 一對(duì)多(多對(duì)一)和多對(duì)多.
所有的關(guān)系都是指的表與表之間的關(guān)系.
一對(duì)一
一對(duì)一: 一張表的一條記錄一定只能與另外一張表的一條記錄進(jìn)行對(duì)應(yīng); 反之亦然.
學(xué)生表: 姓名,性別,年齡,身高,體重,婚姻狀況, 籍貫, 家庭住址,緊急聯(lián)系人
Id(P)
姓名
性別
年齡
體重
身高
婚姻
籍貫
住址
聯(lián)系人
表設(shè)計(jì)成以上這種形式: 符合要求. 其中姓名,性別,年齡,身高,體重屬于常用數(shù)據(jù); 但是婚姻,籍貫,住址和聯(lián)系人屬于不常用數(shù)據(jù).
如果每次查詢都是查詢所有數(shù)據(jù),不常用的數(shù)據(jù)就會(huì)影響效率, 實(shí)際又不用.
解決方案: 將常用的和不常用的信息分離存儲(chǔ),分成兩張表
常用信息表
Id(P)
姓名
性別
年齡
體重
身高
1
不常用信息表: 保證不常用信息與常用信息一定能夠?qū)?yīng)上: 找一個(gè)具有唯一性(確定記錄)的字段來共同連接兩張表
Id(P)
婚姻
籍貫
住址
聯(lián)系人
2
1
一個(gè)常用表中的一條記錄: 永遠(yuǎn)只能在一張不常用表中匹配一條記錄;反過來,一個(gè)不常用表中的一條記錄在常用表中也只能匹配一條記錄: 一對(duì)一的關(guān)系
一對(duì)多
一對(duì)多: 一張表中有一條記錄可以對(duì)應(yīng)另外一張表中的多條記錄; 但是返回過, 另外一張表的一條記錄只能對(duì)應(yīng)第一張表的一條記錄. 這種關(guān)系就是一對(duì)多或者多對(duì)一.
母親與孩子的關(guān)系: 母親,孩子兩個(gè)實(shí)體
媽媽表
ID(P)
名字
年齡
性別
孩子表
ID(P)
名字
年齡
性別
以上關(guān)系: 一個(gè)媽媽可以在孩子表中找到多條記錄(也有可能是一條); 但是一個(gè)孩子只能找到一個(gè)媽媽: 是一種典型的一對(duì)多的關(guān)系.
但是以上設(shè)計(jì): 解決了實(shí)體的設(shè)計(jì)表問題, 但是沒有解決關(guān)系問題: 孩子找不出媽,媽也找不到孩子.
解決方案: 在某一張表中增加一個(gè)字段,能夠找到另外一張表的中記錄: 應(yīng)該在孩子表中增加一個(gè)字段指向媽媽表: 因?yàn)楹⒆颖淼挠涗浿荒芷ヅ涞揭粭l媽媽表的記錄.
媽媽表
ID(P)
名字
年齡
性別
孩子表
ID(P)
名字
年齡
性別
媽媽ID
媽媽表主鍵
多對(duì)多
多對(duì)多: 一張表中(A)的一條記錄能夠?qū)?yīng)另外一張表(B)中的多條記錄; 同時(shí)B表中的一條記錄也能對(duì)應(yīng)A表中的多條記錄: 多對(duì)多的關(guān)系
老師教學(xué): 老師和學(xué)生
老師表
T_ID(P)
姓名
性別
1
A
男
2
B
女
學(xué)生表
S_ID(P)
姓名
性別
1
張三
男
2
小芳
女
以上設(shè)計(jì)方案: 實(shí)現(xiàn)了實(shí)體的設(shè)計(jì), 但是沒有維護(hù)實(shí)體的關(guān)系.
一個(gè)老師教過多個(gè)學(xué)生; 一個(gè)學(xué)生也被多個(gè)老師教過.
解決方案: 在學(xué)生表中增加老師字段: 不管在哪張表中增加字段, 都會(huì)出現(xiàn)一個(gè)問題: 該字段要保存多個(gè)數(shù)據(jù), 而且是與其他表有關(guān)系的字段, 不符合表設(shè)計(jì)規(guī)范: 增加一張新表: 專門維護(hù)兩張表之間的關(guān)系
老師表
T_ID(P)
姓名
性別
1
A
男
2
B
女
學(xué)生表
S_ID(P)
姓名
性別
1
張三
男
2
小芳
女
中間關(guān)系表: 老師與學(xué)生的關(guān)系
ID
T_ID(老師)
S_ID(學(xué)生)
1
1
1
2
1
2
3
2
1
4
增加中間表之后: 中間表與老師表形成了一對(duì)多的關(guān)系: 而且中間表是多表,維護(hù)了能夠唯一找到一表的關(guān)系; 同樣的,學(xué)生表與中間表也是一個(gè)一對(duì)多的關(guān)系: 一對(duì)多的關(guān)系可以匹配到關(guān)聯(lián)表之間的數(shù)據(jù).
學(xué)生找老師: 找出學(xué)生id -> 中間表尋找匹配記錄(多條) -> 老師表匹配(一條)
老師找學(xué)生: 找出老師id -> 中間表尋找匹配記錄(多條) -> 學(xué)生表匹配(一條)
范式
范式: Normal
Format, 是一種離散數(shù)學(xué)中的知識(shí), 是為了解決一種數(shù)據(jù)的存儲(chǔ)與優(yōu)化的問題: 保存數(shù)據(jù)的存儲(chǔ)之后, 凡是能夠通過關(guān)系尋找出來的數(shù)據(jù),堅(jiān)決不再重復(fù)存儲(chǔ): 終極目標(biāo)是為了減少數(shù)據(jù)的冗余.
范式: 是一種分層結(jié)構(gòu)的規(guī)范, 分為六層: 每一次層都比上一層更加嚴(yán)格: 若要滿足下一層范式,前提是滿足上一層范式.
六層范式:
1NF,2NF,3NF...6NF, 1NF是最底層,要求最低;6NF最高層,最嚴(yán)格.
Mysql屬于關(guān)系型數(shù)據(jù)庫: 有空間浪費(fèi): 也是致力于節(jié)省存儲(chǔ)空間: 與范式所有解決的問題不謀而合: 在設(shè)計(jì)數(shù)據(jù)庫的時(shí)候, 會(huì)利用到范式來指導(dǎo)設(shè)計(jì).
但是數(shù)據(jù)庫不單是要解決空間問題,要保證效率問題: 范式只為解決空間問題, 所以數(shù)據(jù)庫的設(shè)計(jì)又不可能完全按照范式的要求實(shí)現(xiàn): 一般情況下,只有前三種范式需要滿足.
范式在數(shù)據(jù)庫的設(shè)計(jì)當(dāng)中是有指導(dǎo)意義: 但是不是強(qiáng)制規(guī)范.
1NF
第一范式: 在設(shè)計(jì)表存儲(chǔ)數(shù)據(jù)的時(shí)候, 如果表中設(shè)計(jì)的字段存儲(chǔ)的數(shù)據(jù),在取出來使用之前還需要額外的處理(拆分),那么說表的設(shè)計(jì)不滿足第一范式: 第一范式要求字段的數(shù)據(jù)具有原子性: 不可再分.
講師代課表
講師
性別
班級(jí)
教室
代課時(shí)間
代課時(shí)間(開始,結(jié)束)
朱元璋
Male
php0226
D302
30天
2014-02-27,2014-05-05
朱元璋
Male
php0320
B206
30天
2014-03-21,2014-05-30
李世民
Male
php0320
B206
15天
2014-06-01,2014-06-20
上表設(shè)計(jì)不存在問題: 但是如果需求是將數(shù)據(jù)查出來之后,要求顯示一個(gè)老師從什么時(shí)候開始上課,到什么時(shí)候節(jié)課: 需要將代課時(shí)間進(jìn)行拆分: 不符合1NF, 數(shù)據(jù)不具有原子性, 可以再拆分.
解決方案: 將代課時(shí)間拆分成兩個(gè)字段就解決問題.
2NF
第二范式: 在數(shù)據(jù)表設(shè)計(jì)的過程中,如果有復(fù)合主鍵(多字段主鍵), 且表中有字段并不是由整個(gè)主鍵來確定, 而是依賴主鍵中的某個(gè)字段(主鍵的部分): 存在字段依賴主鍵的部分的問題, 稱之為部分依賴: 第二范式就是要解決表設(shè)計(jì)不允許出現(xiàn)部分依賴.
講師帶課表
以上表中: 因?yàn)橹v師沒有辦法作為獨(dú)立主鍵, 需要結(jié)合班級(jí)才能作為主鍵(復(fù)合主鍵: 一個(gè)老師在一個(gè)班永遠(yuǎn)只帶一個(gè)階段的課): 代課時(shí)間,開始和結(jié)束字段都與當(dāng)前的代課主鍵(講師和班級(jí)): 但是性別并不依賴班級(jí), 教室不依賴講師: 性別只依賴講師, 教室只依賴班級(jí): 出現(xiàn)了性別和教室依賴主鍵中的一部分: 部分依賴.不符合第二范式.
解決方案1: 可以將性別與講師單獨(dú)成表, 班級(jí)與教室也單獨(dú)成表.
解決方案2: 取消復(fù)合主鍵, 使用邏輯主鍵
ID = 講師 + 班級(jí)(業(yè)務(wù)邏輯約束: 復(fù)合唯一鍵)
3NF
要滿足第三范式,必須滿足第二范式.
第三范式: 理論上講,應(yīng)該一張表中的所有字段都應(yīng)該直接依賴主鍵(邏輯主鍵: 代表的是業(yè)務(wù)主鍵), 如果表設(shè)計(jì)中存在一個(gè)字段, 并不直接依賴主鍵,而是通過某個(gè)非主鍵字段依賴,最終實(shí)現(xiàn)依賴主鍵: 把這種不是直接依賴主鍵,而是依賴非主鍵字段的依賴關(guān)系稱之為傳遞依賴. 第三范式就是要解決傳遞依賴的問題.
講師帶課表
以上設(shè)計(jì)方案中: 性別依賴講師存在, 講師依賴主鍵; 教室依賴班級(jí),班級(jí)依賴主鍵: 性別和教室都存在傳遞依賴.
解決方案: 將存在傳遞依賴的字段,以及依賴的字段本身單獨(dú)取出,形成一個(gè)單獨(dú)的表, 然后在需要對(duì)應(yīng)的信息的時(shí)候, 使用對(duì)應(yīng)的實(shí)體表的主鍵加進(jìn)來.
講師代課表
講師表??????????????????????????????????????????????????????????? 班級(jí)表
講師表: ID = 講師??????????????????????????????????????? 班級(jí)表中: ID = 班級(jí)
逆規(guī)范化
有時(shí)候, 在設(shè)計(jì)表的時(shí)候,如果一張表中有幾個(gè)字段是需要從另外的表中去獲取信息. 理論上講, 的確可以獲取到想要的數(shù)據(jù), 但是就是效率低一點(diǎn). 會(huì)刻意的在某些表中,不去保存另外表的主鍵(邏輯主鍵), 而是直接保存想要的數(shù)據(jù)信息: 這樣一來,在查詢數(shù)據(jù)的時(shí)候, 一張表可以直接提供數(shù)據(jù), 而不需要多表查詢(效率低), 但是會(huì)導(dǎo)致數(shù)據(jù)冗余增加.
如講師代課信息表
逆規(guī)范化: 磁盤利用率與效率的對(duì)抗
數(shù)據(jù)高級(jí)操作
數(shù)據(jù)操作: 增刪改查
新增數(shù)據(jù)
基本語法
Insert into 表名 [(字段列表)] values
(值列表);
在數(shù)據(jù)插入的時(shí)候, 假設(shè)主鍵對(duì)應(yīng)的值已經(jīng)存在: 插入一定會(huì)失敗!
主鍵沖突
當(dāng)主鍵存在沖突的時(shí)候(Duplicate
key),可以選擇性的進(jìn)行處理: 更新和替換
主鍵沖突: 更新操作
Insert into 表名[(字段列表:包含主鍵)] values(值列表) on duplicate key update 字段 = 新值;
主鍵沖突: 替換
Replace into 表名 [(字段列表:包含主鍵)] values(值列表);
蠕蟲復(fù)制
蠕蟲復(fù)制: 從已有的數(shù)據(jù)中去獲取數(shù)據(jù),然后將數(shù)據(jù)又進(jìn)行新增操作: 數(shù)據(jù)成倍的增加.
表創(chuàng)建高級(jí)操作: 從已有表創(chuàng)建新表(復(fù)制表結(jié)構(gòu))
Create table 表名 like 數(shù)據(jù)庫.表名;
蠕蟲復(fù)制: 先查出數(shù)據(jù), 然后將查出的數(shù)據(jù)新增一遍
Insert into 表名[(字段列表)] select 字段列表/* from 數(shù)據(jù)表名;
蠕蟲復(fù)制的意義
從已有表拷貝數(shù)據(jù)到新表中
可以迅速的讓表中的數(shù)據(jù)膨脹到一定的數(shù)量級(jí): 測試表的壓力以及效率
更新數(shù)據(jù)
基本語法
Update 表名 set 字段 = 值 [where條件];
高級(jí)新增語法
Update 表名 set 字段 = 值 [where條件] [limit 更新數(shù)量];
刪除數(shù)據(jù)
與更新類似: 可以通過limit來限制數(shù)量
Delete from 表名 [where條件] [limit 數(shù)量];
刪除: 如果表中存在主鍵自增長,那么當(dāng)刪除之后, 自增長不會(huì)還原
思路: 數(shù)據(jù)的刪除是不會(huì)改變表結(jié)構(gòu), 只能刪除表后重建表
Truncate 表名;????? -- 先刪除改變,后新增改變
查詢數(shù)據(jù)
基本語法
Select 字段列表/* from 表名 [where條件];
完整語法
Select [select選項(xiàng)] 字段列表[字段別名]/* from 數(shù)據(jù)源 [where條件子句] [group by子句] [having子句] [order by子句] [limit 子句];
Select選項(xiàng)
Select選項(xiàng): select對(duì)查出來的結(jié)果的處理方式
All: 默認(rèn)的,保留所有的結(jié)果
Distinct: 去重, 查出來的結(jié)果,將重復(fù)給去除(所有字段都相同)
字段別名
字段別名: 當(dāng)數(shù)據(jù)進(jìn)行查詢出來的時(shí)候, 有時(shí)候名字并一定就滿足需求(多表查詢的時(shí)候, 會(huì)有同名字段). 需要對(duì)字段名進(jìn)行重命名: 別名
語法
字段名 [as] 別名;
數(shù)據(jù)源
數(shù)據(jù)源: 數(shù)據(jù)的來源, 關(guān)系型數(shù)據(jù)庫的來源都是數(shù)據(jù)表: 本質(zhì)上只要保證數(shù)據(jù)類似二維表,最終都可以作為數(shù)據(jù)源.
數(shù)據(jù)源分為多種: 單表數(shù)據(jù)源, 多表數(shù)據(jù)源, 查詢語句
單表數(shù)據(jù)源: select
* from 表名;
多表數(shù)據(jù)源: select*
from 表名1,表名2...;
從一張表中取出一條記錄,去另外一張表中匹配所有記錄,而且全部保留:(記錄數(shù)和字段數(shù)),將這種結(jié)果成為: 笛卡爾積(交叉連接): 笛卡爾積沒什么卵用, 所以應(yīng)該盡量避免.
子查詢: 數(shù)據(jù)的來源是一條查詢語句(查詢語句的結(jié)果是二維表)
Select * from (select 語句) as 表名;
Where子句
Where子句: 用來判斷數(shù)據(jù),篩選數(shù)據(jù).
Where子句返回結(jié)果: 0或者1, 0代表false,1代表true.
判斷條件:
比較運(yùn)算符: >, =, <= ,!= ,<>, =, like, between and,
in/not in
邏輯運(yùn)算符: &&(and), ||(or), !(not)
Where原理: where是唯一一個(gè)直接從磁盤獲取數(shù)據(jù)的時(shí)候就開始判斷的條件: 從磁盤取出一條記錄, 開始進(jìn)行where判斷: 判斷的結(jié)果如果成立保存到內(nèi)存;如果失敗直接放棄.
條件查詢1: 要求找出學(xué)生id為1或者3或者5的學(xué)生
條件查詢2: 查出區(qū)間落在180,190身高之間的學(xué)生:
Between本身是閉區(qū)間; between左邊的值必須小于或者等于右邊的值
Group by子句
Group by:分組的意思, 根據(jù)某個(gè)字段進(jìn)行分組(相同的放一組,不同的分到不同的組)
基本語法:
group? by 字段名;
分組的意思: 是為了統(tǒng)計(jì)數(shù)據(jù)(按組統(tǒng)計(jì): 按分組字段進(jìn)行數(shù)據(jù)統(tǒng)計(jì))
SQL提供了一系列統(tǒng)計(jì)函數(shù)
Count(): 統(tǒng)計(jì)分組后的記錄數(shù): 每一組有多少記錄
Max():??? 統(tǒng)計(jì)每組中最大的值
Min(): 統(tǒng)計(jì)最小值
Avg(): 統(tǒng)計(jì)平均值
Sum(): 統(tǒng)計(jì)和
Count函數(shù): 里面可以使用兩種參數(shù): *代表統(tǒng)計(jì)記錄,字段名代表統(tǒng)計(jì)對(duì)應(yīng)的字段(NULL不統(tǒng)計(jì))
分組會(huì)自動(dòng)排序: 根據(jù)分組字段:默認(rèn)升序
Group by 字段 [asc|desc];??? -- 對(duì)分組的結(jié)果然后合并之后的整個(gè)結(jié)果進(jìn)行排序
多字段分組: 先根據(jù)一個(gè)字段進(jìn)行分組,然后對(duì)分組后的結(jié)果再次按照其他字段進(jìn)行分組
有一個(gè)函數(shù): 可以對(duì)分組的結(jié)果中的某個(gè)字段進(jìn)行字符串連接(保留該組所有的某個(gè)字段): group_concat(字段);
回溯統(tǒng)計(jì): with
rollup: 任何一個(gè)分組后都會(huì)有一個(gè)小組,
最后都需要向上級(jí)分組進(jìn)行匯報(bào)統(tǒng)計(jì): 根據(jù)當(dāng)前分組的字段. 這就是回溯統(tǒng)計(jì): 回溯統(tǒng)計(jì)的時(shí)候會(huì)將分組字段置空.
多字段回溯: 考慮第一層分組會(huì)有此回溯: 第二次分組要看第一次分組的組數(shù), 組數(shù)是多少,回溯就是多少,然后加上第一層回溯即可.
Having子句
Having子句: 與where子句一樣: 進(jìn)行條件判斷的.
Where是針對(duì)磁盤數(shù)據(jù)進(jìn)行判斷: 進(jìn)入到內(nèi)存之后,會(huì)進(jìn)行分組操作: 分組結(jié)果就需要having來處理.
Having能做where能做的幾乎所有事情, 但是where卻不能做having能做的很多事情.
分組統(tǒng)計(jì)的結(jié)果或者說統(tǒng)計(jì)函數(shù)都只有having能夠使用.
Having能夠使用字段別名: where不能: where是從磁盤取數(shù)據(jù),而名字只可能是字段名: 別名是在字段進(jìn)入到內(nèi)存后才會(huì)產(chǎn)生.
Order by子句
Order by: 排序, 根據(jù)某個(gè)字段進(jìn)行升序或者降序排序, 依賴校對(duì)集.
使用基本語法
Order by 字段名 [asc|desc]; -- asc是升序(默認(rèn)的),desc是降序
排序可以進(jìn)行多字段排序: 先根據(jù)某個(gè)字段進(jìn)行排序, 然后排序好的內(nèi)部,再按照某個(gè)數(shù)據(jù)進(jìn)行再次排序:
Limit子句
Limit子句是一種限制結(jié)果的語句: 限制數(shù)量.
Limit有兩種使用方式
方案1: 只用來限制長度(數(shù)據(jù)量): limit 數(shù)據(jù)量;
方案2: 限制起始位置,限制數(shù)量: limit 起始位置,長度;
Limit方案2主要用來實(shí)現(xiàn)數(shù)據(jù)的分頁: 為用戶節(jié)省時(shí)間,提交服務(wù)器的響應(yīng)效率, 減少資源的浪費(fèi).
對(duì)于用戶來講: 可以點(diǎn)擊的分頁按鈕: 1,2,3,4
對(duì)于服務(wù)器來講: 根據(jù)用戶選擇的頁碼來獲取不同的數(shù)據(jù): limit offset,length;
Length: 每頁顯示的數(shù)據(jù)量: 基本不變
Offset: offset = (頁碼 - 1) * 每頁顯示量
總結(jié)
以上是生活随笔為你收集整理的mysql 3_mysql3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 8.0.12解压版安装教程_
- 下一篇: php后端mysql,【后端开发】PHP