SQL练习6 - INSERT / UPDATE / DELETE / NULL / VIEW

插入数据:

SQL的数据插入语句INSERT通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组。
1、插入元组:
插入元组的INSERT语句格式为:
INSERT
INTO<表名>[(<属性列1>[,<属性列2>]…)]
VALUES(<常量1>[,<常量2>]…)
其功能是将新元组插入指定表中。其中新元组的属性列1的值为常量1,属性列2的值为常量2。INTO子句中没有出现的属性列,新元组在这些列上会去空值。但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值,否则会出错。如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。
【例3.69】将一个新学生元组(学号:201215132,姓名:温宁,性别:女,所在系:IS,年龄:18岁)插到Student表中。

INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215132','温宁','女','IS',18)

SELECT *
FROM Student

在这里插入图片描述
在INTO子句中指出了表名Student,并指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样。VALUES子句对新元组的各个属性赋值,字符串常量要用单引号括起来
【例3.70】将学生张成民的信息插入到Student表中

INSERT
INTO Student
VALUES('201215133','张成民','男',18,'CS')

SELECT *
FROM Student

在这里插入图片描述
与例3.69不同的是,在该例的3.70中INTO子句只指出了表名,没有指出属性名,所以在这种情况下VALUES子句中的值应该是与Student表中的属性列相对应,如果不对应,那么可能会出现数据类型不匹配的错误
【例3.71】插入一条选课记录(‘201215132’,‘1’)

INSERT
INTO SC(Sno,Cno)
VALUES('201215132','1')

SELECT *
FROM SC

在这里插入图片描述
此时系统自动的为未输入的Grade列赋值为NULL
2、插入子查询结果:
子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,还可以嵌套在INSERT语句中用以生成插入的批量数据
插入子查询结果的INSERT语句格式为:
INSERT
INTO<表名>[(<属性列1>[,<属性列2>…])]
子查询
【例3.72】对每一个系,求学生的平均年龄,并把结果存入数据库

/*首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄*/
CREATE TABLE Dept_age
	  (Sdept CHAR(15),
	  Avg_age SMALLINT)
/*对Student表按系分组求平均年龄,再把系名和平均年龄存入新表中*/
INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept

在这里插入图片描述
注意:输入的属性列应当有逗号分隔
在这里插入图片描述
课本里面没有逗号,照着敲会出错

修改数据:

修改操作又叫更新操作,其语句格式为:
UPDATE<表名>
SET<列名>=<表达式>[,<列名>=<表达式>]
[WHERE<条件>]
其功能是修改指定表中满足WHERE子句条件的元组。其中SET子句给出的<表达式>的值用于取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组
1、修改某一个元组的值
【例3.73】将学生201215121的年龄改成22岁

UPDATE Student
SET Sage=22
WHERE Sno='201215121'

SELECT *
FROM Student
WHERE Sno='201215121'

在这里插入图片描述
2、修改多个元组的值
【例3.74】将所有学生的年龄增加1岁

UPDATE Student
SET Sage=Sage+1

SELECT *
FROM Student

执行前:
在这里插入图片描述
执行后:
在这里插入图片描述
3、带子查询的修改语句:
子查询也可以嵌套在UPDATE语句中,用以构造修改的条件
【例3.75】将计算机科学系全体学生的成绩置零

UPDATE SC
SET Grade=0
WHERE Sno IN
		(SELECT Sno
		FROM Student
		WHERE Sdept='CS'
		)

SELECT *
FROM SC

在这里插入图片描述
置零以后记得把他们再补回来,方便进行下面的操作

删除数据

删除数据的语句格式如下:
DELETE
FROM<表名>
[WHERE<条件>]
DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句那么就是表示删除表中的全部元组,但表的定义仍再字典中。DELETE语句删除的是表中的数据,而不是关于表的定义
1、删除某一个元组的值
【例3.76】删除学号为201215133的学生记录

DELETE
FROM Student
WHERE Sno='201215133'

SELECT *
FROM Student

在这里插入图片描述
删除多个元组的值
【例3.77】删除Dept_age表中的数据

DELETE
FROM Dept_age

SELECT *
FROM Dept_age

在这里插入图片描述
这条DELETE语句将使SC成为空表,它删除了SC的所有元组
【例3.78】删除计算机科学系所有学生的选课记录

DELETE
FROM SC
WHERE Sno IN
		(SELECT Sno
		FROM Student
		WHERE Sdept='CS')

在这里插入图片描述
课本里面写的是“SELETE”,会报错,应该是“SELECT”

空值的处理

所谓的空值(NULL)就是指“不知道”或者是“不存在”或“无意义”的值,NULL不等于0。
空值的产生
【例3.79】向SC表中插入一个元组,学号是“201215132”,课程号是“3”,成绩为空

INSERT INTO SC(Sno,Cno,Grade)
VALUES('201215132','3',NULL)
/*等价于*/
INSERT INTO SC(Sno,Cno,Grade)
VALUES('201215132','3')

【例3.80】将Student表中的学生号为“201215131”的学生的所属系改为空

UPDATE Student
SET Sdept=NULL
WHERE Sno='201215131'

SELECT *
FROM Student
WHERE Sno='201215131'

在这里插入图片描述
2、空值的判断
判断一个属性的值是否为空,可以用IS NULL或IS NOT NULL来表示
【例3.81】从Student表中找出漏填了的数据的学生信息

SELECT *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL

