SQL中的數據定義功能包括模式定義、表定義、視圖定義、索引的定義。下面對以上操作一一總結:
1、模式的定義與刪除
“模式”是一個數據庫的命名空間,一個框架,打個比方:在java中,創建模式相當於創建一個包,而創建表相當於創建一個類,一個類是在某一個包下面進行管理的。在mysql中,創建模式與創建數據庫是一樣的,也就是create schema <模式名>與 create database <數據庫名>是等效的。所以模式的定義與刪除語句如下:
create schema <模式名> authorization <用戶名>,例如創建一個學生-課程的模式S-T
create schema "S-T" authorization wang;//為用戶wang創建一個模式S-T
刪除模式語句如下:
drop schema <模式名> <cascade|restrict>
其中cascade與restrict兩者必選其一。
cascade(級聯),表示刪除模式的同時,把該模式中的所有數據庫對象(例如表等)也全部刪除。
restrict(限制),表示如果該模式下已經定義了下屬的數據庫對象(如表、視圖等),則拒絕執行該刪除語句的執行。
2、基本表的定義、刪除與修改
表的定義基本格式如下:
create table<表名>(
<列名> <數據類型> [列級完整性約束條件],
<列名> <數據類型> [列級完整性約束條件],
<列名> <數據類型> [列級完整性約束條件]
);
例如創建學生的選課表:
create table SC(
Sno char(9),
Cno char(4),
Sname char(20) unique,//取唯一值
primary key(Sno,Cno),//主碼由兩個屬性構成,須作為表級完整性進行定義
foreign key(Sno) references Student(Sno),//表級完整性約束,Sno是外碼,被參照的表是Student
foreign key(Cno) references Course(Cno)//表級完整性約束,Cno是外碼,被參照的表是Coruse
);
刪除基本表的定義如下:
drop table<表名>[restrict|cascade];
如果選擇restrict,則該表的刪除是有限制條件的。待刪除的基本表不能被其他的約束所引用(如check,foreign key等約束),不能有視圖,不能有觸發器(trigger),不能有存儲過程或函數等。
如果是cascade,則該表的刪除沒有限制條件。在刪除表的同時,相關的依賴對象,例如視圖,也將一並刪除。
修改基本表的一般格式如下:
alter table <表名>
[add <新列名> <數據類型> [完整性約束]]
[drop <完整性約束名>]
[alter column <列名> <數據類型>];
例如,向Student表中添加“入學時間”:
alter table Student add S_entrance Date;
將年齡的數據類型由字符型改為整型
alter table Student alter column Sage int;
增加課程名必須取唯一值的約束條件
alter table Course add unique (Cname);
3、索引的建立與刪除
建立索引是為了加快查詢速度,可以根據需要,在基本表上建立一個或多個索引,以提供多種存取路徑,加快查找速度。
建立索引的語句定義如下:
create [unique][cluster] index <索引名> on <表名>(<列名>[<次序>][,<列名>[<次序>]]);
其中次序是指定索引值的排序次序,可以選擇ASC(升序)或DESC(降序),缺省值是ASC。
unique表明此索引的每一個索引值只對應唯一的數據記錄。
cluster表明要建立的索引是聚簇索引。聚簇索引是指索引項的順序與表中記錄的物理順序一致的索引組織。例如:
create cluster index Stuname on Student(Sname);
該語句將會在Student表中的Sname列上建立一個聚簇索引,用戶可以在最經常查詢的列上建立聚簇索引以提高查詢效率。在一個表上只能創建一個聚簇索引。如果對已經建立聚簇索引列上的數據進行更新操作時,常常導致表中記錄的物理順序發生改變,代價較大,所以對於經常更新的列不宜建立聚簇索引。
例如在SC表上創建一個索引,該索引是唯一的,且按學號升序和課程號降序,如下:
create unique index SCNO on SC(Sno ASC, Cno DESC);
索引的維護是由系統完成的,不用用戶干預。建立索引是為了減少查詢操作的時間,但如果數據增刪改的操作比較頻繁,系統則會話費很多時間來維護它,從而降低查詢效率,這時可以刪除一些不必要的索引,刪除語句如下:
drop index <索引名> on <表名>或 alter table <表名> drop index <索引名>
具體索引的使用方法,可以參照該網站:http://www.jb51.net/Special/621.htm
在RDBMS中,索引一般采用B+樹、HASH索引來實現。B+樹具有動態平衡的優點。HASH具有查找快速的優點。至於索引的實現是采用B+樹還是HASH索引,則由具體的RDBMS來決定。
