悬赏跪求SQL三表查询问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了悬赏跪求SQL三表查询问题相关的知识,希望对你有一定的参考价值。

建立三个表
S(S#,SN,SD,SA) S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄
C(C#,CN) C#,CN分别代表课程编号,课程名称
SC(S#,C#,G) S#,C#,G分别代表学号,所选修的课程编号,学习成绩
1:使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位。
2:查询选修课程超过五门的学员学号和所属单位。
务必麻烦大侠们用中文把语句详细解释一下,我有分追加。提前谢过。

--首先 这2个题目可以有一样的解题思路
--我们来看语句

--使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位。
select 学员姓名,所属单位
from s join sc on s.s#=sc.s#
group by 学员姓名,所属单位
having COUNT(c#)=(select COUNT(c#) from c)

--查询选修课程超过五门的学员学号和所属单位。
select 学员学号,所属单位
from s join sc on s.s#=sc.s#
group by 学员学号,所属单位
having COUNT(c#)>5

看到上面2个语句的相同点了么 都是利用分组后过滤的方法

步骤:
1。首先利用表联接将学生表和选课表连接起来 通过学号(没问题的吧?)
2。用学号(或者学生姓名)+单位分组
3。然后使用 having count(c#)这个条件 它表示对于 每个 学员学号(或者学员姓名),所属单位的分组统计个数
也就是统计选修的课程数
4。再看后面的比较条件
第一个题目 是“全部课程” 利用子查询(select COUNT(c#) from c)就可以算出全部的课程数 那么只要组里的统计个数等于它 不就是选秀全部课程了么?
第二个题目 是“超过5门” 更加简单不用子查询 直接一个5不就可以了么
参考技术A 1.这个题目是SQL里面比较经典的一类,使用双嵌套not exists来实现带全称量词的查询 相当于“for all”
Select SN,SD from S /*某学生一点选了全部课程
where not exists /*否定 即没有一门课程是他不选的
( Select * /*再否定,某学生为选任意一门课程
from C
where not exists /*否定某位学生选某课程
(Select * /*某学生选了某课
from SC
Select * from SC where SC.S#=S.S# and SC.C#=C.C# ));

2.Select SN,SD from S /*查询满足条件的学员学号和所属单位
where S# in (
Select S# from SC /*要求学员姓名落在满足某个条件的区间里面
group by S# having count(*)>5));/*在SC表里面数学员姓名(由于学员姓名不是SC表的主键,所以,当学员姓名出现几次就代表该学员选了几次课程)当学员姓名数满足5就停止搜索,并按照降序输出该学员的姓名

以上为全部解答,其实第一问刚开始理解是很困难的,多那几张表多思考下就会熟悉了。本回答被提问者采纳
参考技术B 答案
1.集合除法操作:在S表中查找学生,在C中不存在一门课程这个学生没有学(也就是所有课程都选了)。
Select SN,SD from S where
not exists (
Select * from C where not exists(
Select * from SC where SC.S#=S.S# and SC.C#=C.C# )
)
这题也可以使用 not in来解决。
2.Select SN,SD from S where
S# in (
Select S# from SC group by S# having count(*)>5

)
参考技术C 1 select s.sn,s.sd from (select * from sc) where c.s#=sc.s#
2 select s.s#,s.sd from (select count(*)=5 from sc) where c.s#=sc.s#
其实最好用left join ,right join,inner join .outer join, full outer join,cross join这些函数。具体你去看看数据库相关的教程
参考技术D 这个问题事实还简单!你可以用最简单的办法!先分别创建这3个表!在用视图添加加3个表,加上过滤条件就ok!

mysql 三表联合查询

A表 id cid title
B表 id cid title
(AB表的结构一样)
C表 cid cname
C表示AB两个的分类表,AB两个都使用的C表的分类,问题来了
查询cid=1的内容?
select * from a where cid=1 和select * from b where cid=1 这两sql可以组合一起吗?

使用UNION联合两个语句即可:
select * from a where cid=1
UNION
select * from b where cid=1
参考技术A select * from a as a, b as b where a.cid=b.cid and a.cid=1
是这样吗?追问

不行的,它会把A表和B表的字段都一起列出来作为一条记录
查询结果是
第1条记录:id cid title id cid title
第2条记录:id cid title id cid title
....

追答

2个Sql组合 就用UNION
select * from a where cid=1
UNION
select * from b where cid=1

以上是关于悬赏跪求SQL三表查询问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql 三表联合查询

求三表联合查询的SQL查询语句

求三表联合查询的SQL查询语句

求SQLServer三表联查分页语句,急求!!!!

mysql三表查询sql语句

sql多表链接之三表连接查询