目錄
基本表
定義基本表
語法格式:
CREATE TABLE <表名>
(<列名> <數據類型>[ <列級完整性約束條件> ]
[,<列名> <數據類型>[ <列級完整性約束條件>] ] …
[,<表級完整性約束條件> ] );
要求:
如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級
約束類型:
名稱 作用 實現的完整性
Primary key 定義主鍵,保證主鍵列無重復值 實體完整性
Unique 保證該列無重復值 實體完整性
Foreign key 定義外鍵,保證數據表間數據的一致性 參照完整性
Check 定義表中某些列的數據范圍 自定義完整性
Default 為列的數據提供默認值 自定義完整性
數據基本類型:
數據類型 含義
CHAR(n) 長度為n的定長字符串
VARCHAR(n) 最大長度為n的變長字符串,實際存儲有效長度
INT 長整數(也可以寫作 INTEGER)
SMALLINT 短整數
NUMERIC(p,d) 定點數,由p位數字(不包括符號、小數點)組成,小數后面有d位數字
REAL 取決於機器精度的浮點數
Double Precision 取決於機器精度的雙精度浮點數
FLOAT(n) 浮點數,精度至少為n位數字
DATE 日期,包含年、月、日,格式為 YYYY-MM-DD
TIME 時間,包含一日的時、分、秒,格式為 HH:MM:SS
數據庫與表:
- 關系:
- 每一個表都屬於某一個數據庫
- 一個數據庫可以包含多個表
例子:
建立一個“學生選課”表SC
CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno), /* 主碼由兩個屬性構成,必須作為表級完整性進行定義*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /* 表級完整性約束條件,Sno是外碼,被參照表是Student */ FOREIGN KEY (Cno) REFERENCES Course(Cno) /* 表級完整性約束條件, Cno是外碼,被參照表是Course*/ );
修改基本表
語法格式:
ALTER TABLE <表名>
[ ADD <新列名> <數據類型> [ 完整性約束 ] ]
[ DROP <完整性約束名> ]
[ ALTER COLUMN<列名> <數據類型> ]
[ADD [COLUMN<約束名> ] <約束定義> ]
;
例子:
- 向Student表增加“入學時間”列,其數據類型為日期型 .
ALTER TABLE Student ADD S_entrance DATE;
- 將年齡的數據類型由字符型 (假設原來的數據類型是字符型)改為整數 .
-
ALTER TABLE Student ALTER COLUMN Sage INT;
刪除基本表
語法格式:
DROP TABLE <表名>[RESTRICT| CASCADE];(缺省情況是 RESTRICT)
說明:
- RESTRICT 欲刪除的基本表不能被其他表的約束所引用如果存在依賴該表的對象,則此表不能被刪除,刪除表是有限制的
- CASCADE 在刪除基本表的同時,相關的依賴對象一起刪除,表上建立的索引、視圖、觸發器等一般也將被刪除.刪除該表沒有限制
例子:
- 刪除Student表
DROP TABLE Student CASCADE ;
表完整性
實體完整性
說明:
關系模型的實體完整性在 CREATE TABLE 中用 PRIMARY KEY 定義
違約處理:
- 插入或對主碼列進行更新操作時,RDBMS 按照實體完整性規則自動進行檢查
- 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改
- 檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改
- 檢查記錄中主碼值是否唯一的一種方法是進行全表掃描,由於對基本表進行全表掃描十分耗時的, RDBMS 核心一般都在主碼上自動建立索引
定義:
- 單屬性構成的碼有兩種方法:
- 定義為列級約束條件:
CREATE TABLE Student( Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20));
- 定義為表級約束條件:
CREATE TABLE Student( Sno CHAR(9), Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno));
- 定義為列級約束條件:
- 對多個屬性構成的碼只有一種說明方法:
- 定義為表級約束條件:
參照完整性
定義:
在 CREATE TABLE 中用 FOREIGN KEY 短語定義哪些列為外碼用REFERENCES短語指明這些外碼參照哪些表的主碼
CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno, Cno), /*在表級定義實體完整性*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表級定義參照完整性*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表級定義參照完整性*/ );
違約處理:
- 拒絕(NO ACTION)執行:不允許該操作執行(默認策略)
- 級聯(CASCADE)操作:當刪除或修改被參照表的一個組員造成了與參照表的不一致,則刪除或修改參照表的所有造成不一致的元組
- 設置為空值(SET-NULL):當刪除或修改被參照表的一個組員造成了與參照表的不一致,則將參照表中的所有造成不一致的元組的對應屬性設置為空置
說明:
- 對於參照完整性,除了應該定義外碼,還應定義外碼列是否允許空值
- 可能破壞參照完整性的情況
約束:
任何約束都有約束名
用戶定義完整性
說明:
- 用戶定義的完整性就是針對某一具體應用的數據必須滿足的語義要求,由 RDBMS 提供,而不必由應用程序承擔
- 在CREATE TABLE時定義
- 列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 檢查列值是否滿足一個布爾表達式(CHECK)
- 設置默認值(DEFAULT)
類別:
- NOT NULL:
- 設置選項值不能為空(不能設置為表屬性)
- UNIQUE:
- 唯一性約束用於指定一個或者多個列的組合的值具有唯一性,以防止在列中輸入重復的值.當使用唯一性約束時,需要考慮以下幾個因素:
- 主鍵自動具有 unique 的特性
- 一個表中可以允許有多個唯一性約束
- 可以把唯一性約束定義在多個字段上
- 唯一性約束用於強制在指定字段上創建一個唯一性索引
- 可以設置為表屬性
- 唯一性約束用於指定一個或者多個列的組合的值具有唯一性,以防止在列中輸入重復的值.當使用唯一性約束時,需要考慮以下幾個因素:
- CHECK:
- 用CHECK短語指定列值應該滿足的條件:
- 一個列級檢查約束只能與限制的字段有關;一個表級檢查約束只能與限制的表中字段有關.
- 一個表中可以定義多個檢查約束
- 每個 CREATE TABLE 語句中每個字段只能定義一個檢查約束
- 在多個字段上定義檢查約束,則必須將檢查約束定義為表級約束
- 當執行 INSERT 語句或者 UPDATE 語句時,檢查約束將驗證數據
- 用CHECK短語指定列值應該滿足的條件:
- DEFAULT:
- 定義:
- [constraint 約束名]
- default 常量表達式 for 字段名
- 注意:
- 每個字段只能定義一個缺省約束
- 如果定義的缺省值長於其對應字段的允許長度,那么輸入到表中的缺省值將被截斷
- 不能加入到帶有 IDENTITY 屬性的字段上
- 定義:
違約處理:
- 屬性上的約束條件檢查和違約處理
- 插入元組或修改屬性的值時,RDBMS 檢查屬性上的約束條件是否被滿足如果不滿足則操作被拒絕執行
- 元組上的約束條件檢查和違約處理
- 插入元組或修改屬性的值時,RDBMS 檢查元組上的約束條件是否被滿足如果不滿足則操作被拒絕執行
完整性約束:
- 定義約束:
- CONSTRAINT 約束
CONSTRAINT <完整性約束條件名>
[ PRIMARY KEY短語
|FOREIGN KEY短語
|CHECK短語 ]
- CONSTRAINT 約束
- 刪除表完整性約束:
-
ALTER TABLE Student DROP CONSTRAINT C3;
- 修改表完整性限制:
- 使用 ALTER TABLE 語句修改表中的完整性限制(可以先刪除原來的約束條件,再增加新的約束條件)
-
ALTER TABLE Student DROP CONSTRAINT C3; ALTER TABLE Student ADD CONSTRAINT C3 CHECK (Sage < 40);
索引
用途:
建立索引的目的:加快查詢速度
說明:
- 只有 DBA 或 表的屬主(即建立表的人)可以建立索引
- 由 DBMS 自動完成維護索引,DBMS一般會自動建立以下列上的索引
- PRIMARY KEY
- UNIQUE
- DBMS 自動選擇是否使用索引以及使用哪些索引
使用索引:
- RDBMS 中索引一般采用 B+ 樹、HASH 索引來實現
- B+ 樹索引具有動態平衡的優點
- HASH 索引具有查找速度快的特點
- 采用 B+ 樹,還是HASH索引 則由具體的 RDBMS 來決定
- 索引是關系數據庫的內部實現技術,屬於內模式的范疇
- CREATE INDEX 語句定義索引時,可以定義索引是唯一索引、非唯一索引或聚簇索引
聚簇索引與非聚簇索引:
- 聚簇索引
- 對表的物理數據頁中的數據按列進行排序,然后再重新存儲到磁盤上,即聚簇索引與數據是混為一體的,它的葉節點中存儲的是實際的數據
- 非聚簇索引
- 具有完全獨立於數據行的結構,使用非聚簇索引不用將物理數據頁中的數據按列排序.非聚簇索引的葉節點存儲了組成非聚簇索引的關鍵字值和行定位器
建立索引:
- 語法格式:
- CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
- CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
- 格式說明:
- <表名> 是要建索引的基本表名字
- UNIQUE 表明此索引的每一個值只對應唯一的數據記錄
- CLUSTER 表明要建立的索引是聚簇索引.所謂聚簇錯應是指索引項的順序與表中記錄的物理順序一致的索引組織
- 說明:
- 索引可以建立在一個表的一列或多列上,各列名字之間用逗號隔開,每個<列名>后面還可以用<次序>指定索引值的排列次序,可以選 ASC (升序,此為默認值)或 DESC (降序)
- 要求:
- 在最經常查詢的列上建立聚簇索引以提高查詢效率
- 一個基本表上最多只能建立一個聚簇索引
- 經常更新的列不宜建立聚簇索引
- 例子:
- 在 Student 表的 Sname(姓名)列上建立一個聚簇索引
CREATE CLUSTER INDEX Stusname ON Student(Sname);
- 在 Student 表的 Sname(姓名)列上建立一個聚簇索引
刪除索引:
- 語法格式:
- DROP INDEX <索引名>;
- 注意:
- 刪除索引時,系統會從數據字典中刪去有關該索引的描述
- 例子:
- 刪除 Student 表的 Stusname 索引
DROP INDEX Stusname;
- 刪除 Student 表的 Stusname 索引
視圖
特點:
- 是從一個或幾個基本表(或視圖)導出的表
- 只存放視圖的定義,不存放視圖對應的數據
- 基表中的數據發生變化,從視圖中查詢出的數據也隨之改變
- 一個窗口,透過它可以看到數據庫中自己感興趣的數據及其變化
特殊用途:
定義基本表是,為了減少數據庫中的沉余數據,表中只存放基本數據,由基本數據經過各種計算派生出的數據一般是不存儲的,但由於視圖中數據並不是實際存儲,所以定義視圖時可以根據應用的需要,設置一些派生屬性列.這些派生屬性由於在基本表中並不實際存在也稱它們為虛擬列.帶虛擬列的視圖也稱為帶表達式的視圖
作用:
- 視圖能夠簡化用戶的操作
- 視圖使用戶能以多種角度看待同一數據
- 視圖對重構數據庫提供了一定程度的邏輯獨立性
- 視圖能夠對機密數據提供安全保護
- 適當的利用視圖可以更清晰的表達查詢
基於視圖的操作:
- 查詢
- 刪除
- 受限更新
- 定義基於該視圖的新視圖
行列子集視圖:
從單個基本表導出,且只是去掉了基本表的某些行和某些列,但保留了主碼
建立視圖:
- 語法格式:
- CREATE VIEW
<視圖名> [(<列名> [,<列名>]…)]
AS <子查詢>
[WITH CHECK OPTION];
- CREATE VIEW
- 說明:
- WITH CHECK OPTION
- 表示對視圖進行 UPDATE , INSERT 和 DELETE 操作時要保證更新,插入,刪除的行滿足視圖定義的謂詞條件(即子查詢中的條件表達式)
- RDBMS 執行 CREATE VIEW 語句時只是把視圖定義存入數據字典,並不執行其中的 SELECT 語句.
- 在對視圖查詢時,按視圖的定義從基本表中將數據查出
- WITH CHECK OPTION
- 要求:
- 子查詢可以使任意復雜的 SELECT 語句,但是子查詢不允許含有 ORDER BY 子句和 DISTINCT 短語
- 下列三種情況下必須指明組成視圖的所有名字
- 某個目標列不是單純的屬性名,而是聚集函數或列表達式
- 多表連接時選出幾個同名列作為視圖的字段
- 需要在視圖中為某個列啟用新的更合適的名字
- 必須明確指定組成視圖的所有列名情況:
- 的情況 某個目標列不是單純的屬性名,而是聚集函數或列表達式
- 多表連接時選出了幾個同名列作為視圖的字段
- 需要在視圖中為某個列啟用新的更適合的名字
- 例子:
- 建立信息系學生的視圖,並要求進行修改和插入操作時仍需保證該視圖只有信息系的學生
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS' WITH CHECK OPTION;
- 基於多個基表的視圖 (建立信息系選修了1號課程的學生視圖)
CREATE VIEW IS_S1(Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND Sdept= 'IS' AND SC.Cno= '1';
- 分組視圖 (將學生的學號及他的平均成績定義為一個視圖假設SC表中“成績”列Grade為數字型)
CREATE VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
- 基於視圖的視圖 (建立信息系選修了1號課程且成績在90分以上的學生的視圖)
CREATE VIEW IS_S2 AS SELECT Sno,Sname,Grade FROM IS_S1 WHERE Grade>=90;
- 建立信息系學生的視圖,並要求進行修改和插入操作時仍需保證該視圖只有信息系的學生
- 例子解析:
- 當對 IS_Student 視圖的更新操作:
- 修改操作:在選擇條件處自動加上 Sdept= 'IS' 的條件
- 刪除操作:在選擇條件處自動加上 Sdept= 'IS' 的條件
- 插入操作:在選擇條件處自動檢查 Sdept 屬性值是否為 'IS' (如果不是,則拒絕該插入操作.如果沒有提供 Sdept 屬性值,則自動定義Sdept為 'IS')
- 當對 IS_Student 視圖的更新操作:
刪除視圖:
- 語法格式:
- DROP VIEW <視圖名>[CASCADE];
- 作用:
- 該語句從數據字典中刪除指定的視圖定義,如果該視圖上還導出了其他視圖,使用CASCADE級聯刪除語句,把該視圖和由它導出的所有視圖一起刪除
- 注意:
- 刪除基表時,由該基表導出的所有視圖定義都必須顯式地使用DROP VIEW語句刪除
視圖查詢:
- 語法格式:
- 用戶角度:查詢視圖與查詢基本表相同用SETECT來查詢視圖
- RDBMS 實現視圖查詢方法:
- 視圖消解法(View Resolution):
- 進行有效性檢查
- 轉換成等價的對基本表的查詢
- 執行修正后的查詢
- 視圖消解法(View Resolution):
- 視圖消解法的局限:
- 有些情況下,視圖消解法不能生成正確查詢
更新視圖:
- 限制:
- 一些視圖是不可更新的,因為對這些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新
- 允許對行列子集視圖進行更新
- 對其他類型視圖的更新不同系統有不同限制
- 若視圖是由兩個以上基本表導出的,則此視圖不允許更新
- 若視圖的字段來自字段表達式或常數,則不允許對此視圖執行INSERT和UPDATE操作,但是允許執行DELETE操作,
- 若視圖的字段來自聚集函數,則此視圖不允許更新
- 若視圖定義中含有GROUP BY子句,則此視圖不允許更新
- 若視圖定義中含有DISTINCT,則此視圖不允許更新