标题:一个查询问题 自己写的代码 不知道对不对 还请指教
只看楼主
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
已结贴  问题点数:20 回复次数:8 
一个查询问题 自己写的代码 不知道对不对 还请指教
[附件]89  147[/附件]  查询所有学生都选修的 课程号 和课程名  select cno,cname from course where cno in (select cno from sc where sno in (select sno from student))  这行代码对不




sc是成绩表

[此贴子已经被作者于2017-3-30 19:28编辑过]

搜索更多相关主题的帖子: 成绩表 
2017-03-30 19:27
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:20 
要看你的课程表是怎么记录的.
查询所有的学生都选修的课程,你上面的好像不行.
2017-03-30 20:53
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 2楼 mywisdom88
   我感觉也不对 没考虑人数。。。
2017-03-30 23:17
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
-- 课程表(课号,名称)
if object_id('tempdb..#课程表') is not null drop table #课程表
create table #课程表(课号 varchar(4),课程 varchar(20))

insert into #课程表
select 'K001','语文' union all
select 'K002','英语' union all
select 'K003','数学' union all
select 'K004','生物' union all
select 'K005','地理'

-- 学生表(学号,姓名)
if object_id('tempdb..#学生表') is not null drop table #学生表
create table #学生表(学号 varchar(4),姓名 varchar(20))

insert into #学生表
select 'S001','张三' union all
select 'S002','李四' union all
select 'S003','王五' union all
select 'S004','赵六' union all
select 'S005','陈七'

-- 选修表(课号,学号)
if object_id('tempdb..#选修表') is not null drop table #选修表
create table #选修表(课号 varchar(4),学号 varchar(4))

insert into #选修表
select 'K001','S001' union all
select 'K001','S002' union all
select 'K001','S003' union all
select 'K001','S004' union all
select 'K001','S005' union all
select 'K002','S001' union all
select 'K002','S003' union all
select 'K002','S005' union all
select 'K003','S001' union all
select 'K003','S002' union all
select 'K003','S003' union all
select 'K003','S004' union all
select 'K003','S005' union all
select 'K004','S002' union all
select 'K004','S003' union all
select 'K004','S005' union all
select 'K005','S001' union all
select 'K005','S002' union all
select 'K005','S003'


-- 查所有人都选修的课程,用课号关联,选修数过滤
select x.课号,k.课程,k.选修数
from (select 课号,选修数=count(课号) from #选修表 group by 课号)x
left join (select 课号,课程,选修数=(select count(学号) from #学生表) from #课程表)k on x.课号=k.课号
where x.选修数=k.选修数
--查询结果
课号    课程    选修数
K001    语文    5
K003    数学    5


[此贴子已经被作者于2017-3-31 11:12编辑过]

2017-03-31 11:10
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 4楼 mywisdom88
select x.课号,k.课程,k.选修数
from (select 课号,选修数=count(课号) from #选修表 group by 课号)x
left join (select 课号,课程,选修数=(select count(学号) from #学生表) from #课程表)k on x.课号=k.课号
where x.选修数=k.选修数
 
 from后面不应该是跟的表的名称吗?  怎么是这个(select 课号,选修数=count(课号) from #选修表 group by 课号)
 还有 (select 课号,选修数=count(课号) from #选修表 group by 课号)x 后面加个x是什么意思??
2017-03-31 12:35
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
-- 步骤1,把每个课程应该选修的数量加到课程表去,得到这样的表结构(课号,课程,选修数)
select 课号,课程,选修数=(select count(学号) from #学生表) from #课程表

-- 步骤2,根据选修表,统计每个课程实际选修的数量,得到这样的表结构(课号,选修数)
select 课号,选修数=count(课号) from #选修表 group by 课号

-- 步骤3,通过用 课号关联,选修数过滤,x和k都是表的别名,上面2个步骤组合起来,就是下面的。
select x.课号,k.课程,k.选修数
from (select 课号,选修数=count(课号) from #选修表 group by 课号)x
 left join (select 课号,课程,选修数=(select count(学号) from #学生表) from #课程表)k on x.课号=k.课号
where x.选修数=k.选修数



[此贴子已经被作者于2017-3-31 16:04编辑过]

2017-03-31 15:42
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 6楼 mywisdom88
   恩  懂了 谢谢 你 if object_id('tempdb..#学生表') is not null drop table #学生表 这一句什么意思?
2017-03-31 17:06
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
以下是引用花脸在2017-3-31 17:06:40的发言:

   恩  懂了 谢谢 你 if object_id('tempdb..#学生表') is not null drop table #学生表 这一句什么意思?
因为我们要测试,在测试的时候,经常这样的
就是说,如果 临时表 #学生表 存在,就删除他
2017-03-31 19:21
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 8楼 mywisdom88
恩  好吧 我们没学 还 才开始学sql
没多少时间  多谢您的指导。
2017-03-31 21:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475663-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060144 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved