悬赏跪求SQL三表查询问题

2024-11-26 10:42:55
推荐回答(5个)
回答1:

--首先 这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不就可以了么

回答2:

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就停止搜索,并按照降序输出该学员的姓名

以上为全部解答,其实第一问刚开始理解是很困难的,多那几张表多思考下就会熟悉了。

回答3:

答案
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

)

回答4:

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这些函数。具体你去看看数据库相关的教程

回答5:

这个问题事实还简单!你可以用最简单的办法!先分别创建这3个表!在用视图添加加3个表,加上过滤条件就ok!