1. 外鍵
定義: foreign key, 外面的鍵(鍵不在自己表中): 如果一張表中有一個字段(非主鍵)指向另外一張表的主鍵,那麼將該字段稱之爲外鍵.
1.1 增加外鍵
- 創建表的時候增加外鍵: 在所有的表字段之後,使用:
foreign key(外鍵字段) references 外部表(主鍵字段)
- 在新增表之後增加外鍵: 修改表結構
Alter table 表名 add [constraint 外鍵名字]
foreign key(外鍵字段) references 父表(主鍵字段);
1.2 修改外鍵&刪除外鍵
外鍵不可修改: 只能先刪除後新增.
刪除外鍵語法
Alter table 表名 drop foreign key 外鍵名;
-- 一張表中可以有多個外鍵,但是名字不能相同
1.3 外鍵作用
外鍵默認的作用有兩點:
- 對子表約束: 子表數據進行寫操作(增和改)的時候, 如果對應的外鍵字段在父表找不到對應的匹配: 那麼操作會失敗.(約束子表數據操作)
- 對父表約束: 父表數據進行寫操作(刪和改: 都必須涉及到主鍵本身), 如果對應的主鍵在子表中已經被數據所引用, 那麼就不允許操作
1.4 外鍵條件
- 外鍵要存在: 首先必須保證表的存儲引擎是innodb(默認的存儲引擎): 如果不是innodb存儲引擎,那麼外鍵可以創建成功,但是沒有約束效果.
- 外鍵字段的字段類型(列類型)必須與父表的主鍵類型完全一致.
- 一張表中的外鍵名字不能重複.
- 增加外鍵的字段(數據已經存在),必須保證數據與父表主鍵要求對應.
1.5 外鍵約束
外鍵約束有三種約束模式: 都是針對父表的約束
- District: 嚴格模式(默認的), 父表不能刪除或者更新一個已經被子表數據引用的記錄
- Cascade: 級聯模式: 父表的操作, 對應子表關聯的數據也跟着被刪除
- Set null: 置空模式: 父表的操作之後,子表對應的數據(外鍵字段)被置空
通常的一個合理的做法(約束模式): 刪除的時候子表置空, 更新的時候子表級聯操作
指定模式的語法
Foreign key(外鍵字段) references 父表(主鍵字段)
on delete set null on update cascade;
2. 聯合查詢
聯合查詢: 將多次查詢(多條select語句), 在記錄上進行拼接(字段不會增加)
2.1 基本語法
多條select語句構成: 每一條select語句獲取的字段數必須嚴格一致(但是字段類型無關)
Select 語句1
Union [union選項]
Select語句2...
Union選項: 與select選項一樣有兩個
- All: 保留所有(不管重複)
- Distinct: 去重(整個重複): 默認的
2.2 意義
聯合查詢的意義分爲兩種:
- 查詢同一張表,但是需求不同: 如查詢學生信息, 男生身高升序, 女生身高降序.
- 多表查詢: 多張表的結構是完全一樣的,保存的數據(結構)也是一樣的.
2.3 Order by使用
在聯合查詢中: order by不能直接使用,需要對查詢語句使用括號纔行
若要order by生效: 必須搭配limit: limit使用限定的最大數即可.
3. 子查詢
子查詢: sub query, 查詢是在某個查詢結果之上進行的.(一條select語句內部包含了另外一條select語句).
3.1 子查詢分類
子查詢有兩種分類方式:
(1)按位置分類: 子查詢(select語句)在外部查詢(select語句)中出現的位置
- From子查詢: 子查詢跟在from之後
- Where子查詢: 子查詢出現where條件中
- Exists子查詢: 子查詢出現在exists裏面
(2)按結果分類: 根據子查詢得到的數據進行分類(理論上講任何一個查詢得到的結果都可以理解爲二維表)
- 標量子查詢: 子查詢得到的結果是一行一列
- 列子查詢: 子查詢得到的結果是一列多行
- 行子查詢: 子查詢得到的結果是多列一行(多行多列)。上面幾個出現的位置都是在where之後
- 表子查詢: 子查詢得到的結果是多行多列(出現的位置是在from之後)
4. 視圖
視圖: view, 是一種有結構(有行有列)但是沒結果(結構中不真實存放數據)的虛擬表, 虛擬表的結構來源不是自己定義, 而是從對應的基表中產生(視圖的數據來源).在這裏插入代碼片
4.1 創建視圖
基本語法
Create view 視圖名字 as select語句;
-- select語句可以是普通查詢;可以是連接查詢; 可以是聯合查詢; 可以是子查詢.
視圖是一張虛擬表: 表, 表的所有查看方式都適用於視圖:
show tables [like];
desc 視圖名字;
show create table 視圖名;
4.2 查看視圖
查看”表(視圖)”的創建語句的時候可以使用view關鍵字
show create view 視圖名;
視圖一旦創建: 系統會在視圖對應的數據庫文件夾下創建一個對應的結構文件: frm文件
4.3 使用視圖
使用視圖主要是爲了查詢: 將視圖當做表一樣查詢即可.
4.4 修改視圖
視圖本身不可修改, 但是視圖的來源是可以修改的.
Alter view 視圖名字 as 新的select語句;
4.5 刪除視圖
Drop view 視圖名字;
4.6 視圖意義
- 視圖可以節省SQL語句: 將一條複雜的查詢語句使用視圖進行保存: 以後可以直接對視圖進行操作
- 數據安全: 視圖操作是主要針對查詢的, 如果對視圖結構進行處理(刪除), 不會影響基表數據(相對安全).
- 視圖往往是在大項目中使用, 而且是多系統使用: 可以對外提供有用的數據, 但是隱藏關鍵(無用)的數據: 數據安全
- 視圖可以對外提供友好型: 不同的視圖提供不同的數據, 對外好像專門設計
- 視圖可以更好(容易)的進行權限控制
4.7 視圖數據操作
視圖是的確可以進行數據寫操作的: 但是有很多限制
將數據直接在視圖上進行操作.
(1)新增數據
- 多表視圖不能新增數據
- 可以向單表視圖插入數據: 但是視圖中包含的字段必須有基表中所有不能爲空(或者沒有默認值)字段
- 視圖是可以向基表插入數據的.
(2)刪除數據
多表視圖不能刪除數據
單表視圖可以刪除數據
(3)更新數據
理論上不能單表視圖還是多表示視圖都可以更新數據.
4.8 視圖算法
視圖算法: 系統對視圖以及外部查詢視圖的Select語句的一種解析方式.
視圖算法分爲三種:
- Undefined: 未定義(默認的), 這不是一種實際使用算法, 是一種推卸責任的算法: 告訴系統,視圖沒有定義算法, 系統自己看着辦
- Temptable: 臨時表算法: 系統應該先執行視圖的select語句,後執行外部查詢語句
- Merge: 合併算法: 系統應該先將視圖對應的select語句與外部查詢視圖的select語句進行合併,然後執行(效率高: 常態)
算法指定: 在創建視圖的時候
Create algorithm = 指定算法 view 視圖名字 as select語句;
視圖算法選擇: 如果視圖的select語句中會包含一個查詢子句(五子句), 而且很有可能順序比外部的查詢語句要靠後, 一定要使用算法temptable,其他情況可以不用指定(默認即可).
5. 數據備份與還原
數據備份還原的方式有很多種: 數據表備份, 單表數據備份, SQL備份, 增量備份.
5.1數據表備份
直接進入到數據庫文件夾複製對應的表結構以及數據文件, 以後還原的時候,直接將備份的內容放進去即可.
前提條件: 根據不同的存儲引擎有不同的區別.
存儲引擎: mysql進行數據存儲的方式.
主要是兩種:
- Innodb: 只有表結構,數據全部存儲到ibdata1文件中
- Myisam(免費): 表,數據和索引全部單獨分開存儲
這種文件備份通常適用於myisam存儲引擎: 直接複製三個文件即可, 然後直接放到對應的數據庫下即可以使用.
5.2 單表數據備份
每次只能備份一張表; 只能備份數據(表結構不能備份)。通常的將表中的數據進行導出到文件。
基本備份:
Select */字段列表 into outfile 文件所在路徑 from 數據源;
-- 前提: 外部文件不存在
高級備份: 自己制定字段和行的處理方式
Select */字段列表 into outfile 文件所在路徑 fields 字段處理 lines 行處理 from 數據源;
- Fields: 字段處理
- Enclosed by: 字段使用什麼內容包裹, 默認是’’,空字符串
- Terminated by: 字段以什麼結束, 默認是”\t”, tab鍵
- Escaped by: 特殊符號用什麼方式處理,默認是’\’, 使用反斜槓轉義
- Lines: 行處理
- Starting by: 每行以什麼開始, 默認是’’,空字符串
- Terminated by: 每行以什麼結束,默認是”\r\n”,換行符
數據還原: 將一個在外部保存的數據重新恢復到表中(如果表結構不存在,那麼sorry)
Load data infile 文件所在路徑 into table 表名[(字段列表)] fields 字段處理 lines 行處理;
-- 怎麼備份的怎麼還原
5.3 SQL備份
系統會對錶結構以及數據進行處理,變成對應的SQL語句, 然後進行備份: 還原的時候只要執行SQL指令即可.(主要就是針對表結構)
備份: mysql沒有提供備份指令: 需要利用mysql提供的軟件: mysqldump.exe
Mysqldump.exe也是一種客戶端,需要操作服務器: 必須連接認證
Mysqldump/mysqldump.exe -hPup 數據庫名字 [數據表名字1[ 數據表名字2...]] > 外部文件目錄(建議使用.sql)
SQL還原數據:
方案1: 使用mysql.exe客戶端還原
Mysql.exe/mysql -hPup 數據庫名字 < 備份文件目錄
方案2: 使用SQL指令還原
Source 備份文件所在路徑;
SQL備份優缺點
- 優點: 可以備份結構
- 缺點: 會浪費空間(額外的增加SQL指令)
5.4 增量備份
不是針對數據或者SQL指令進行備份: 是針對mysql服務器的日誌文件進行備份
增量備份: 指定時間段開始進行備份., 備份數據不會重複, 而且所有的操作都會備份(大項目都用增量備份)
【整理自網上資料】