本篇文章记录了第四次作业
使用的数据库是SQL Server,使用的数据库管理软件是SQL Server Management Studio.
什么是SQL?
结构化查询语言(Structured Query Language,SQL)式关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。其功能 不仅仅是查询,而是包括数据库模式创建、数据库数据插入与修改、数据库安全性完整性定义与控制等一系列功能。
首先我们来创建一个新的数据库"SCHOOL"。
代码如下:
CREATE DATABASE SCHOOL
接着按下F5可以看见左边资源管理器里面有你新建的数据库"SCHOOL"
代码如下:
CREATE SCHEMA"S-T" AUTHORIZATION WANG;
但是我们如果直接在查询里面写下这条语句回报错,说用户不存在。
别着急,请先在左边的管理器中选择数据库->SCHOOL->安全性->用户,再右键用户选择新建用户。在跳出来的对话框中的用户名输入"WANG".登录名按照下图这样搞定,然后一直确定就行。
接下来选中SCHOOL数据库刷新一下,就可以看到报错消失,我们可以愉快执行啦!
执行结果:
CREATE SCHEMA AUTHORIZATION WANG;
这个语句没有指定<模式名>,所以<模式名>隐含为用户名WANG,而像[例3.1]中的模式名则是指定为了"S-T".
SQL Server中,默认用户为dbo,在没有创建模式的情况下,默认的模式名为dbo,所以表名为dbo.*。
CREATE SCHEMA扩展:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>];
代码如下:
CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
执行完了之后可以看见TEST模式下的TAB1。
还可以继续在TEST下建立TAB2。
CREATE TABLE TEST.TAB2(
COL1 SMALLINT
);
刷新后可以看到你建的TAB2表。若是TAB2前面不加TEST的话,默认在dbo模式下建表,就会有dbo.TAB2。
DROP SCHEMA TEST CASCADE;
放进去报错,因为SQL Server不支持CASCADE.
CASCADE(级联)的意思是删除模式的时候把该模式下的所有数据库对象全部删除。
与之对应的是RESTRICT(限制)即只有在该模式下没有下属对象的时候才进行删除,防止当成空模式误删。
你也不能写DROP SCHEMA TEST,系统会提示你有表在引用它。有点RESTRICT的这种味道。
那么怎么办呢?所以你得现把表删了之后才能删除TEST。
DROP TABLE TEST.TAB1;
DROP TABLE TEST.TAB2;
DROP SCHEMA TEST;
执行结果如下图,可以看到TABEL没了,并且安全性->架构里的"TEST"也没了,这里就不截图了。
SQL创建表的基本语句:
CREATE TABLE <表名>
<列名><数据类型>[<列级完整性约束条件>]
[,<列名> <数据类型>[ <列级完整性约束条件>] ]
…
[,<表级完整性约束条件> ] );
示例语句如下:
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /*列级完整性约束条件,Sno是主码*/
Sname CHAR(20) UNIQUE, /*Sname取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept 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*/
);
又一个成功运行~我们可以看到,因为SC表中参照了Student表和Course表,所以要最后建立,否则会报错。
SQL修改基本表的一般格式:
ALTER TABLE <表名>
[ADD[COLUMN] <新列名> <数据类型> [完整性约束] ]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE|RESTRICT] ]
[DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]
[ALTER COLUMN <列名><数据类型>];
语句:
ALTER TABLE Student ADD S_entrance DATE;
成功运行。我们可以注意到,不论表中原来是否有数据,新增加的列一律为空值。
ALTER TABLE Student ALTER COLUMN Sage INT;
运行结果如下。我们可以看到Sage的数据类型由上图中的smallint变成了int.
ALTER TABLE Course ADD UNIQUE(Cname);
可以看到SQL语句执行成功,但是我手贱点了3次,下面的键里面冒出来3个UNIQUE,暂时不知道对表有什么影响。
本来的意思是要直接使用
DROP TABLE Student CASCADE;
但是因为SQL Server的特性它不支持这个。
DROP TABLE Student;
我试了一下也不行,会提示你有外码引用,所以我们得先删除外码才能删除这个表。
ALTER TABLE <TABLE NAME> DROP CONSTRAINT <FOREIGN KEY>
/*例如*/
ALTER TABLE SC DROP CONSTRAINT FK__SC__Sno__3F466844;
/*此处是SC表中一个参照Student表的外码*/
/*之后就可以删除Student表了*/
我们可以看到Student表被删除了。
在外码不多的情况下我们可以人工找出外码然后再删除表,但是如果外码很多呢?可以写出查询外码的SQL语句然后再把结果复制后删除所有外码。具体的语句就不在这里讨论了。
而在SQL Server里面如果没有外码就会直接删除掉。。。
CREATE VIEW IS_Student /*Student表上建立视图*/
AS
SELECT Sno,Sname,Sage
From Student
WHERE Sdept=‘IS';
DROP TABLE Student RESTRICT; /*删除Student表,返回错误信息*/
DROP TABLE Student CASCADE; /*删除Student表,成功*/
SELECT * FROM IS_Student; /*返回关系不存在*/
在SQL Server 中使用SQL语句中经常遇到的问题就是表名或者属性名下面画有红色波浪线,如果提示权限不够的话一般不予理会SQL语句也能够成功执行。再有一个就是因为对CASCADE&RESTRICT都不支持,在练习书上的题目时有些问题,不能够照搬,这就要求我们进行灵活变通以及增强自我解决问题的能力。
下一篇文章:SQL语句基本操作练习(二)
参考文献:
[1]萨师煊,王珊,数据库系统概论.5版.北京:高等教育出版社,2014.
[2]David老师的PPT.