【数据库作业4】SQL练习1 - CREATE / DROP / ALTER

SQL功能 动词
数据查询 SELECT
数据定义 CREATE,DROP,ALTER
数据操纵 INSERT,UODATE,DELETE
数据控制 GRANT,REVOKE

【新建数据库】
直接右击新建 或 者输入指令⬇

CREATE DATABASE STU;

【在库下新建用户】
打开安全性→右击用户→新建→用户名→登录名(选择第一个)→确定

【例3.1]】为用户WANG定义一个学生-课程模式S-T

CREATE SCHEMA "S-T" AUTHORIZATION WANG;

【例3.2】该语句没有指定<模式名>,<模式名>隐含为<用户名>
在没有创建模式的情况下,默认的模式名为dbo,表名为dbo.*。

CREATE SCHEMA AUTHORIZATION WANG;

这里只放了例3.1的截图(标注了操作顺序)
在这里插入图片描述
【例3.3】为用户WANG创建了一个模式TEST,并且在其中定义一个表TAB1

CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB1 ( COL1 SMALLINT,
					COL2 INT,
					COL3 CHAR(20),
					COL4 NUMERIC(10,3),
					COL5 DECIMAL(5,2),
					);

注:如果去掉第一行,则表为dbo.TAB1

TEST模式建立成功,继续在TEST模式下建立表TAB2

CREATE TABLE TEST.TAB2
	( COL1 SMALLINT
	);

另:第一行如果是CREATE TABLE TAB2,则表为dbo.TAB2
在这里插入图片描述

【例3.4】删除模式TEST,同时该模式中定义的表也被删除

DROP SCHEMA TEST CASCADE;

在这里插入图片描述
这里显示语法错误是因为SQL Server不支持在删除过程中使用CASCADE/RESTRICT关键字,把它去掉之后还是不行,因为TAB1,TAB2正在引用(我也不知道他为啥就光显示TAB1)
在这里插入图片描述
所以想删除架构,需要先删除架构下你创建的对象。
1.手动删除:右击就可
2.语句删除⬇

DROP TABLE TEST.TAB1;
DROP TABLE TEST.TAB2;
DROP SCHEMA TEST;

在这里插入图片描述

——————————————【创 建 基 本 表】—————————————

		CREATE TABLE <表名>
      (<列名> <数据类型>[ <列级完整性约束条件> ]
      [,<列名> <数据类型>[ <列级完整性约束条件>] ][,<表级完整性约束条件> ] );

<表名>:所要定义的基本表的名字
<列名>:组成该表的各个属性(列)
<列级完整性约束条件>:涉及相应属性列的完整性约束条件
<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,
否则既可以定义在列级也可以定义在表级

★可以把表自行储存在记事本里,到时候直接把语句复制到SQL,或者直接打开文件。⬇
在这里插入图片描述
【例3.5】 建立“学生”表Student。学号是主码,姓名取值唯一。
注:需在当前数据库的当前模式下执行。(所以直接GREATE TABLE就可以啦)

CREATE TABLE Student(
       Sno CHAR(9) PRIMARY KEY,  /* 列级完整性约束条件,Sno是主码*/                  
       Sname CHAR(20) UNIQUE,    /* Sname取唯一值*/
       Ssex CHAR(2),
       Sage SMALLINT,
       Sdept CHAR(20)
      ); 

在这里插入图片描述

PRIMARY KEY:主码(列名前标有黑色小钥匙且括号里有PK标识)
UNIQUE:取唯一值
这俩都是列级完整性约束条件

因为我一不小心点了两下执行所以消息那里显示了图上的文字。然后还有前几节课学过的:主码不为空(not null)

【例3.6 】 建立一个“课程”表Course

CREATE TABLE  Course(
			Cno CHAR(4) PRIMARY KEY,
        	Cname CHAR(40),            
         	Cpno CHAR(4),               	                      
            Ccredit SMALLINT,
            FOREIGN KEY (Cpno) REFERENCES  Course(Cno)
            /*Cpno是外码,被参照表是Course,被参照列是Cno*/
          ); 

