㈠ 簡述資料庫的三大範式和五大約束
範式書上講解太拗口,自己總結一下:
第一範式:數據表中的每一列(每個欄位)必須是不可拆分的最小單元,不允許存在隱藏欄位,屬性保持「原子性」(最大細分的二維表)
第二範式:第一範式基礎上要有主鍵,所有列都必須依賴於主鍵,而不能有任何一列與主鍵沒有關系,也就是說一個表只描述一件事情(相當於這行闡述的是一個人時,你不能加一列說明天氣)
第三範式:滿足第二範式,表中的每一列只與主鍵直接相關而不是間接相關,(表中的每一列只能依賴於主鍵)
正規化範式(BCDF):所有表中的決定因素必須是一個候選鍵,如果只有一個候選鍵,那麼就和第三範式是一樣的。
有第四第五範式,更高的範式是為了解決數據冗餘問題,但可以通過其他辦法達到。所以一般用不到
五大約束:
1. primary KEY :設置主鍵約束;
2. UNIQUE :設置唯一性約束,不能有重復值;
3. DEFAULT 默認值約束,height DOUBLE(3,2)DEFAULT 1.2 height不輸入是默認為1,2
4. NOT NULL :設置非空約束,該欄位不能為空;
5. FOREIGN key :設置外鍵約束。
㈡ 資料庫之主鍵外鍵
1,主鍵約束 (table的唯一標識)
能夠作為主鍵列的特點:該列不能為空,不能有重復值出現
創建表時指定主鍵的兩種方式:
CREATE TABLE stu(
sid CHAR(6) PRIMATY KEY,
sname VARCHAR(20),
age INT,
gender VARCHER(10)
);
指定sid列為主鍵列
CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(20),
age INT,
gender VARCHER(10),
PRIMARY KEY(sid)
);
指定sid列為主鍵列
修改表時指定主鍵:ALTER TABLE stu ADD PRIMATY KEY(sid);
刪除主鍵:ALTER TABLE stu DROP PRIMARY KEY;
2,主鍵自增長
因為主鍵列的特性是:必須唯一,不能為空,所以我們通常會指定主鍵為整形,然後設置其自動增長
創建表時指定主鍵自增長:
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
修改表時設置主鍵自增長:ALTER TABLE stu
3,非空約束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
age INT,
gender VARCHAR(10)
);
對sname列設置了非空約束
4,唯一約束
某些列不能設置重復的值,所以可以對列添加唯一約束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL UNIQUE,
age INT,
gender VARCHAR(10)
);
6,外鍵約束
外鍵特點:外鍵必須是另一個表的主鍵的值(外鍵要引用主鍵!),外鍵可以重復,外鍵可以為空,一張表可以有多個外鍵!
CREATE TABLE dept( //部門表
deptno INT PRIMARY KEY AUTO_INCREMENT,
deptname CHAR(20)
);
INSERT INTO dept VALUES(10,『研發部』);
INSERT INTO dept VALUES(20,『人力部』);
INSERT INTO dept VALUES(30,『財務部』);
CREATE TABLE emp( //員工表
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
dno INT, //員工所屬部門(外鍵),
CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)
);
INSERT INTO emp(empno,ename) VALUES(NULL,『張三』),//外鍵可以不傳入值
INSERT INTO emp(empno,ename) VALUES(NULL,『李四』,10),//外鍵可以重復
INSERT INTO emp(empno,ename) VALUES(NULL,『王五』,10),
INSERT INTO emp(empno,ename) VALUES(NULL,『趙六』,80),//dept表沒有主鍵值為80的記錄,sql客戶端編譯報錯
7,一對一關系模型
創建老公表
CREATE TABLE hashand(
hid INT PRIMARY KEY AUTO_INCREMENT,
hname VARCHAR(50),
);
INSERT INTO hashand VALUES(NULL,『劉備』);
INSERT INTO hashand VALUES(NULL,『關羽』);
INSERT INTO hashand VALUES(NULL,『張飛』);
SELECT * FROM hashand
//創建老婆表
CREATE TABLE wife(
wid INT PRIMARY KEY AUTO_INCREMENT,
wname VARCHAR(50),
CONSTRAINT fk_wife_hashand FOREIGN KEY(wid) REFERENCES hashand(hid)
)
/**
wid:
1,非空
2,唯一
3,引用hid
*/
INSERT INTO wife VALUES(1,『楊貴妃』);
INSERT INTO wife VALUES(2,『妲己』);
INSERT INTO wife VALUES(3,『褒姒』);
SELECT * FROM wife;
對於一對一關系模型從表的主鍵即是外鍵,例如老公和老婆的關系模型,一個老公只能有一個老婆,一個老婆只能有一個老公
對於一對多關系模型主表的主鍵即是從表的外鍵,例如訂單和用戶的關系模型,一個用戶可以下單多次,對應多個訂單,而一個訂單只能屬於一個用戶
對於多對多關系模型沒有主表和從表之分,需要建立第三張表來記錄這兩張表的外鍵,建立兩個外鍵,分別引用這兩張表的主鍵
8,多對多關系模型
在表中簡歷多對多關系需要使用中間表,即需要三張表,在中間表中使用兩個外鍵,分別引用其他兩個表的主鍵,例如學生和老師的關系模型,一個老師可以有多個學生,一個學生可以有多個老師
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname CHAR(40)
);
CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,
tname CHAR(40)
);
CREATE TABLE stu_tea(
sid INT,
tid INT,
ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
);
INSERT INTO student VALUES(NULL,『劉德華』);
INSERT INTO student VALUES(NULL,『梁朝偉』);
INSERT INTO student VALUES(NULL,『黃日華』);
INSERT INTO student VALUES(NULL,『苗僑偉』);
INSERT INTO student VALUES(NULL,『湯鎮業』);
INSERT INTO teacher VALUES(NULL,『崔老師』);
INSERT INTO teacher VALUES(NULL,『劉老師』);
INSERT INTO teacher VALUES(NULL,『石老師』);
SELECT * FROM student;
SELECT * FROM teacher;
INSERT INTO stu_tea VALUES(1,1); //劉德華是崔老師的學生
INSERT INTO stu_tea VALUES(2,1); //梁朝偉是崔老師的學生
INSERT INTO stu_tea VALUES(3,1);//黃日華是崔老師的學生
INSERT INTO stu_tea VALUES(4,1);//苗僑偉是崔老師的學生
INSERT INTO stu_tea VALUES(5,1);//湯鎮業是崔老師的學生
INSERT INTO stu_tea VALUES(2,2);//梁朝偉是劉老師的學生
INSERT INTO stu_tea VALUES(3,2);//黃日華是劉老師的學生
INSERT INTO stu_tea VALUES(4,2);//苗僑偉是劉老師的學生
INSERT INTO stu_tea VALUES(3,3);//黃日華是石老師的學生
INSERT INTO stu_tea VALUES(5,3);//湯鎮業是劉老師的學生
SELECT * FROM stu_tea;
這時在stu_tea這個中間表中的每條記錄都是來說明student表和teacher表的關系的
例如在stu_tea表中的記錄:sid為1001,tid為2001,這說明編號為1001的學生有一個編號為2001的老師
sid tid
1001 2001 //編號為1001的學生有一個編號為2001的老師
1001 2002 //編號為1001的學生有一個編號為2002的老師
1001 2003 //編號為1001的學生有一個編號為2003的老師
1002 2001 //編號為2001的老師有一個編號為1002的學生
1002 2004 //編號為2004的老師有一個編號為1002的學生
9,合並結果集
要求要合並的結果集中,列的類型和列數相同
UNION,去除重復行,UNION ALL,不去除重復行
㈢ 資料庫中什麼是主鍵,什麼是外鍵
主鍵(Primary key): 也稱為主碼或主關鍵字,用於惟一地確定一個元組的屬性或屬性組(復合主碼)。每個關系都有一個並且只有一個主碼。
外鍵(Foreign Key):也稱為外碼或外部關鍵字。如果一個屬性集不是所在關系的關鍵字,但是是其他關系的關鍵字,則該屬性集稱為外部關鍵字。
在關系資料庫中可以通過外鍵使兩個關系關聯,這種聯系通常是一對多(1:n)的,其中主(父)關系(1方)稱為被參照關系,從(子)關系(n方)稱為參照關系。
(3)資料庫主鍵約束擴展閱讀:
資料庫主鍵作用:
1、保證實體的完整性
2、加快資料庫的操作速度
3、在表中添加新記錄時,DBMS會自動檢查新記錄的主鍵值,不允許該值與其他記錄的主鍵值重復。
4、DBMS自動按主鍵值的順序顯示表中的記錄。如果沒有定義主鍵,則按輸入記錄的順序顯示表中的記錄。
在有些資料庫中,雖然主鍵不是必需的,但最好為每個表都設置一個主鍵,不管是單主鍵還是復合主鍵。它存在代表著表結構的完整性,表的記錄必須得有唯一區分的欄位,主鍵主要是用於其他表的外鍵關聯,以及本記錄的修改與刪除。
㈣ 什麼是資料庫約束
資料庫約束是對表中的數據進行進一步的限制,保證數據的正確性、有效性和完整性。
約束通常與一個表相關聯,並使用CREATE CONSTRAINT或CREATE ASSERTIONSQL語句創建。
所有的關系資料庫都支持對數據表使用約束,通過約束可以更好地保證數據表裡數據的完整性。
是表上強制執行的校驗規則,除此之外,當表中數據存在相互依賴性時,可以保護相關數據不被刪除。約束通常無法修改。
(4)資料庫主鍵約束擴展閱讀
資料庫中的五大約束:
1、主關鍵字約束
主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。
2、外關鍵字約束
外關鍵字約束定義了表之間的關系。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,並設定它適合哪個表中哪些列相關聯。
3、唯一性約束
惟一性約束指定一個或多個列的組合的值具有唯一性,以防止在列中輸入重復的值。唯一性約束指定的列可以有NULL 屬性。由於主關鍵字值是具有唯一性的,因此主關鍵字列不能再設定唯一性約束。唯一性約束最多由16 個列組成。
4、檢查約束
檢查約束對輸入列或整個表中的值設置檢查條件,以限制輸入值,保證資料庫的數據完整性。可以對每個列設置復合檢查。
5、預設約束
預設約束通過定義列的預設值或使用資料庫的預設值對象綁定表的列,來指定列的預設值。SQL Server 推薦使用預設約束,而不使用定義預設值的方式來指定列的預設值。