MYSQL集合除法

MYSQL集合除法

集合除法 ,以下是SC数据表,原题:检索选修课程包括“1042”学生所学的课程的学生学号。【也就是说:1042学生选修了1和2,查找还有哪些学生选修的课程中同时包含1和2。】

下面是关系代数表达式:

πSno,Cno(SC)÷πCnoSno=1042(SC))

下面是mysql的具体实现方法:

select distinct sno from SC as s1 where not exists(
select cno from SC s2 where sno=1042 and s2.cno not in 
(select cno from SC s3 where s1.sno = s3.sno));

对于实现方法的分析:

select distinct sno from SC as s1,选出当前学员的学号
select cno from SC s2 where sno=1042,是用于找出学号是1042选修的课程都有哪些。
(select cno from SC s3 where s1.sno = s3.sno),是用于找出当前学号所选修的所有课程。

s2.cno not in,是让1042学员选修课程的集合与当前学员选修课程做差集。如果差集为空集,证明当前学员也至少选修了1042所选修的所有课程;如果不为空集,则说明当前学员至少没有选修1042员选修的课程中的一个。

下面是SC表中数据:

mysql> select * from SC;
+——+——+——-+
| sno | cno | grade |
+——+——+——-+
| 3001 | 1 | 93 |
| 3001 | 2 | 84 |
| 3001 | 3 | 84 |
| 3002 | 2 | 83 |
| 3002 | 3 | 93 |
| 1042 | 1 | 84 |
| 1042 | 2 | 82 |
+——+——+——-+
7 rows in set (0.00 sec)

Comments are closed.