這裏我們開始用SQL Server 來進行課本上例題的練習,沒有書?沒關係,我這有PDF版的。百度網盤,提取碼:cg8s
習題我敲了出來,如有錯誤歡迎大家指出。
沒安裝SQL Server的同學也不着急,可以看一下我之前的文章,感謝支持!
首先,我們先創建一個數據庫,名稱就叫做Test吧:
然後我們刷新數據庫:
接下來我們進入正式的環節:
【例3.1】 爲用戶WANG定義一個學生-課程模式S-T。
CREATE SCHEMAM"S-T" AUTHORIZATION WANG;
看上去很簡單,那麼我們直接來操作一下,查詢語句中輸入上面這句話,運行:
哈哈,我們的用戶“wang”都沒有創建,怎麼能找到呢?創建用戶wang:
再次運行查詢語句:
爲什麼還是不行呢?看這裏。
原來我們一直操作的數據庫不是我們Test數據庫,而是系統數據庫master,切換到Test數據庫:
切換後再次執行:
在安全性 --> 架構中我們看到新建的 S-T ,我們雙擊查看:
顯然,創建完成,第一道題目圓滿完成!
[例 3.2]CREATE SCHEMA AUTHORIZATION WANG;
該語句沒有指定<模式名>,所以<模式名>隱含爲用戶名WANG。
定義模式實際上定義了一個命名空間,在這個空間中可以進一步定義該模式包含的數據庫對象,例如基本表、視圖、索引等。
這些數據庫對象可以用表33中相應的CREATE語句來定義。
目前,在 CREATE SCHEMA 中可以接受 CREATE TABLE, CREATE VIEW 和 GRANT子句。也就是說用戶可以在創建模式的同時在這個模式定義中進一步創建基本表、視圖、定義授權。即:
CREATE SCHEMA <模式名> AUTHORIZNION <用戶名>[表定義子句> |<視圖定義子句>|<授權定義子句>];
【例3.3】 爲用戶ZHANG創建一個模式TEST,並且在其中定義一個表TAB1。
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
C0L3 CHAR(20),
COL4 NUMERIC(10,3),
COLS DECIMAL(5,2)
);
新建用戶zhang,並執行語句:
2. 刪除模式
在SQL中,刪除模式語句如下:
DROP SCHEMA <模式名><CASCADE | RESTRICT>;
其中CASCADE和RESTRICT兩者必選其一。選擇了CASCADE (級聯),表示在刪除模式的同時把該模式中所有的數據庫對象全部刪除;選擇了 RESTRICT (限制),表示如果該模式中己經定義了下屬的數據庫對象(如表、視圖等),則拒絕該1M除語句的執行。只有當該模式中沒有任何F屬的對象時才能執行DROP SCHEMA語句。
[例 3.4]DROP SCHEMA ZHANG CASCADE;
首先,我們先爲用戶zhang新建一個模式“zhang”:
我們發現,此處報錯。作爲新手,卡在這挺久。原來是因爲我們用的是SQL server。不支持cascade。所以去掉cascade就OK了。
這裏我們考慮一下:我們知道 drop schema zhang cascade; 這句中的[cascade],表示在刪除模式的同時把該模式中所有的數據庫對象全部刪除。但是現在如果此模式中連接着其他的數據庫對象,並且我們將此句話去掉,在刪除此模式的時候會發生什麼呢?我們測試一下,恢復用戶zhang的zhang模式,並且在此模式下定義一張表TAB1:
接着我們來執行**drop schema zhang;**的語句:
報錯:無法對 ‘zhang’ 執行 drop schema,因爲對象 ‘TAB1’ 正引用它。 顯然去掉cascade果然對刪除模式有影響,所以我們要向刪除此模式,必須將與之相連的對象都刪除纔可:
該語句本來可以在刪除模式ZHANG,該模式中已經定義的表TAB1也被刪除。但是因爲SQL sever不支持此語句,因此我們只能將其分開刪除纔可。
【例3.5】 建立一個“學生”表Student。
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /* 列級完整性約束條件,Sno是主碼 */
Sname CHAR(20) UNIQUE, /* Sname 取唯一值 */
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
系統執行該CREATE TABLE語句後,就在數據庫中建立一個新的空“學生”表Student,並將有關“學生”表的定義及有關約束條件存放在數據字典中。
效果如圖:
【例3.6】 建立一個“課程”表Course。
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY, /*列級完整性約束條件,Cno是主碼*/
Cname CHAR(40) NOT NULL, /*列級完整性約束條件,Cnamc不能取空*/
Cpno CHAR(4), /*Cpno的含義是先修課*/
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
/*表級完整性約束條件,Cpno是外碼,被參照表是Course,被,照列是Cno */
);
效果如圖:
本例說明參照表和被參照表可以是同一個表。
【例3.7】 建立學生選課表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 */
);
效果如圖:
【例3.8】 向Student表增加“入學時間”列,其數據類型爲日期型.
ALTER TABLE Student ADD S_entrance DATE;
不論基本表中僚來是否已有數據,新増加的列一株爲空值
PS:插入的時候注意保證列名唯一性,否則像下圖:
【例3.9】 將年齡的數據類型由字符型(假設填來的數據類型是字符型)改爲整數。
ALTER TABLE Student ALTER COLUMN Sage INT;
【例3.1】 増加課程名稱必須取唯-值的約束條件.
ALTER TABLE Couree ADD UNIQUE(Cname);
【例3.11】 刪除Student表。
注意:在上面我們已經知道,此句話在SQL server中不適用,如果要刪除的話,先刪除與Student表相關聯的內容即可纔可。
DROP TABLE Student CASCADE;
基本表定義一旦被刪除,不僅表中的數據和此表的定義將被刪除,而且此表上建立的
索引、觸發器等對象一般也都將被刪除。有的關係數據庫管理系統還會同時刪除在此表上建立的視圖。如果欲刪除的基本表被其他基本表所引用,則這些表也可能被刪除。例如SC表通過外碼Sno引用Student,則執行例3.11後Student表被刪除,SC也被級聯刪除。因此執行刪除基本表的操作一定要格外小心。(在支持此句查詢的數據庫中)
【例3.12】 若表上建有視圖,選擇RESTRICT時表不能刪除;選擇CASCADE時可以刪除表,視圖也自動被刪除。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
在此我們新建了一個視圖:
至於刪除Student表,需要將以下表刪除纔可:
我們可以發現,視圖依舊存在,但是表已經被我們刪除:
再次查詢,結果如下:
這次中遇到的最大的問題便是關於 DROP SCHEMA <模式名><CASCADE | RESTRICT>; 的使用,在SQL server中來使用一直報錯,檢查了好久都沒發現錯誤,最後嘗試去掉後面的 <CASCADE|RESTRICT> 這個在無任何對象和模式相關聯的時候纔可以成功運行,否則的話,只有刪除和 "要刪除的模式"相關聯的對象才能夠成功。 ༼༎ຶᴗ༎ຶ༽ ༼༎ຶᴗ༎ຶ༽ ༼༎ຶᴗ༎ຶ༽