数据库作业7:SQL Server 的部分操作(集合查询、数据更新、空值处理、视图)

四.集合查询

多个 SELECT 语句的结果可以进行 集合操作 。 集合操作主要包括 并操作 UNION交操作 INTERSECT差操作 EXCEPT

【例3.64】 查询计算机科学系的学生 年龄不大于19岁的学生。

即为查询计算机科学系的全体学生 和 其他系年龄不大于19岁的学生。

SELECT *
FROM Student
WHERE Sdept = 'CS'
UNION
SELECT *
FROM Student
WHERE Sage <= 19;

查询结果:
在这里插入图片描述

【例3.65】 查询选修了课程1 或者 选修了课程2的学生。

SELECT Sno
FROM SC
WHERE Cno = '1'
UNION
SELECT Sno
FROM SC
WHERE Cno = '2'

查询结果:
在这里插入图片描述
用完整的SC表作为对照:
在这里插入图片描述

【例3.66】 查询计算机科学系的学生 年龄不大于19岁的学生的交集。

即查询计算机科学系的年龄不大于19岁的学生。

SELECT *
FROM Student
WHERE Sdept = 'CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage <= 19;

查询结果:
在这里插入图片描述
用完整的Student表作为对照:
在这里插入图片描述

【例3.67】 查询 选修了课程1 选修了课程2的学生。就是查询选修课程1的学生集合与选修课程2的学生集合的交集。

SELECT Sno
FROM SC
WHERE Cno='1' 
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2';

用嵌套循环表示:

SELECT Sno
FROM    SC
WHERE Cno='1' AND Sno IN
      (SELECT Sno
       FROM SC
       WHERE Cno='2');

查询结果为:

在这里插入图片描述
注意! : 数字与单引号之间不要加多余的空格,不然结果为空也不会报错。

【例 3.68】 查询计算机科学系的学生与年龄不大于19岁的学生的 差集

SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT  *
FROM Student
WHERE Sage <=19;

查询结果为:
在这里插入图片描述

就是查询计算机科学系中年龄大于19岁的学生

SELECT *
FROM Student
WHERE Sdept= 'CS' AND  Sage>19;

结果同上。

五.基于派生表的查询

子查询 不仅可以出现在 WHERE 子句中,还可以出现在 FROM 子句中,这时子查询生成的 临时派生表 成为主查询的查询对象。

----------【例3.57】找出每个学生超过他自己选修课程平均成绩的课程号,可以用如下查询完成:

SELECT Sno, Cno
FROM SC, (SELECT  Sno, Avg(Grade)  ---实际并不存在的表
          FROM   SC 
    	  GROUP BY   Sno)
          AS   Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno
       and SC.Grade >=Avg_sc.avg_grade

查询结果为:
在这里插入图片描述
若去掉最后一行 and SC.Grade >=Avg_sc.avg_grade 语句,则为找出每个学生选修课程的课程号。
SQL语句为:

SELECT Sno, Cno
FROM SC, (SELECT  Sno, Avg(Grade)  
          FROM   SC 
    	  GROUP BY   Sno)
          AS   Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno

查询结果为:
在这里插入图片描述

----------【例3.60】查询所有选修了1号课程的学生姓名,可以用如下查询完成:

SELECT Sname
FROM  Student,  
     (SELECT Sno FROM SC WHERE Cno='1') AS SC1
WHERE  Student.Sno=SC1.Sno;

通过 FROM 子句生成派生表时, AS 关键字可以省略,但 必须为派生关系指定一个别名,例该例题中的SC1不可省

故等价于:


                
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值