虽然SQLServer和其他的许多工具都提供了可视化操作的方法,但是在涉及到与其他程序的连接等情况下,必须退回到代码层面。而且代码操作也是程序员的基本素养之一(用代码操作也显得更高大上不是吗),本次例子的展示都会采用代码操作的方法。
下面将要进行的例子都是在数据库的基础下进行的,我们先从创建数据库开始。
SQLServer代码操作
按钮 | 功能描述 |
---|---|
新建查询 | 开始代码输入 |
执行 | 运行输入的代码 |
对勾符号 | 检验代码是否正确 |
点击新建查询之后会在界面区出现可输入部分,如下
图中语句为新建名为study的数据库,点击执行后在左侧菜单栏中点击刷新即可找到新建的数据库。
【例3.1】
CREATE SCHEMA "S-T" AUTHORIZATION WANG;
为用户WANG定义一个学生-课程模式S-T
对于用户的操作必须建立在该用户已经存在的基础上,系统默认的用户中不存在名为WANG的用户,需要手动创建。
在左侧菜单栏的study中点击【安全性】,点击【用户】,右键选择【新建用户】
【用户名】填写WANG,【登录名】点击可选菜单中的浏览,选取第一个。
【默认结构】不需要填写,点击【确定】创建。
用户创建完成,接下来执行代码即可。
【例3.2】
CREATE SCHEMA AUTHORIZATION WANG;
该语句没有指定<模式名>,所以<模式名>隐含为用户名WANG。
在未修改默认用户名之前,用户名默认为dbo。这也是为什么直接创建的表前缀为dbo.
【例3.3】
CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB1 ( COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2),
);
为用户WANG创建一个模式TEST,并且在其中定义一个表TAB1。
【例3.4】
DROP SCHEMA ZHANG CASCADE;
该语句删除了模式ZHANG,同时,该模式中已经定义的表TAB1也被删除了。
要删除首先要有该模式,按照上一个例子的步骤创建模式ZHANG,把表名的部分修改即可。
关于删除模式(即ZHANG后面的关键字)
CASCADE(级联)
删除模式的同时把该模式的所有数据库对象全部删除
RESTRICT(限制)
如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
好了,如果上面的东西你都看懂了,那么接下来执行代码就完成了……才有鬼了。
如果你是按上述步骤正确操作,那么在SQLServer环境下会发生下面的情况
SQLServer不支持上述的关键字,在不加关键字的情况下为限制删除,需要删除已有的表。
DROP TABLE ZHANG.TAB1;
DROP SCHEMA ZHANG;
使用代码分级删除即可。
【例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 <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ]
…
[,<表级完整性约束条件> ] );
(主码自带不为空属性)
【例3.6】建立一个“课程”表Course。
CREATE TABLE Course(
Cno CHAR(4) PRIMARY KEY,/*列级完整性约束条件,Cno是主码*/
Cname CHAR(40)NOT NULL, /*列级完整性约束条件,Cname不能取空值*/
Cpno CHAR(4),/*Cpon的含义是先修课*/
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;
不论基本表中原来是否已有数据,新增加的列一律为空值。
修改表的语句
ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [COLUMN] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;
【例3.9】将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
【例3.10】增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE(Cname);
【例3.11】 删除Student表。
DROP TABLE Student CASCADE;
注意,基本表删除时,表中的数据、定义、建立的索引、触发器等也会会被删除。
与之前的一样,该语句不能被SQLServer正确执行。
【例3.12】若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可删除表,视图自动被删除 。
CREATE VIEW IS_Student/*Student表上建立视图*/
AS
SELECT Sno,Sname,Sage
RROM Student
WHERE Sdept="IS";
DROP TABLE Student RESTRICT;/*删除Student表*/
--ERROR:cannot drop table Student becausee other objects depend on it
/*系统返回错误信息,存在依赖该表的对象,此表不能被删除*/
DROP TABLE Student CASCADE;/*删除Student表*/
--NOTICE:drop cascades to view IS_Student
/*系统返回提示,此表上的视图也被删除*/
SELECT*FROM IS_Student;
--ERROR:relation"IS_Student"does not exist
由于SQLSrever不能正确执行,这里不再演示。