mysql學習之路_高級數據操作
關系
將實體與實體的關系,反應到最終數據表的設計上來,將關系分為三種,一對多,多對多,多對多。
所有關系都是表與表之間的關系。
一對一:
一張表的一條記錄一定只對應另外一張表的一條記錄,反之亦然。
例
Id |
姓名 |
性別 |
年齡 |
電話號碼 |
1 |
張三 |
男 |
23 |
13320848263 |
一對多
一張表中有一條記錄,對應另一張表多條記錄但是反過來,另一張表的一條記錄只能對應這張表的一條記錄。
例母親與孩子的關系
多對多
一張表中的一條記錄對應另外一張表的多條記錄,同時另一張表的一條記錄對應另外一張表的多條記錄。
範式
Normal format
是一找種離散型數學中的知識,為解決數據存儲的與優化問題,
數據保存以後,凡是能夠通過關系找出來的數據,堅決不在重復存儲:終極目標是減少數據的冗余。
範式是一種分層的結構規範,分為六層,每一層都比上一層嚴。若要滿足下一範式,前提是滿足上一層範式。
六層範式:1NF,2NF,3NF.4NF,5NF,6NF最高
Mysql屬於關系型數據庫有空間浪費:致力於節省存儲空間,與範式所解決的問題不謀而活:在設計數據庫,會利用範式來指導設計,但是數據不單是解決空間問題,要保護效率問題,範式只為解決空間問題,所以數據庫的設計又不可能完全按照範式要求實現,一般只有前三種範式需求滿足。
範式在數據庫中有指導意義:但是不強制規範。
第一範式:1NF
在設計表存儲數據的時候,如果表中設計的字段存儲的數據,再取出來的使用之前還需要額外的處理(拆分)那麽說表的設計不滿足第一範式
第二範式:2NF
再數據表設計過程中,如果有復合主鍵(多字段主鍵),且表中有字段並不是由整個主鍵來確定,而是依靠主鍵的某個字段(主鍵的一部分)=>存在字段約束主鍵的部分問題,稱之為部分依賴=>第二範式就是要解決表中不允許出現部分依賴。
取消復合主鍵,使用邏輯主鍵。
第三範式:3NF
要滿足第三範式,必須滿足第二範式。
第三範式:理論上講,y應該一張表中所有字段都應該有直接依賴主鍵(邏輯主鍵代表業務主鍵),如果表設計中存在一個字段,並不直接依賴主鍵而是通過某個非主鍵字段依賴,最終實現依賴主鍵。把這種不是直接依賴主鍵而是依賴非主鍵字段的依賴關系稱之為依賴傳遞
逆規範化
磁盤利用率與效率的對抗,有時候再設計表的時候如果一張表中有就幾個字段需要從別的表中去獲取信息,理論上講的確可以獲得想要的數據,但是效率低一點,會刻意的在某些表中,不去保存外表的主鍵(邏輯主鍵)而是直接保存想要的數據信息這樣一來在查詢數據的時候,一張表可以直接提供數據,而不需要多表查詢(效率低)。
數據的高級操作:
數據的操作:增刪查改。
高級新增數據
Insert into 表名(字段列表) values (值列表);
在數據插入的時候,假設主鍵對應的值已經存在,插入一定會失敗。
主鍵沖突:
當主鍵存在沖突的時候(Duplicate key)
可以選擇性進行處理:更新和替換
高級操作更新:
Insert into 表名 [field主鍵] values (值列表) on duplicate key update 字段=新值;
主鍵沖突例子:insert into my_sql values (‘php’,’B101’);
更新:insert into my_sql values (‘php’,B101’) on duplicate key update room =’B102’;
替換
Replace into 表名[字段主鍵] values (值列表)
例:replace into my_sql values (‘Java’,’102’);
蠕蟲復制:
蠕蟲復制:從已有的數據表中獲取數據,然後將數據又進行新增操作,數據成部的增加。
表創建高級操作:從已有表創建新表(復制表結構)
Create table 表名 like 數據庫.表名;
蠕蟲復制:先查出數據,然後再將查出的數據新增n遍
Insert into 表名(字段) select 字段列表/* from 數據表名;;
蠕蟲復制的意義:
1,從已有表拷貝數據到新表中
2,可以迅速讓表中數據膨脹到一定的數量級;測試表的壓極效率;
高級更新數據
Update
Update 表名 set 字段 =值[where條件];
高級新增語法
Update 表名 set 字段 =值[where條件][limit 更新數量];
例:update my_copy set name =’c’ where name =’a’ limit =3;
刪除數據與更新類似
Delete from表名 [where條件][limit 數量];
例:delete from my_copy where name =’a’ limit=3;
刪除:如果表中存在主鍵自增長,那麽當刪除之後自增長不會還原。
思路:數據的刪除是不會改變表結構,只能刪除表後重建
Truncate 表名; 先刪除改變後新增改變
清空表,重置自增長。
查詢數據
Select 字段列表/* from表名 [where條件];
完整語法:
Select [select選項] 字段列表 [字段別名] /* from數據源 [where條件子句] [group by 子句] [ having 子句] [order by 子句] [limit 子句];
select選項
Select對查詢出來的結果處理方式
All:默認的保留所有結果。
Distinct:去重,查出來的結果,將重復的結構去除(所有字段相同)。
字段別名
當數據查詢出來以後,有時候名字不一定就滿足需求(多表查詢的時候,會有同名的字段)
就需要對字段名進行重命名:別名:字段名 [as] 別名;
數據源
數據源:數據的來源,關系型數據庫的來源都是數據表,本質上可以保證數據類似二維表,最終都可以作為數據源,
數據源分為多種:單標數據源,多表數據源,查詢語句。
單標數據源
Select * from 表名;
多表數據源
Select *from 表名1,表名2.......;
從一張表中取出一條記錄,去另外一張表中匹配所有記錄,而且全部保留(記錄數和字段數),將這種結果稱之為笛卡爾積(交叉連接)
笛卡爾積沒什麽用,應該盡量避免。
子查詢
數據的來源是一條查詢語句(查詢語句結果是二維表)
Select * from (select 語句) as 表名;
Where 子句
Where 子句,用來判斷數據,篩選數據,
Where子句會返回結果:0/1;true/false
判斷條件:運算符:<,>,<=,>=,!=,<>,like between and ,notin/in
邏輯運算符:&&(and),or
where原理
Where 是唯一一個直接從磁盤讀取數據的時候就開始判斷的條件,從磁盤取出一條記錄,開始進行where 判斷,成立保存到內存,失敗則放棄
條件查詢
要求找:
Group by 子句
分組
根據某個字段分組(同為一組)
基本語法:group by 字段名
意義:統計數據(按分組字段進行數組統計)
SQL提供了一系列統計函數
Count(c):統計分組後記錄數,每組多少記錄。
Max():最大值
MIn():最小值
Avg():平均數
Sum():求和
Count函數:裏面可以使用兩種參數,*代表統計記錄
字段名代表統計對應字段(null不統計)
分組會自動排序,根據分組字段:默認排序
Group by 字段[desc/asc] ;多分組結果然後合並之後的整個結果進行排序;
多字段分組:先根據一個字段進行分組,然後對分組厚度結果按照其他字段進行分組。
有一個函數:可以對分組結果中的某個字段進行字符串連接(保留該字段所有的字段):
Group _concat(字段)
回溯統計:with rollup :任何一個分組後都會有一個小組,最後都需要向上級分組進行匯報統計:根據當前分組字段,回溯統計的時候會將分組字段置空
多字段回溯:考慮第一層分組會有此回溯:第二次分組要看第一層分組的組數,組數是多少回溯就是多少,然後加上第一層
Having子句
與where 子句一樣;進行條件判斷的,where是對磁盤數據進行判斷,進入到內存以後經常分組操作,分組結果就需要having 來處理。
Having 能做where能做的幾乎所有事情,但是where不能做having能做的很多事情。
1) 分組統計的結果就是或者是說統計函數都只有having 能夠使用
2) Having 能夠使用做的別名,where不能=>where是從磁盤讀取數據,而名字可能是字段進入到內存後產生的。
Order by子句
Order by子句:排序,根據某個字段進行升序或者降序,排序依賴校對集。
基本語法:order by 字段名 [asc/desc]
Asc:是升序(默認的)
Desc:降序
排序可以進行多字段排序:先根據某個字段進行排序然後排序好內部。再按照某個數據進行排序。
Limit子句
Limit 子句是限制結果的語句,限制數量
Limit有兩種使用方式
方案1:只用來限制長度(數據量)
Limit 數據量;
方案2:
限制起始位置,限制數量:limit 起始位置,長度
主要用來實現數據的分頁:為當前用戶節省時間提高服務器的響應效率,減少資源的浪費。
對於用戶來講:可以點擊的分頁按鈕1,2,3,4
對於服務器來講:根據用戶選擇的頁碼來獲取不同的數據:limit offset,
Length;
Length:每頁顯示的數據量,基本不變;
Offset: offset=(頁碼-1)*每頁顯示量。
mysql學習之路_高級數據操作