前言
有關數據庫原理與統計的筆記,內容爲書本的原文概括。
尖括號和圓括號內的指令可忽略不寫,中括號內的語句不可忽略。
SQL的數據定義語句
操作對象 | 創建 | 刪除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROPSCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
視圖 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
SQL標準不提供修改模式定義和修改視圖定義的操作。用戶如果想修改這些對象,只能將它們刪除後再重建。SQL標準沒有提供索引相關的語句,但爲了提高查詢效率,商用關係數據庫管理系統通常都提供了索引機制和相關的語句。
在早期的數據庫系統中,所有數據庫對象都屬於一個數據庫,即只有一個命名空間,現代的關係數據庫管理系統提供了一個層次化的數據庫對象命名機制,一個關係數據庫管理系統的實例中可以創建多個數據庫,一個數據庫中可以創建多個模式,一個模式下通常包括多個表、視圖和索引等數據庫對象。
一、模式的定義與刪除
[1]. 定義模式
模式定義語句:
CREATE SCHEMA <模式名> AUTHORIZATION [用戶名]
如果沒有指定模式名,則模式名默認與用戶名一致。使用該指令的用戶必須擁有數據庫管理員權限,或者獲得了數據庫管理員授予的CREATE SCHEMA的權限。
(1)爲用戶WANG定義一個學生-課程模式S-T。
CREATE SCHEMA "S-T" AUTHORIZATION WANG;
定義模式實際上定義了一個命名空間,在這個空間中可以進一步定義該模式包含的數據庫對象。
用戶可以在創建模式的同時,在這個模式定義中進一步創建基本表、視圖,定義授權。
(2)爲用戶ZHANG創建一個模式TEST,並且在其中定義一個表TAB1。
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
[2]. 刪除模式
刪除語句:
DROP SCHEMA [模式名] CASCADE
或
DROP SCHEMA [模式名] RESTRICT
CASCADE:級聯,表示在刪除模式的同時把該模式中所有的數據庫對象全部刪除。
RESTRICT:限制,表示如果該模式中已經定義了下屬的數據庫對象,則拒絕該語句的執行。
二、基本表達定義、刪除與修改
[1]. 定義基本表
定義基本表的格式:
CREATE TABLE [表名] ([列名] [數據類型] [列級完整性約束條件]
,[列名] <數據類型> [列級完整性約束條件]
.....
,[表級完整性約束條件];
)
(1)建立一個學生表Student
表Student:
學號Sno | 姓名Sname | 性別Ssex | 年齡Sage | 所在系Sdept |
---|---|---|---|---|
21 | 李勇 | 男 | 20 | CS |
22 | 劉晨 | 女 | 19 | CS |
23 | 王敏 | 女 | 18 | MA |
25 | 張立 | 男 | 19 | IS |
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /*列級完整性約束條件,Sno爲主碼*/
Sname CHAR(20) UNIQUE, /*Sname取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
(2)建立一個課程表Course
表Course
課程號Cno | 課程名Cname | 先行課Cpno | 學分Ccredit |
---|---|---|---|
1 | 數據庫 | 5 | 4 |
2 | 數學 | 2 | |
3 | 信息系統 | 1 | 4 |
4 | 操作系統 | 6 | 3 |
5 | 數據結構 | 7 | 4 |
6 | 數據處理 | 2 | |
7 | PASCAL語言 | 6 | 4 |
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY, /*列級完整性約束條件,Cno爲主碼*/
Cname CHAR(40) NOT NULL, /*列級完整性約束條件,Cname不能取空*/
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno) /*表級完整性約束條件,Cpno爲外碼*/
/*被參照表爲Course,被參照列爲Cno*/
);
(3)建立學生選課表SC
表SC
學號Sno | 課程號Cno | 成績Grade |
---|---|---|
21 | 1 | 92 |
21 | 2 | 85 |
21 | 3 | 88 |
22 | 2 | 90 |
22 | 3 | 80 |
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爲被參照表*/
);
[2]. 數據類型
數據類型 | 定義 |
---|---|
CHAR(n) ,CHARACTER(n) | 長度爲n的定長字符串 |
VARCHAR(n),CHARACTERVARYING(n) | 最大長度爲n的變長字符串 |
CLOB | 字符串大對象 |
BLOB | 二進制大對象 |
INT,INTEGER | 長整型(4個字節) |
SMALLINT | 短整型(2字節) |
BIGINT | 大整型(8字節) |
NUMERIC(p,d) | 定點數,由p位數字組成(p位不包括符號),小數點後面有d位數字 |
DECIMAL(p,d),DEC(p,d) | 定點數,由p位數字組成(p位不包括符號),小數點後面有d位數字 |
REAL | 取決於及其精度的單精度浮點數 |
DOUBLE PRECISION | 取決於機器精度的雙精度浮點數 |
FLOAT(n) | 可選精度的浮點數,精度至少爲n位數字 |
BOOLEAN | 布爾型 |
DATE | 日期型,格式:年-月-日 |
TIME | 時間型,格式:時:分:秒 |
TIMESTAMP | 時間戳型 |
INTERVAL | 時間間隔型 |
選取的數據類型需要考慮兩個方面:取值範圍、運算
[3]. 模式與表
每一個基本表都屬於某一個模式,一個模式包含多個基本表。當定義基本表時一般可以有三種方法定義它所屬的模式。分別爲:
(1)在表名中給出模式名
(2)在創建模式語句中同時創建表
(3)設置所屬的模式
當用戶創建基本表時沒有指定模式,系統會根據搜索路徑來確定該對象所屬的模式。
搜索路徑包含一組模式列表,關係數據庫管理系統會使用模式列表中第一個存在的模式作爲數據庫對象的模式名,若搜索路徑中的模式名都不存在,系統將會報錯。
顯示當前的搜索路徑:SHOW search_path
搜索路徑的當前默認值是$user,PUBLIC。含義是首先搜索與用戶名相同的模式名,如果該模式名不存在,則使用PUBLIC模式。
設置搜索路徑:SET search_path TO [模式名],PUBLIC;
[4]. 修改基本表
修改基本表的格式:
ALTER TABLE [表名]
ADD [COLUMN] [新列名] [數據類型] [完整性約束]
ADD [表級完整性約束]
DROP [COLUMN] [列名] CASCADE|RESTRICT
DROP CONSTRAINT [完整性約束名] CASCADE|RESTRICT
ALTER COLUMN [列名] [數據類型]
ADD子句用於增加新列、新的列級完整性約束條件和新的表級完整性約束條件。
DROP COLUMN子句用於刪除表中的列
DROP CONSTRAINT子句用於刪除指定的完整性約束條件
ALTER COLUMN子句用於修改原有的列定義,包括修改列名和數據類型
(1)向Student表增加S_entrance列,數據類型爲日期型
ALTER TABLE Student ADD S_entrance DATE;
(2)將年齡Sage的數據類型改爲整型
ALTER TABLE Student ALTER COLUMN Sage INT;
(3)增加課程Course名稱必須取唯一值的約束條件
ALTER TABLE Course ADD UNIQUE(Cname);
[5]. 刪除基本表
刪除表語句:
DROP [表名] CASCADE|RESTRICT
選擇CASCADE,在刪除基本表的同時,相關的依賴對象都將被刪除。
選擇RESTRICT,刪除的表存在依賴該表的對象時,則該表不能被刪除。依賴的對象有其他表的約束,視圖,觸發器,存儲過程或函數。
(1)刪除Student表
DROP TABLE Student CASCADE;
(2)創建視圖和刪除表
CREATE VIEW IS_Student /*Student表上創建視圖*/
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
DROP TABLE Student RESTRICT; /*刪除Studetn表,由於存在相應視圖,會報錯*/
DROP TABLE Student CASCADE; /*刪除Student表及其依賴,返回刪除提示*/
SELECT * FROM IS_Student /*視圖已被刪除,會報錯*/
三、索引的建立與刪除
建立索引能夠加快查詢速度,數據庫索引類能夠快速定位到查詢的內容,用戶可以在基本表上建立一個或多個索引,以提供多種存取路徑,加快查找速度。
數據庫索引類型:順序文件上的索引、B+樹索引、散列索引、位圖索引。
順序文件上的索引
:針對按指定屬性值升序或降序存儲的關係,在該屬性上建立一個順序索引文件,索引文件由屬性值和相對應的元組指針組成。
B+樹索引
:將索引屬性組織成B+樹形式,B+樹的葉結點爲屬性值和相應的元組指針,B+樹索引具有動態平衡的優點。
散列索引
:建立若干個桶,將索引屬性按照其散列函數值映射到相應桶中,桶中存放索引屬性值和相應的元組指針,散列索引具有查找速度快的特點。
位圖索引
:用位向量記錄索引屬性中可能出現的值,每個位向量對應一個可能值。
索引能夠加速數據庫查詢,但需要佔用一定的存儲空間,當基本表更新時,索引要進行相應的維護,這些都會增加數據庫的負擔,因此要根據實際應用的需要有選擇地創建索引。
建立與刪除索引由數據庫管理員或表的屬主,即建表的人,負責完成。關係數據庫管理系統在執行查詢時會自定選擇合適的索引作爲存取路徑,用戶不必選擇索引
。索引是關係數據庫管理系統的內部實現技術,屬於內模式的範疇。
[1]. 建立索引
格式:
CREATE [UNIQUE] [CLUSTER] INDEX [索引名]
ON [表名] ([列名] [次序] ,....,[列名] [次序])
UNIQUE表明此索引的每一個索引值只對應唯一的數據記錄。
CLUSTER表示要建立的索引是聚簇索引
(1)爲三個表建立索引
Student表按選好升序建立唯一索引,Course表按照課程號建立唯一索引,SC表按學號升序和課程號降序建立唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
[2]. 修改索引
格式:
ALTER INDEX [舊索引名] RENAME TO [新索引名]
(1)將SC表的SCno索引名變更爲SCSno
ALTER INDEX SCno RENAME TO SCSno;
[3]. 刪除索引
格式:
DROP INDEX [索引名]
(1)刪除Student表的Stusname索引
DROP INDEX Stusname;
四、數據字典
數據字典是關係數據庫管理系統內部的一組系統表,記錄了數據庫中所有的定義信息,包括關係模式定義、視圖定義、索引定義、完整性約束定義、各類用戶對數據庫的操作權限、統計信息等。
關係數據庫管理系統在執行SQL的數據定義語句時,實際上就是在更新數據字典表中的相應信息,在進行查詢優化和查詢處理時,數據字典中的信息是其重要依據。