資料庫的完整性 什麼是數據的完整性 保證用戶輸入的數據保存到資料庫中是正確的。 如何添加數據完整性 在創建表時給表中添加約束 完整性分類 1. 實體完整性 2. 域完整性 3. 參照完整性 實體完整性 1. 什麼是實體完整性 表中的一行(一條記錄)代表一個實體(entity) 2. 實體完整性的作用 ...
資料庫的完整性
什麼是數據的完整性
保證用戶輸入的數據保存到資料庫中是正確的。
如何添加數據完整性
在創建表時給表中添加約束
完整性分類
- 實體完整性
- 域完整性
- 參照完整性
實體完整性
- 什麼是實體完整性
表中的一行(一條記錄)代表一個實體(entity)
- 實體完整性的作用
標識每一行數據不重覆。行級約束
- 約束類型
- 主鍵約束(primary key)
- 唯一約束(unique)
- 自動增長列(auto_increment)
- 主鍵約束
特點:
- 每個表中要有一個主鍵
- 數據唯一,且不能為null
添加主鍵約束的方式
CREATE TABLE 表名(欄位名1 數據類型 primary key,欄位2 數據類型);
CREATE TABLE 表名(欄位1 數據類型, 欄位2 數據類型,primary key(要設置主鍵的欄位));
CREATE TABLE 表名(欄位1 數據類型, 欄位2 數據類型,primary key(主鍵1,主鍵2));
聯合主鍵: 兩個欄位數據同時相同時,才違反聯合主鍵約束。
1.先創建表
2.再去修改表,添加主鍵
ALTER TABLE student ADD CONSTRAINT PRIMARY KEY (id);
- 唯一約束:
特點:
- 指定列的數據不能重覆
- 可以為空值
CREATE TABLE 表名(欄位名1 數據類型 欄位2 數據類型 UNIQUE);
- 自動增長列
特點:
- 指定列的數據自動增長
- 即使數據刪除,還是從刪除的序號繼續往下
CREATE TABLE 表名(欄位名1 數據類型 PRIMARY KEY AUTO_INCREMENT ,欄位2 數據類型 UNIQUE);
域完整性
限制此單元格的數據正確,不對照此列的其它單元格比較
域代表當前單元格
域完整性約束:
-
數據類型 :
數值類型、日期類型、字元串類型 -
非空約束(not null)
CREATE TABLE 表名(欄位名1 數據類型 PRIMARY KEY AUTO_INCREMENT ,欄位2 數據類型 UNIQUE not null);
-
預設值約束(default)
CREATE TABLE 表名(欄位名1 數據類型 PRIMARY KEY AUTO_INCREMENT ,欄位2 數據類型 UNIQUE not null default '男');
插入的時候,values當中的值直接給default
參照完整性
-
什麼是參照完整性
是指表與表之間的一種對應關係
通常情況下可以通過設置兩表之間的主鍵、外鍵關係,或者編寫兩表的觸發器來實現。
有對應參照完整性的兩張表格,在對他們進行數據插入、更新、刪除的過程中,系統都會將被修改表格與另一張對應表格進行對照,從而阻止一些不正確的數據的操作。
資料庫的主鍵和外鍵類型一定要一致;
兩個表必須得要是InnoDB類型
設置參照完整性後 ,外鍵當中的內值,必須得是主鍵當中的內容 -
一個表設置當中的欄位設置為主鍵,設置主鍵的為主表
CREATE TABLE student(sid int PRIMARY key,name varchar(50) not null,sex varchar(10) default '男');
-
創建表時,設置外鍵,設置外鍵的為子表
CREATE TABLE score( sid INT, score DOUBLE, CONSTRAINT fk_stu_score_sid FOREIGN KEY(sid) REFERENCES student(id));
表之間關係
- 一對一
一夫一妻 - 一對多關係
一個人可以擁有多輛汽車,要求查詢某個人擁有的所有車輛。
創建Person表
創建Car表
- 多對多關係
- 學生選課,一個學生可以選修多門課程,每門課程可供多個學生選擇。
- 一個學生可以有多個老師,而一個老師也可以有多個學生
創建老師表
創建學生表
創建學生與老師關係表
關係圖
添加外鍵
多表操作
合併結果集
- 什麼是合併結果集
合併結果集就是把兩個select語句的查詢結果合併到一起
- 合併結果集的兩種方式
- UNION
合併時去除重覆記錄- UNION ALL
合併時不去除重覆記錄
格式:
UNION:
SELECT * FROM 表1 UNION SELECT * FROM 表2;
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
創建表:
UNION:
UNION ALL:
註意事項:被合併的兩個結果:列數、列類型必須相同。
多表聯查:
- 什麼是連接查詢
也可以叫跨表查詢,需要關聯多個表進行查詢
- 什麼是笛卡爾集
假設集合A={a,b},集合B={0,1,2},
則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。
可以擴展到多個集合的情況
同時查詢兩個表,出現的就是笛卡爾集結果
- 查詢時給表起別名
- 多表聯查,如何保證數據正確
逐行判斷,相等的留下,不相等的全不要
連接查詢
1. 內連接
內連接
圖示:
作用:查詢兩張表的共有部分
語句:
Select <select_list> from tableA A Inner join tableB B on A.Key = B.Key
示例:
SELECT * from employee e INNER JOIN department d on e.depart_id = d.id;
多表連接:
建表:
使用99連接法:
使用內聯查詢
2. 左連接
圖示
作用: 把左邊表的內容全部查出,右邊表只查出滿足條件的記錄
語句:
Select <select_list> from tableA A Left Join tableB B on A.Key = B.Key
示例
SELECT * from employee e LEFT JOIN department d on e.depart_id = d.id;
3. 右連接
圖示:
作用
把右邊表的內容全部查出,左邊表只查出滿足條件的記錄
語句
Select <select_list> from tableA A Right Join tableB B on A.Key = B.Key
示例
SELECT * from employee e RIGHT JOIN department d on e.depart_id = d.id;