MySQL-5 外鍵、查詢、視圖

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 外鍵條件

  1. 外鍵要存在: 首先必須保證表的存儲引擎是innodb(默認的存儲引擎): 如果不是innodb存儲引擎,那麼外鍵可以創建成功,但是沒有約束效果.
  2. 外鍵字段的字段類型(列類型)必須與父表的主鍵類型完全一致.
  3. 一張表中的外鍵名字不能重複.
  4. 增加外鍵的字段(數據已經存在),必須保證數據與父表主鍵要求對應.

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 意義

聯合查詢的意義分爲兩種:

  1. 查詢同一張表,但是需求不同: 如查詢學生信息, 男生身高升序, 女生身高降序.
  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 視圖意義

  1. 視圖可以節省SQL語句: 將一條複雜的查詢語句使用視圖進行保存: 以後可以直接對視圖進行操作
  2. 數據安全: 視圖操作是主要針對查詢的, 如果對視圖結構進行處理(刪除), 不會影響基表數據(相對安全).
  3. 視圖往往是在大項目中使用, 而且是多系統使用: 可以對外提供有用的數據, 但是隱藏關鍵(無用)的數據: 數據安全
  4. 視圖可以對外提供友好型: 不同的視圖提供不同的數據, 對外好像專門設計
  5. 視圖可以更好(容易)的進行權限控制

4.7 視圖數據操作

視圖是的確可以進行數據寫操作的: 但是有很多限制
將數據直接在視圖上進行操作.

(1)新增數據

  1. 多表視圖不能新增數據
  2. 可以向單表視圖插入數據: 但是視圖中包含的字段必須有基表中所有不能爲空(或者沒有默認值)字段
  3. 視圖是可以向基表插入數據的.

(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備份優缺點

  1. 優點: 可以備份結構
  2. 缺點: 會浪費空間(額外的增加SQL指令)

5.4 增量備份

不是針對數據或者SQL指令進行備份: 是針對mysql服務器的日誌文件進行備

增量備份: 指定時間段開始進行備份., 備份數據不會重複, 而且所有的操作都會備份(大項目都用增量備份)

【整理自網上資料】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章