插入数据:
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)