章节3.4.4 — 3.7.3
文章目录
一、集合查询
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。需要注意:各结果的列数、对应项的数据类型必须相同。主要有以下操作:
并操作 UNION
交操作 INTERSECT
差操作 EXCEPT
例题1:查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
//使用 UNION时,系统会自动去掉重复元组;可用 UNION ALL操作符保留重复元组。
例题2:查询选修了课程1或者选修了课程2的学生。
SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;
例题3:查询选修了课程1或者选修了课程2的学生。
SELECT Sno
FROM SC
WHERE Cno='1'
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2';
例题4:查询计算机科学系的学生 与 年龄不大于19岁的学生的交集。
SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage<=19;
二、基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这是子查询生成的临时派生表成为主查询的查询对象。如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其默认属性。
例题1:查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student,(SELECT Sno FROM SC WHERE Cno='1')AS SC1
WHERE Student.Sno=SC1.Sno;
通过FROM子句生成派生表时,AS关键字可以省略,但必须为一个派生关系指定一个别名。
三、数据更新
1.插入数据
1)插入元组
INSERT into SC values ('123456789',‘1’,80);
//按照表的构成填入数据,需要注意要保持数据类型不变
INSERT into SC(Cno,Sno) values ('1','123456789');
//按照指定顺序填入,未指定的默认为 NULL
2)插入子查询结果
语句格式:
INSERT
[INTO] <表名> [<属性列1&g