(1)理解和掌握数据库DDL语言,能熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本表。
(2)掌握SQL语句常见语法错误的调试方法。
教材3.3数据定义中例3.1至例3.11的要求操作,并截取相应的结果图
1、定义模式
模式定义语句:CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
【例3.1】为用户LJY定义一个学生-课程模式S-T
结果为:
,在架构中可以找到
;但如果写成
的形式,即把双引号去掉,执行命令会出现错误
原因是SCHEMA的命名必须以“字母”,“”“@”,“#”开头,后跟“字母”,“”,“数字”,“$”,而“-”违反了SCHEMA的命名规则,所以系统才会报错,但是可以通过加双引号“”的方式来实现任意定义。
【例3.2】CREATE SCHEMA AUTHORIZATION LJY
该句没有指定<模式名>,所以<模式名>隐含为用户名LJY。但是在架构中却无法找到新的模式:GDM。这是因为SQLServer并没有实现这一功能,但是可以通过直接使用与自己的用户名相同的架构名来创建新模式。
【例3.3】为用户LJY创建一个模式TEST,并且在其中定义一个表TAB1。
用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图等。需要注意的是,上述语句必须一次执行,若分开执行,创建的表是dbo.TAB1,错误。执行命令成功,在架构中可以找到TEST,在表中可以找到TEST.TAB1此时便不能再用SELECT * FROM TAB1语句查询,会出现错误提示, 用查询语句SELECT *FROM TEST.TAB1可以显示成功创建的表的内容
2、删除模式
删除语句:DROP SCHEMA <模式名>
CASEDE(级联):表示在删除模式的同时把该模式中的所有数据库对象全部删除。
RESTRICT(限制):表示如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝删除语句的执行,只有当该模式中无任何下属的对象时才能执行删除语句。
【例3.4】DROP SCHEMA JG CASCADE
由于SQL Server中并未实现
时,会出现
,所以删除模式可直接使用DROP SCHEMA JG即可。需要注意的是,当模式中有下属数据库对象时,是无法将其删除的。例如删除TEST模式(有下属对象—TAB1)。
3、 基本表的定义
基本表定义语句:CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据结构>[列级完整性约束条件]]
…
[,表级完整性约束条件]);
SQL语言使用CREATE TABLE语句定义基本表,建表的同时通常还可以定义于该表有关的完整性约束条件,新建的表,默认位于dbo下,即dbo.student。使用查询语句后
【例3.6】建立一个“课程”表Course.
创建成功后使用查询语句可显示:
本例说明参照表和被参照表可以是同一个表。
【例3.7】建立学生选课表SC。
例3.5、例3.6和例3.7会建立如下三个表:
通过使用查询语句可显示:
4、 基本表的修改
修改语句:
ALTER TABLE<表名>
[ADD[COLUMN]<新列名><数据类型>[约束条件]]
[ADD<表级完整性约束>]
[DROP [COLUMN]<列名>[CASCADE|RESTRICT]]
[DROP CONSTRAN<完整性约束名>[RESTRICT|CASCADE]]
【例3.8】向Student表中添加“入学时间”,其数据类型为日期型。
执行结果:
ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件。不管基本表中原来是否有数据,新增加的列一律为空值。
【例3.9】将年龄的数据类型由字符型(假设原来的字符类型是字符型)改为整数。
ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型。
【例3.10】增加课程名必须取唯一值的约束条件
查询后显示:
此时的课程名必须取唯一值。
5.基本表的删除删除语句:DROP TABLE <表名>[RESTRICT|CASCADE]
【例3.11】删除Student表
RESTRICT:即该表的删除时不能被其他表的约束条件所引用,不能能有视图,不能有触发器,不能有存储过程或函数等,否则将删除失败。
CASCADE:即该表的删除没有限制,再删除该表的同时,其相关联的依赖对象都将被一起删除。但是SQLServer并未实现这一功能,所以在执行语句时会出现错误提示:
【拓展】
执行报错:
SQLServer默认restrict,即如果欲删除的表被其他表正在引用,是无法直接删除的。直接删除时系统会报错,这是因为,Student表被SC表的约束引用,所以无法直接删除。需要先将表SC删除,然后再删除表Student.
CREATE DATABASE LJY --创建数据库
USE LJY --打开数据库
--定义模式时要键入用户名,所以要新建一个用户名,安全性-用户-新建用户-不带登录名的SQL用户
--例3.1:为用户LJY定义一个学生-课程模式S-T
CREATE SCHEMA "S-T" AUTHORIZATION LJY
CREATE SCHEMA S-T AUTHORIZATION LJY
--例3.3:为用户LJY创建一个模式TEST,并且在其中定义一个表TAB1
CREATE SCHEMA TEST AUTHORIZATION LJY
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
SELECT * FROM TAB1
--例3.4:DROP SCHEMA JG CASCADE
CREATE SCHEMA JG AUTHORIZATION LJY
DROP SCHEMA JG CASCADE
DROP SCHEMA JG
--例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)
);
SELECT *FROM Student
--例3.6:建立一个“课程”表Course.
CREATE TABLE Course(
Cno CHAR(4 ) PRIMARY KEY,/*列级完整性约束条件,Cno是主码*/
Cname CHAR(40) NOT NULL,/*列级完整性约束条件,Cname不能取空值*/
Cpno CHAR(4), /*Cpno的含义是先修课*/
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
/*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/
);
SELECT *FROM Course
--例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*/
);
SELECT *FROM SC
--例3.8:向Student表中添加“入学时间”,其数据类型为日期型。
ALTER TABLE Student ADD S_entrance DATE;
SELECT *FROM Student
--例3.9:将年龄的数据类型由字符型(假设原来的字符类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT
--例3.10:增加课程名必须取唯一值的约束条件
ALTER TABLE Course ADD UNIQUE(Cname)
SELECT *FROM Course
--例3.11:删除Student表
DROP TABLE Student CASCADE;
DROP TABLE SC;
DROP TABLE Student;