注册 登录
编程论坛 SQL Server论坛

一个查询问题 自己写的代码 不知道对不对 还请指教

花脸 发布于 2017-03-30 19:27, 1712 次点击
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
[附件]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编辑过]

8 回复
#2
mywisdom882017-03-30 20:53
要看你的课程表是怎么记录的.
查询所有的学生都选修的课程,你上面的好像不行.
#3
花脸2017-03-30 23:17
回复 2楼 mywisdom88
   我感觉也不对 没考虑人数。。。
#4
mywisdom882017-03-31 11:10
-- 课程表(课号,名称)
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编辑过]

#5
花脸2017-03-31 12:35
回复 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是什么意思??
#6
mywisdom882017-03-31 15:42
-- 步骤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编辑过]

#7
花脸2017-03-31 17:06
回复 6楼 mywisdom88
   恩  懂了 谢谢 你 if object_id('tempdb..#学生表') is not null drop table #学生表 这一句什么意思?
#8
mywisdom882017-03-31 19:21
以下是引用花脸在2017-3-31 17:06:40的发言:

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