二皆疹、SQL功能
以學(xué)生-課程數(shù)據(jù)庫(kù)為例疏橄,定義一個(gè)學(xué)生-課程模式S-T。包括三個(gè)表:
- 學(xué)生表:Student(++Sno++,Sname,Ssex,Sage,Sdept)
- 課程表:Course(++Cno++,Cname,Cpno,Ccredit)
- 學(xué)生選課表:SC(++Sno,Cno++,Grade)
1.數(shù)據(jù)定義
- 模式的定義與刪除
要?jiǎng)?chuàng)建模式墙基,需有數(shù)據(jù)庫(kù)管理員權(quán)限软族,或獲得了數(shù)據(jù)庫(kù)管理員授權(quán)的CREATE SCHEMA的權(quán)限刷喜。定義模式實(shí)際上定義了一個(gè)命名空間残制,在這個(gè)空間里可以進(jìn)一步定義該模式包含的數(shù)據(jù)庫(kù)對(duì)象,例如基本表掖疮、視圖初茶、索引等。
CREATE SCHEMA<模式名> AUTHORIZATION <用戶名>;
/* 為用戶WANG定義了一個(gè)學(xué)生-課程模式S-T */
CREATE SCHEMA"S-T" AUTHORIZATION WANG;
/* 若沒有指定<模式名>浊闪,則<模式名>隱含為用戶名WANG */
CREATE SCHEMA AUTHORIZATION WANG;
創(chuàng)建模式的同時(shí)可以在這個(gè)模式定義中進(jìn)一步創(chuàng)建基本表恼布、視圖、定義授權(quán)搁宾。
CREATE SCHEMA<模式名> AUTHORIZATION <用戶名> [<表定義子句>|<視圖定義子句>|<授權(quán)定義子句>];
/* 為用戶ZHANG創(chuàng)建一個(gè)模式TEST折汞,并在其中定義一個(gè)表TAB1 */
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20)
);
刪除模式,CASCADE(級(jí)聯(lián))和RESTRICT(限制)兩者必選其一盖腿。選擇CASCADE表示刪除模式的同時(shí)把該模式中所有數(shù)據(jù)庫(kù)對(duì)象全部刪除爽待;選擇RESTRICT表示如果該模式中已經(jīng)定義了下屬的數(shù)據(jù)庫(kù)對(duì)象,則拒絕該刪除語句的執(zhí)行翩腐。
DROP SCHEMA<模式名><CASCADE|RESTRICT>;
/* 刪除模式ZHANG鸟款,同時(shí),該模式中已經(jīng)定義的表TAB1也被刪除了 */
DROP SCHEMA ZHANG CASCADE;
- 基本表的定義茂卦、刪除與修改
定義基本表 CREATE TABLE
CREATE TABLE<表名>(<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]
[,<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]]
...
[,表級(jí)完整性約束條件]);
/* 建立一個(gè)“學(xué)生”表Student */
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /* 列級(jí)完整性約束條件何什,Sno是主碼 */
Sname CHAR(20) UNIQUE, /* Sname取唯一值 */
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
/* 建立一個(gè)“課程”表Course */
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY, /* 列級(jí)完整性約束條件,Cno是主碼 */
Cname CHAR(40) NOT NULL, /* 列級(jí)完整性約束條件等龙,Cname不能取空值 */
Cpno CHAR(4), /* Cpno表示先修課 */
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCE Course(Cno)
/* 表級(jí)完整性約束條件处渣,Cpno是外碼伶贰,被參照表是Course,被參照列是Cno */
/* 本例用來說明參照表和被參照表可以是同一個(gè)表 */
);
/* 建立學(xué)生選課表SC */
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /* 主碼由兩個(gè)屬性構(gòu)成霍比,必須作為表級(jí)完整性進(jìn)行定義 */
FOREIGN KEY(Sno) REFERENCE Student(Sno),
/* 表級(jí)完整性約束條件幕袱,Sno是外碼,被參照表是Student */
FOREIGN KEY(Cno) REFERENCE Course(Cno)
/* 表級(jí)完整性約束條件悠瞬,Cno是外碼们豌,被參照表是Course */
);
數(shù)據(jù)類型:在SQL中域的概念用數(shù)據(jù)類型來實(shí)現(xiàn)。定義表的各個(gè)屬性時(shí)需要指明其數(shù)據(jù)類型及長(zhǎng)度浅妆。
模式與表:每一個(gè)基本表都屬于某一個(gè)模式望迎,一個(gè)模式包含多個(gè)基本表。定義基本表時(shí)有三種方法定義它所屬的模式凌外。
/* 1.在表中明顯地給出模式名 */
CREATE TABLE "S-T".Student(...);/* Student所屬的模式是S-T */
/* 2.在創(chuàng)建模式語句中同時(shí)創(chuàng)建表 */
/* 為用戶ZHANG創(chuàng)建一個(gè)模式TEST辩尊,并在其中定義一個(gè)表TAB1 */
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20)
);
/* 3.設(shè)置所屬的模式,這樣在創(chuàng)建表時(shí)表名中不必給出模式名康辑,系統(tǒng)根據(jù)搜索路徑確定模式 */
SHOW search_path; /* 顯示當(dāng)前搜索路徑 */
/* 搜索路徑默認(rèn)為$user,PUBLIC摄欲,表示首先搜索與用戶名相同的模式名,如果不存在疮薇,則使用PUBLIC模式 */
/* 數(shù)據(jù)庫(kù)管理員可以設(shè)置搜索路徑來建立S-T.Student基本表 */
SET search_path TO "S-T",PUBLIC; /* 設(shè)置搜索路徑 */
CREATE TABLE Student(...); /* 定義基本表 */
修改基本表 ALTER TABLE
ALTER TABLE <表名>
[ADD [COLUMN] <新列名><數(shù)據(jù)類型> [完整性約束]]
[ADD<表級(jí)完整性約束>]
[DROP [COLUMN]<列名> [CASCADE|RESTRICT]]
[DROP CONSTRAINT<完整性約束名> [RESTRICT|CASCADE]]
[ALTER COLUMN <列名><數(shù)據(jù)類型>];
/* 向Student表增加“入學(xué)時(shí)間”列胸墙,其數(shù)據(jù)類型為日期型 */
ALTER TABLE Student ADD S_entrance DATE; /* 新增加的列一律為空值 */
/* 將年齡的數(shù)據(jù)類型改為整數(shù) */
ALTER TABLE Student ALTER COLUMN Sage INT;
/* 增加課程名稱必須取唯一值的約束條件 */
ALTER TABLE Course ADD UNIQUE(Cname);
刪除基本表 DROP TABLE
DROP TABLE <表名> [RESTRICT|CASCADE];
/* 刪除Student表 */
DROP TABLE Student CASCADE;
CASCADE(級(jí)聯(lián))和RESTRICT(限制),前者刪除時(shí)按咒,相關(guān)依賴對(duì)象如視圖都將被一起刪除迟隅,后者若存在依賴該表的對(duì)象則基本表不能被刪除。
- 索引的創(chuàng)建與刪除
建立索引 CREATE INDEX
CREATE [UNIQUE] [CLUSTER] INDEX<索引名>
ON <表名>(<列名>[次序][,<列名>[<次序>]]...);
/* Student表按學(xué)號(hào)升序建立唯一索引 */
CREATE UNIQUE INDEX Stusno ON Student(Sno);
/* Course表按課程號(hào)升序建立唯一索引 */
CREATE UNIQUE INDEX Coucno ON Course(Cno);
/* SC表按學(xué)號(hào)升序励七、課程號(hào)降序建立唯一索引 */
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
次序可選 ASC-升序(默認(rèn)) DESC-降序智袭,UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄,CLUSTER表示要建立的索引是聚簇索引。
修改索引
ALTER INDEX <舊索引名> RENAME TO <新索引名>;
/* 將SC表的SCno索引名改為SCSno */
ALTER INDEX SCno RENAME TO SCSno;
刪除索引
DROP INDEX <索引名>;
/* 刪除Student表的Stusname索引 */
DROP INDEX Stusname;