mysql 怎么求两个集合的合集?

mysql 怎么求两个集合的合集?,第1张

我的想法是:用Union all

你试一下,我没数据,没办法测试:

select id, sum(num)

from ((select id, sum(num) num from tables1 group by id) union all (select id, sum(num) num from tables2 group by id)) a group by id

在sql语言里"存在"exists子句是非常不好理解的。

exists子句有两种用法,一种为独立exists子查询,另一种是父子关联子查询。前者对父查询不构成筛选作用,子查询若果有记录存在的话则输出所有的父查询记录集,反之则父查询输出空记录集。后者会对父查询构成筛选作用,不使用not关键字的情况下输出父查询中与子查询的交集,而使用not时则输出父查询中与子查询的非交集。至于如何判断exists子查询属于独立还是父子关联查询,以及为什么父子关联exists子查询会对父查询构成筛选作用,解释起来需要很大的篇幅这里就不讲了。反正我们记住父子关联查询的最常用功能就是它可以求出两张表的交集或非交集(使用not关键字)和不使用group分组的情况下求出某张表的最大值或最小值。

现在回到题主的具体问题上,这个问题涉及到三张表,学生表student、选课表sc、课程表course。

提问要求列出选取了所有课程的学生名单。

下面是提问中给出的sql语句:

select sname from student

where not exists(

select * from course

where not exists(

select * from sc

where sno=student.sno

and cno=course.cno))

从该语句我们看到它使用了两个嵌套父子关联不存在判断not exists子句,显然是要通过求非交集的方法查出选修了所有课程的学生名单。

一个学生如果他至少有一门课程没有选修,那么他在课程表里就会存在与选课表的非交集,我们姑且称之为“未选所有课程学生名单子集”,它由内层的not exists选出

...

select * from course

where not exists(

select * from sc

sno=student.sno

and cno=course.cno) ...

这个内层父子关联存在子查询选出课程表里与选课表的非交集,最内层选课表sc的课程号cno、学号sno分别与第二层父表course课程的cno、最外层父表studen学生表的sno进行对等连接,不存在对等的记录即为非交集,从而筛选出“未选所有课程学生名单子集”。

...未完待续

你要合并到哪?那就合并到C库的 test表吧

create table C.test like A.c----复制表结构,这样会复制外键,索引,主键之类 ,其他方式不行

insert into C.test (select * from A.c union all select * from B.c) 插入这两个表的合集(union all 可以去重)

如果有语法问题请追问


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/7426039.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-05
下一篇2023-04-05

发表评论

登录后才能评论

评论列表(0条)

    保存