在这里插入图片描述
3、空值的算术运算、比较运算和逻辑运算
空值和另一个值的算术运算为空值
空值与另一个值得比较运算的结果为UNKNOWN。下面是逻辑运算符真值表
在这里插入图片描述
查询语句中只有使用WHERE和HAVING子句的选择条件为TRUE的元组才会被选出作为输出条件
【例3.82】找出选修1号课程的不及格学生

SELECT Sno
FROM SC
WHERE Grade<60 AND Cno='1'

在这里插入图片描述
这里选出的学生是那些参加了考试(Grade属性为非空)而不及格的学生,不包括那些缺考的学生,因为前者使条件Grade<60的值为TRUE,但是后者使条件的值为UNKNOWN
【例3.83】选出选修1号课程的不及格学生以及缺考的学生
解法一:

SELECT Sno
FROM SC
WHERE Cno='1' AND(Grade<60 OR Grade IS NULL)

解法二:


SELECT Sno
FROM SC
WHERE Cno='1' AND Grade<60 
UNION
SELECT Sno
FROM SC
WHERE Cno='1' AND  Grade IS NULL

在这里插入图片描述

定义视图

1、建立视图
SQL语言用CREATE VIEW命令建立视图,其格式为:
CREATE VIEW<视图名>[(<列名>[,<列名>]…)]
AS<子查询>
[WITH CHECK OPTION]
其中的子查询可以是任意的SELECT语句。WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或者删除的行满足视图定义中的谓词条件。
组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性列名,则隐含该视图由子查询中的SELECT子句目标列中的字段组成。但在下面的三种情况下必须明确指定组成视图的所有列名:
(1)某个目标列不是单纯的属性名,而是聚集函数或列表达式
(2)多表连接的时候选出了几个同名列作为视图的字段
(3)需要在视图中为某个列启用新的更合适的名字
【例3.84】建立信息系学生的视图

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'

查询视图的时候可见:
在这里插入图片描述
【例3.85】建立信息系学生的视图,并要求进行修改和插入操作时需要保证该视图只有信息系的学生

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION

在这里插入图片描述
出现【ERROT】数据库中已存在名为 ‘IS_Student’ 的对象。的解决方法:【ERROT】数据库中已存在名为 ‘IS_Student’ 的对象。
由于再定义IS_Student视图的时候加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动加上Sdept='IS’的条件
如果一个视图是从单个基本表导出来的,并且只是去掉了基本表的某些行和某些列,但是保留了主码,则称这类视图为行列子集视图。IS_Student视图就是一个行列子集视图。
视图不仅可以建立在单表上,还可以建立在多表上。
【例3.86】建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)

CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept='IS' AND
	  Student.Sno=SC.Sno AND
	  SC.Cno='1'

在这里插入图片描述
视图不仅可以建立再单表或者多表上,还可以建立在一个或者是多个已定义好的视图上,或者建立在基本表与视图上
【例3.87】建立信息系选修了1号课程且成绩在90分以上的学生的视图

CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90

在这里插入图片描述
【例3.88】定义一个反映学生出生年份的视图

CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2014-Sage
FROM Student

在这里插入图片描述
【例3.89】将学生的学号及平均成绩定义为一个视图

CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno

在这里插入图片描述
【例3.90】将Student表中的所有女生都记录定义为一个视图

CREATE VIEW F_Student(F_sno,name,sex,age,dept)
AS
SELECT *
FROM Student
WHERE Ssex='女'

在这里插入图片描述
2、删除视图
删除视图的格式为:
DROP VIEW <视图名>[CASCADE]
视图删除后视图的定义将从数据字典中删除。如果视图上还导出其他的视图,则使用CASCADE删除语句,把该视图和由它导出的所有视图一起删除了

DROP VIEW BT_S
DROP VIEW IS_S1

【例3.91】删除视图BT_S和视图IS_S1

DROP VIEW BT_S
DROP VIEW IS_S1 CASCADE

3、查询视图
【例3.92】在信息系的学生视图中找到年龄小于20岁的学生

SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20

在这里插入图片描述
【例3.93】查询选修了1号课程的信息系的学生

SELECT IS_Student.Sno,Sname
FROM IS_Student,SC
WHERE IS_Student.Sno=SC.Sno AND SC.Cno='1'

在这里插入图片描述
【例3.94】在视图S_G视图中查询平均成绩在90分以上的学生的学号和平均成绩

SELECT *
FROM S_G
WHERE Gavg>=90

在这里插入图片描述
4、更新视图
【例3.95】将信息系学生视图IS_Student中学号为“201215128”的学生姓名改为“刘辰”

UPDATE IS_Student
SET Sname='刘辰'
WHERE Sno='201215128'

在这里插入图片描述
【例3.96】向信息系学生视图IS_Student中插入一个新的学生记录,其中学号为“201215133”,姓名为“赵新”,年龄为20岁

INSERT 
INTO IS_Student
VALUES('201215133','赵新',20)

【例3.97】删除信息系学生视图IS_Student中学号为“201215130”的记录

DELETE
FROM IS_Student
WHERE Sno='201215130'

在这里插入图片描述

第三章总结:

第三章为关系数据库标准语言SQL。主要内容为数据的定义,数据的删除,数据的查询,数据的控制还有视图。
本章的重点内容和细节比较多,需要多次复习回顾。而且在其中有T-SQL与SQL不同之处,需要自行进行实验。

体会:

做完作业以后,我觉得我的腰好疼(T ^ T)

发布了74 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44652687/article/details/105043276