在这里插入图片描述

FOREIGN KEY:外码(属性名前有白色小钥匙)   表级完整性约束条件
REFERENCES后面写 被参照表(被参照类)

【例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*/
        ); 

在这里插入图片描述
既是主码又是外码的时候是黑色小钥匙

————————————【修 改 基 本 表】———————————————

ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [COLUMN] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;

<表名>是要修改的基本表
ADD 用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN 用于删除表中的列
DROP CONSTRAINT 用于删除指定的完整性约束条件
ALTER COLUMN 用于修改原有的列定义,包括修改列名和数据类型
如果指定了CASCADE短语,则自动删除引用了该列的其他对象
如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列

【例3.8】向Student表增加“入学时间”列,其数据类型为日期型
☆不管基本表中原来是否已有数据,新增加的列一律为空值

ALTER TABLE Student ADD S_entrance DATE;

在这里插入图片描述

【例3.9】将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。(这里在这里插入图片描述本来的数据类型是smallint,前面的图里都有,所以只放修改后的截图

ALTER TABLE Student ALTER COLUMN Sage INT;

【例3.10】增加课程名称必须取唯一值的约束条件。

ALTER TABLE Course ADD UNIQUE(Cname); 

在这里插入图片描述
【例3.11】 删除Student表
基本表定义被删除,数据被删除
表上建立的索引、视图、触发器等一般也将被删除

DROP TABLE Student CASCADE;

在这里插入图片描述
这里也报错了,跟上面删除模式的时候一样,因为SQL Server不支持在删除过程中使用CASCADE/RESTRICT关键字,那接着去掉cascade
在这里插入图片描述
在CSDN上查到了方法~附上链接:https://blog.csdn.net/weixin_34237596/article/details/91920860?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

使用如下SQL语句查询出表中外键约束名称:

select name  
from  sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id 
where f.parent_object_id=object_id('外码的表名')

在这里插入图片描述
然后执行下面的语句进行删除

ALTER TABLE 外码的表名 DROP CONSTRAINT 外键约束名

在这里插入图片描述
就没有FK啦,然后删除表就可以了!
在这里插入图片描述
【例3.12】若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可删除表,视图自动被删除 。
Student刚删除了,我就用Course表做的

CREATE VIEW IS_Course   /*Course表上建立视图*/
AS
SELECT Cno,Cname
FROM Course
WHERE Ccredit='IS';

删除表,Course有外码所以先把外键约束解除(不截图了)
在这里插入图片描述
视图还在,检查视图是否存在

SELECT * FROM IS_Course;

在这里插入图片描述
无法使用视图,再建表Course,就可以看到了
在这里插入图片描述
我这有个报错应该是因为Ccredit是smallint,我直接照书上打的IS导致的
在这里插入图片描述
因为SQL Server不支持在删除过程中使用CASCADE/RESTRICT关键字(重要的事情说三遍),所以删除表之后视图保留但是无法使用,重建表之后就可以了。

需要注意⬇
执行命令之前看看当前的库是不是你要修改的用户所在的库。
不能在已经执行的命令直接往后写,因为会重复执行。
执行操作后刷新才会看到成功建立修改或删除。

我有点不太习惯纯大写,虽然小写也可以,但是书上都是大写,慢慢习惯啦~
还有一个想不通的点,就是有时候我的语句会有红线,鼠标移过去显示:该架构不存在或者我无权使用,但是对于执行却没有影响。查资料查到一个是说权限问题,我改了权限也没用(这个权限问题应该是执行不了的情况),反正执行也没影响我就这么做下来了,但是还是好奇

发布了4 篇原创文章 · 获赞 5 · 访问量 2308

猜你喜欢

转载自blog.csdn.net/qq_44871112/article/details/104683353