查询只选修了"程序设计"和"数据库"两门课程的学生学号

游戏人间 2015-01-26 10:42:23
查询只选修了"程序设计"和"数据库"两门课程的学生学号

表介绍
STUDENT(S#,SNAME,SAGE,SSEX) -->学生表(学号,姓名,年龄,性别)
COURSE(C#,CNAME,T#) -->课程表(课程编号,课程名称,教师编号)
SC(S#,C#,SCORE) -->成绩表(学号,课程编号,成绩)
TEACHER(T#,TNAME) -->教师表(教师编号,教师名称)
...全文
1936 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zebro1573 2015-02-04
  • 打赏
  • 举报
回复
select st.id from student st inner join score sc on st.id=sc.id left join course co on sc.c_id=co.id where st.id in( select st.id from student st inner join score sc on st.id=sc.id left join course co on sc.c_id=co.id group by st.id having COUNT(st.id)>1 ) group by st.id
紫枫昵 2015-01-28
  • 打赏
  • 举报
回复
select distinct s# from sc a left outer join course b on a.c#=b.c# where b.CNAME in('程序设计','数据库')--选出所有带有程序设计,数据库的人 and a.s# in (select s# from sc group by s# having count(S#)=2)--在这些人中,只有二条的人
hepe00 2015-01-28
  • 打赏
  • 举报
回复
调整:
SELECT * 
FROM STUDENT AS S
WHERE NOT EXISTS(SELECT 1 FROM SC AS SC
					JOIN COURSE AS C ON SC.C#=C.C# 
					WHERE S.S#=SC.S# AND CNAME NOT IN('程序设计','数据库'))
	AND EXISTS(SELECT 1 FROM SC AS SC
				WHERE S.S#=SC.S#
				GROUP BY SC.S#
				HAVING COUNT(SC.C#)=2)
hepe00 2015-01-28
  • 打赏
  • 举报
回复
引用 4 楼 wonderfuly 的回复:
这道题真的还是有难度。 你们最好弄一些数据测试一下。 目测了一下一楼可能是正确的。其它都错了。
这个题目,使用逆反的思维就清楚了,你的命题反过来就是:不存在选课不在“程序设计”和“数据库”的学生。 --STUDENT(S#,SNAME,SAGE,SSEX) -->学生表(学号,姓名,年龄,性别) --COURSE(C#,CNAME,T#) -->课程表(课程编号,课程名称,教师编号) --SC(S#,C#,SCORE) -->成绩表(学号,课程编号,成绩) ;WITH STUDENT(S#,SNAME,SAGE,SSEX) AS ( SELECT '1001','A',20,'Boy' union all select '1002','B',23,'Girl' union all select '1003','C',25,'Girl' ) ,COURSE(C#,CNAME,T#) as ( select 'C001','程序设计','t001' union all select 'C002','数据库','t001' union all select 'C003','数学','t001' union all select 'C004','语文','t001' union all select 'C005','地理','t001' union all select 'C006','计算机','t001' union all select 'C007','物理','t001' union all select 'C008','化学','t001' ) ,SC(S#,C#,SCORE) as ( select '1001','C001',60 UNION ALL select '1001','C002',60 UNION ALL select '1002','C001',60 UNION ALL select '1002','C002',60 UNION ALL select '1001','C005',60 UNION ALL select '1003','C008',60 ) SELECT * FROM STUDENT AS S WHERE NOT EXISTS(SELECT 1 FROM SC AS SC JOIN COURSE AS C ON SC.C#=C.C# WHERE S.S#=SC.S# AND CNAME NOT IN('程序设计','数据库')) --输出---------------- ---- S# SNAME SAGE SSEX ---- ----- ----------- ---- 1002 B 23 Girl
江南小鱼 2015-01-28
  • 打赏
  • 举报
回复
with COURSE(C#,CNAME,T#) as
(
 select 10001,'数据库','01' union all
 select 10002,'程序设计','02' union all
 select 10003,'C++编程','03' union all
  select 10004,'Java程序设计','05' union all
   select 10005,'软件工程','04' union all
    select 10006,'科学发展观','06' 
),SC(S#,C#,SCORE) as
(
 select '2001',10001,90 union all
 select '2002',10001,40 union all
 select '2009',10003,78 union all
 select '2003',10003,60 union all
 select '2011',10006,100 union all
 select '2002',10002,60 union all
 select '2045',10002,68 union all
 select '2008',10004,98 union all
 select '2100',10006,76 union all
 select '2102',10001,53
)
select y.S#
from COURSE x,SC y
where x.C# = y.C# and x.CNAME IN('数据库','程序设计')
GROUP BY y.S# HAVING COUNT(y.S#) = 2
江南小鱼 2015-01-28
  • 打赏
  • 举报
回复
select x.S#
from COURSE x,SC y
where x.C# = y.C# and x.CNAME IN('数据库','程序设计')
GROUP BY x.S# HAVING COUNT(x.S#) = 2
江南小鱼 2015-01-28
  • 打赏
  • 举报
回复
你的问题就是查询:仅有课程设计和数据库两门课成绩的学生
select S# 
from SC x,
 (select c#,COUNT(*) cou from COURSE WHERE CNAME in ('程序设计','数据库') GROUP BY c# HAVING COUNT(1) = 2)  y
 where x.c#=y.C#
游戏人间 2015-01-27
  • 打赏
  • 举报
回复
这道题真的还是有难度。 你们最好弄一些数据测试一下。 目测了一下一楼可能是正确的。其它都错了。
xxfvba 2015-01-27
  • 打赏
  • 举报
回复
select S# from SC a, (select c#,COUNT(*) cou from course where cname in ('程序设计','数据库') group by c# having COUNT(*)=2)b where a.c#=b.C# group by S# having COUNT(*)=2
hepe00 2015-01-26
  • 打赏
  • 举报
回复
SELECT * 
FROM STUDENT AS S
WHERE NOT EXISTS(SELECT 1 FROM SC AS SC 
				JOIN COURSE AS C ON SC.C#=C.C# 
				WHERE S.S#=SC.S# AND CNAME NOT IN('程序设计','数据库'))
Neo_whl 2015-01-26
  • 打赏
  • 举报
回复

    select s# from student s
                        where exists(
                        select s# from sc 
                                         where exists(select c# from course c where c#=sc.c# and cname in ('程序设计','数据库管理') ) and s#=s.s# group by s# having count(c#)=2)
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
SELECT S.S#
FROM STUDENT S
	JOIN SC ON S.S#=SC.S#
	JOIN COURSE C ON SC.C#=C.C#
GROUP BY S.S#
HAVING SUM(CASE WHEN C.CNAME IN('程序设计','数据库') THEN 1 END)=2
	AND COUNT(C.C#)=2
另外,还可以用EXISTS NOT EXISTS
乐山师范学院数据库编程期末答疑,卷子讲解,SQL server相关 如下是一个简化的员工考勤应用E-R图,请在SQL Server中创建名为YQKG的数据库,包括两个数据文件,一个日志文件,文件名按SQL Server对象命名规范定义,数据文件按10%的比例增长,数据库定义完成后输入如下样本数据。完成后请将新定义的对象及数据生成到脚本文件3_1.sql,并分离数据库。(数据表标识说明:BMXX 部门信息,QQLX 考勤类型, JBXX 基本信息,各字段定义请根据实际语义自行定义)。 2. 运行CreateTeaching.sql在系统数据库tempdb中生成解答用数据库对象,完成如下安全定义。每小题2分,共6分。 (1) 创建名为L+考生学号的登录名,密码为考生学号。完成后请将定义程序代码保存到脚本文件3_2_1.sql。 (2) 为tempdb数据库创建名为U+考生学号的带登录名的用户名,使用本题(1)中创建的登录名。完成后请将定义程序代码保存到脚本文件3_2_2.sql。 (3) 为学生表Student、课程表Course、教师表Teacher分配只读权限,成绩表分配读写权限。完成后请将程序代码保存到脚本文件3_2_3.sql。 3.运行CreateTeaching.sql在系统数据库tempdb中生成解答用数据库对象,完成如下完整性定义。每小题4分,共12分 (1) 在SC与Teacher之间定义参照完整性,外码名为FK_SC_Teacher_Tno,并定义违约处理规则:修改规则为 Cascade,删除规则为 No Action。完成后请将本操作的程序保存到脚本文件3_3_1.sql。 (2) 学生表Student中学生姓名不允许重复,将此规则保存为UQ_Sname。完成后请将本操作的程序保存到脚本文件3_3_2.sql。 (3) 在学生表上规定学生的性别只能是“男”、“女”,将此规则保存为CK_Student_Ssex。完成后请将本操作的程序保存到脚本文件3_3_3.sql。 4. 运行CreateTeaching.sql在系统数据库tempdb中生成解答用数据库对象,在SSMS中查询分析器中设计并调试如下查询,把SQL脚本代码分别保存到指定的SQL程序文件中。每小题3分,共15分 (1) 新增一位同学:200215129,王大鹏,男,23,CS,新增该生一条选课数据:该生选了数据库课程,该课主教教师未知,还未考试。完成后请将查询代码保存到脚本文件3_4_1.sql。 (2) 修改少数民族学生李勇所有选修课成绩,都加5分。完成后请将查询代码保存到脚本文件3_4_2.sql。 (3) 因为考试事故,删除计科系的所有选课信息。完成后请将查询代码保存到脚本文件3_4_3.sql。 (4) 查询与“刘晨”同一个院系的其他同学的所有信息。完成后请将查询代码保存到脚本文件3_4_4.sql。 (5) 生成选修课为达标的学生的信息,包括学号、姓名、院系、总学分,达标条件:选修课门数达到6门。完成后请将查询代码保存到脚本文件3_4_5.sql。 5. 运行CreateTeaching.sql在系统数据库tempdb中生成解答用数据库对象,为计科系生成如下选修课综合信息视图(仅包括计科系学生的选课信息,未选课的计科系学生也包括在视图的数据集中,如果未选课则课程等相关字段记为NULL,选了课但未考试则成绩等相关字段记为NULL,如果考试成绩未及格学分记为0,否则得到课程学分)。完成后请将本视图定义的程序保存到脚本文件3_5.sql。7分 6. SQL 程序设计:运行CreateTeaching.sql在系统数据库tempdb中生成解答用数据库对象,完成如下对象定义,把相应的SQL程序分别保存到指定的SQL文件中。每小题7分,共21分 (1) 为教师表定义一个名为Tr_Insert_Or_Update_Sal触发器,实现如下完整性规则:“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。请完成触发体设计,完成后请将本定义的程序保存到脚本文件3_6_1.sql。 Create Trigger Insert_Or_Update_Sal On Teacher After INSERT, UPDATE AS (2) 利用ROW_NUMBER() OVER设计一分页查询存储过程DividePage,每次调用返回指定数据表中指定页大小及页码的满足条件的记录结果集,其参数设计如下,请完成过程体设计,完成后请将本定义的程序保存到脚本文件3_6_2.sql。 Create Procedure DividePage ( @tblName varchar(255), -- 表

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