主要是使用SQL语句对模式和表进行简单的一些操作。
一、模式的定义和删除
1.点击左上角新建查询,使用SQL语句新建一个数据库。
CREATE DATABASE TEST04;
2.为用户WANG定义一个学生-课程模式S-T。
CREATE SCHEMA "S-T" AUTHORIZATION WANG;
但是记得在此之前在对应的数据库用户下右键创建WANG这个用户名,登录名选择第一个就好啦。
3.没有指定<模式名>的情况下,<模式名>隐含为<用户名>。
该语句没有指定<模式名>,所以<模式名>隐含为用户名WANG。
定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引等。
CREATE SCHEMA AUTHORIZATION WANG;
4.为一个用户创建一个模式,并在里面定义一个表。
目前,在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW 和 GRANT 子句。也就是说用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定义授权。
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>];
例:为用户ZHANG创建一个模式TEST,并且在其中定义一个表。
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(
COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2),
);
刷新一下表就会在表中看见一个TEST.TAB1,这里需要注意的是,若定义模式的语句和定义表的语句分开执行的话,产生的表是默认模式dbo下的即dbo.TAB1。
5.删除一个模式(记得提前保存一下前面SQL语句!!)。
DROP SCHEMA <模式名><CASCADE|RESTRICT>;
CASCADE(级联):在删除模式的同时把模式中所有的数据库对象全部删除。
RESTRICT(限制):如果该模式中已经定义了下属的数据库对象,则拒绝删除语句的执行
如上图,在SQL Serve中输入相关的语句会出错,因为在模式TEST下有与之相关的表并且在 T-SQL中没有 RESTRICT 和 CASCADE选项,那就一步一步来吧。
DROP TABLE TEST.TAB1;
DROP SCHEMA TEST;
二、基本表的定义、删除和修改。
1.定义基本表。
创建一个模式就建立了一个数据库的命名空间,一个框架。在这个空间中首先要定义的是该模式包含的数据库基本表。
CREATE TABLE <表名>(
<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[,<表级完整性约束条件> ]
);
在建表的同时要考虑完整性约束条件,相关的约束条件被存储在系统的数据字典中。如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则即可以定义在列级也可以定义在表级。
(1)建立三个表:学生表,课程表,选课表。
CREATE TABLE Student( --建立一个学生表
Sno CHAR(9) PRIMARY KEY, --Sno是主码,列级完整性
Sname CHAR(20) UNIQUE, --Sname取唯一值
Ssex CHAR(2),
Sage SMALLINT,
Sdep CHAR(20)
);
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,表级完整性
);
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,属列级完整性
);
结果查看如下图:
2.SQL数据类型
一个属性选用哪种数据结构要根据实际情况来决定,一般要从两个方面来考虑,一是取值范围,二是要做哪些运算。
3.模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表,当定义基本表时一般可以有三种方法定义它所属的属性。
(1)在表中明显地给出模式名。
CREATE TABLE "S-T".Student(...);
(2)在创建模式语句中同时创建表
(3)设置所属的模式,这样在创建是就不用给出模式名。
4.修改基本表
SQL语言用ALTER TABLE语句修改基本表。格式为:
ALTER TABLE <表名>
[ADD [COLUMN] <新列名><数据类型> [完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN]<列名>[CASCADE|RESTRICT]]
[DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]
[ALTER COLUMN<列名><数据类型>] ;
例子如下:
(1)向Student表增加“入学时间”列,其数据类型为日期型。
Alter table Student add S_entrance DATE;
如图所示
(2)将年龄的数据类型由字符型(假设原来的数据类型)改为整数。
Alter table Student alter column Sage int;
由之前的smallint变成啦int,如图:
(3)增加课程名称必须去唯一值的约束条件。
Alter table Course add unique(Cname);
5.删除基本表
当某个表不再需要时,可以使用DROP TABLE语句删除它,格式为:
DROP TABLE <表名> [RESTRICT|CASCADE];
默认情况是RESTRICT。
若选择RESTRICT,则该表的删除是有限制条件的。不能有约束,视图,触发器,函
数,存储过程和函数等。
若选择CASCADE,则该表的删除没有限制条件。在删除表的同时,相关的依赖对象
都将被被一起删除。
例3.12:若表上建有视图,选择RESTRICT时表不能被删除,选择CASCADE时可以
删除表,视图也自动被删除。
Create view IS_Student
AS
select Sno,Sname,Sage
from Student
where Sdep='IS';
查询一下该表确实是存在的:
然后删除一下,正常的情况该是:
DROP TABLE Student RESTRICT;
--ERROR: cannot drop table Student because other objects depend on it
/*出现错误,因为存在依赖Student的对象*/
DROP TABLE Student CASCADE;
--NOTICE: drop cascades to view IS_Student
/*返回提示,与Student相关的视图也被删除*/
然后使用查询语句
select *from IS_Student;
--ERROR: relation "IS_Student" does not exist
但是SQL Server中不支持RESTRICT和CASCADE,所以我们可以把与Student相关的
约束找出来,删除约束,然后使用DROP TABLE Student语句将基本表删除。