这里我们开始用SQL Server 来进行课本上例题的练习,没有书?没关系,我这有PDF版的。百度网盘,提取码:cg8s
首先,我们先创建一个数据库,名称就叫做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 (限制),表示如果该模式中己经定义了下属的数据库对象(如表、视图等),则拒绝该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 ; 的使用,在SQL server中来使用一直报错,检查了好久都没发现错误,最后尝试去掉后面的 这个在无任何对象和模式相关联的时候才可以成功运行,否则的话,只有删除和 "要删除的模式"相关联的对象才能够成功。 ༼༎ຶᴗ༎ຶ༽ ༼༎ຶᴗ༎ຶ༽ ༼༎ຶᴗ༎ຶ༽