现在我要查询至少选修了S1选修的全部课程的学生的学号

jiang5495 2009-12-01 12:32:37
我有如下的数据表,表名为S,各字段含意分别人,学号,课程号,和分数。
现在我要查询至少选修了S1选修的全部课程的学生的学号,
请问SQL语句怎么写?
SNO CNO SCORE
S1 C1 90
S1 C2 85
S2 C5 57
S2 C6 80
S2 C7 80
S3 C1 80
S3 C2 89
S3 C4 23
S4 C1 34
S4 C2 79
S4 C3 34
S5 C2 89
...全文
2878 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
流智 2011-05-08
  • 打赏
  • 举报
回复
Select sname from S where not exists
(select cno from SC where sno='s1' and cno not in
(select cno from SC where S.sno=sno))
jacoblx 2010-04-28
  • 打赏
  • 举报
回复
8楼,14楼正解啊,怎么理解呢?书上就是这样的
sych888 2009-12-02
  • 打赏
  • 举报
回复 1
select S# from SC where C# in (select C# from SC where S#='s1')
group by S# having count(*)>=(select count(*) from SC where S#='s1');
bj_kevin51 2009-12-01
  • 打赏
  • 举报
回复
这种面试题,太2了!
lang071234 2009-12-01
  • 打赏
  • 举报
回复
还是没看懂。还以为等一会会有人答复呢。。在等等。。刚才占沙发好了
yanglinqiang 2009-12-01
  • 打赏
  • 举报
回复

create table S(SNO varchar(4),CNO varchar(4), SCORE int)
insert into S select 'S1','C1','90'
union all select 'S1','C2','85'
union all select 'S2','C5','57'
union all select 'S2','C6','80'
union all select 'S2','C7','80'
union all select 'S3','C1','80'
union all select 'S3','C2','89'
union all select 'S3','C4','23'
union all select 'S4','C1','34'
union all select 'S4','C2','79'
union all select 'S4','C3','34'
union all select 'S5','C2','89'
;with tb as
(
select num=count(1),a.SNO
from S a,S b
where a.CNO=b.CNO and b.SNO='s1'
group by a.SNO)
select SNO from tb where num>=(select num from tb where SNO='s1')

--SNO
------
--S1
--S3
--S4
--
--(3 行受影响)

nianran520 2009-12-01
  • 打赏
  • 举报
回复

declare @table table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @table
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select SNO
from
(
select SNO,count(1) as times from @table
where CNO in (select CNO from @table where SNO = 'S1')
group by SNO
) t
where times = (select count(1) from @table where SNO = 'S1')
--结果
--------------
S1
S3
S4
jiang5495 2009-12-01
  • 打赏
  • 举报
回复
也就是说S1选修的课程,
目的学生都选修了,
比如说S1选修了C!,C2两门课,
那么S2选了C!,C2,C3是满足条件的查询结果,
不知我有没有解释清楚
-狙击手- 2009-12-01
  • 打赏
  • 举报
回复
至少选修了S1选修的全部课程的学生的学号

--

解释一下
-狙击手- 2009-12-01
  • 打赏
  • 举报
回复
没看懂
icelovey 2009-12-01
  • 打赏
  • 举报
回复 1

-- =============================================
-- Author: T.O.P
-- Create date: 2009/12/01
-- Version: SQL SERVER 2005
-- =============================================
declare @tb table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select distinct a.sno
from @tb A
where sno<>'S1' and not exists(
select 1 from @tb b where sno='S1' and
not exists(select 1 from @tb c where a.sno = c.sno and b.cno=c.cno)
)


--测试结果:
/*
sno
----
S3
S4

(所影响的行数为 2 行)

*/

lrjt1980 2009-12-01
  • 打赏
  • 举报
回复
条件选择语句。
kasin000 2009-12-01
  • 打赏
  • 举报
回复
我错了。
dawugui 2009-12-01
  • 打赏
  • 举报
回复
create table tb([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89
go

select sno from tb where sno <> 'S1' and cno in
(select cno from tb where sno = 'S1')
group by sno having count(1) >= (select count(1) from tb where sno = 'S1')

drop table tb

/*
sno
----
S3
S4

(所影响的行数为 2 行)
*/
kasin000 2009-12-01
  • 打赏
  • 举报
回复
S1应该不算吧。
kasin000 2009-12-01
  • 打赏
  • 举报
回复


SNO
----
S3
S4

(2 行受影响)
kasin000 2009-12-01
  • 打赏
  • 举报
回复

declare @table table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @table
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89


select a.SNO
from @table a,@table b
where b.SNO='S1'
And a.SNO!=b.SNO
And a.CNO=b.CNO
group by a.SNO
having COUNT(*)>1

jiang5495 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yihunshaol 的回复:]
SQL codecreatetable S(SNOvarchar(4),CNOvarchar(4), SCOREint)insertinto Sselect'S1','C1','90'unionallselect'S1','C1',90unionallselect'S1','C2',85unionallselect'S2','C5',57unionallselect'S2','C6',80unionallselect'S2','C7',80unionallselect'S3','C1',80unionallselect'S3','C2',89unionallselect'S3','C4',23unionallselect'S4','C1',34unionallselect'S4','C2',79unionallselect'S4','C3',34unionallselect'S5','C2',89--查询语句selectdistinct snofrom swhere
cnoin(selectdistinct cnofrom swhere sno='S1')

结果
S1
S3
S4
S5

[/Quote]
这个查询结果显然是错的啊
yihunshaol 2009-12-01
  • 打赏
  • 举报
回复
create table S(SNO varchar(4),CNO varchar(4), SCORE int)
insert into S select 'S1','C1','90' union all
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

--查询语句
select distinct sno from s where
cno in(select distinct cno from s where sno='S1')


结果
S1
S3
S4
S5
bj_kevin51 2009-12-01
  • 打赏
  • 举报
回复
顶 学习。。。
加载更多回复(14)
数据库原理实验指导书 实验名称:试验一:SQL语言嵌套查询和数据更新操作 所属课程:数据库原理 实验类型:设计型实验 实验类别:基础□ 专业基础√ 专业□ 实验学时:4学时 一、实验目的 1.熟悉和掌握对数据表中数据的查询操作和SQL命令的使用,学会灵活熟练的使用SQL 语句的各种形式; 2.加深理解关系运算的各种操作(尤其的关系的选择,投影,连接和除运算); 3.熟悉和掌握数据表中数据的插入、修改、删除操作和命令的使用; 4.加深理解表的定义对数据更新的作用 二、预习与参考 1.熟悉SQL SERVER 工作环境; 2.连接到学生-课程数据库 3.复习对表中数据查询的SQL语言命令; 4.复习对表中数据的插入、修改和删除的SQL语言命令。 三、实验要求(设计要求) 针对教材例子,通过SQL SERVER企业管理器和查询分析器两种模式,熟悉数据嵌套查询、更新操作。 四、实验方法及步骤 1.在表S、C、SC上进行简单查询; 2.在表S、C、SC上进行连接查询; 3.在表S、C、SC上进行嵌套查询; 4.使用聚合函数的查询; 5.对数据的分组查询; 6.对数据的排序查询。 7. 将数据插入当前数据库的表S、C、SC中; A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 8.将以上插入的数据分别以.SQL文件和.txt文件的形式保存在磁盘上; 9.修改表S、C、SC中的数据;   A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 10.删除表S、C、SC中的数据。 A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 五、实验内容 在表S,C,SC上完成以下操作: 1. 查询学生的基本信息; 2. 查询“CS”系学生的基本信息; 3. 查询“CS”系学生年龄不在19到21之间的学生学号、姓名; 4. 找出最大年龄; 5. 找出“CS”系年龄最大的学生,显示其学号、姓名; 6. 找出各系年龄最大的学生,显示其学号、姓名; 7. 统计“CS”系学生的人数; 8. 统计各系学生的人数,结果按升序排列; 9. 按系统计各系学生的平均年龄,结果按降序排列; 10. 查询每门课程课程名; 11. 查询无先修课的课程课程名和学时数; 12. 统计无先修课的课程的学时总数; 13. 统计每位学生选修课程的门数、学分及其平均成绩; 14. 统计选修每门课程学生人数及各门课程的平均成绩; 15. 找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列; 16. 查询选修了“1”或“2”号课程学生学号和姓名; 17. 查询选修了“1”和“2”号课程学生学号和姓名; 18. 查询选修课程名为“数据库系统”且成绩在60分以下的学生学号、姓名和成绩; 19. 查询每位学生选修课程学生信息(显示:学号,姓名,课程号,课程名,成绩); 20. 查询没有选修课程学生的基本信息; 21. 查询选修了3门以上课程学生学号; 22. 查询选修课程成绩至少有一门在80分以上的学生学号; 23. 查询选修课程成绩均在80分以上的学生学号; 24. 查询选修课程平均成绩在80分以上的学生学号; 25. 选做:针对SPJ数据库中的四个表S,P,J,SPJ,完成教材P74-75--习题5中的查询及教材P127--习题5中的查询。 26. 将数据分别插入表S、C、SC; 27. 将表S、C、SC中的数据分别以.SQL文件和.txt文件的形式保存在磁盘上。 28. 在表S、C、SC上练习数据的插入、修改、删除操作。(比较在表上定义/未定义主码(Primary Key)或外码(Foreign Key)时的情况) 29. 将表S、C、SC中的数据全部删除,再利用磁盘上备份的数据来恢复数据。 30. 如果要在表SC中插入某个学生的选课信息(如:学号为“200215121”,课程号为“c123”,成绩待定),应如何进行? 31. 求各系学生的平均成绩,并把结果存入数据库; 32. 将“CS”系全体学生的成绩置零; 33. 删除“CS”系全体学生的选课记录; 34. 删除学号为“S1”的相关信息; 35. 将学号为“S1”的学生学号修改为“S001”; 36. 把平均成绩大于80分的男同学的学号和平均成绩存入另一个表S——GRADE(SNO,AVG——GRADE); 37. 把选修课程名为“数据结构”的学生的成绩提高10%; 38. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生的成绩提高5%; 39. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生成绩删除掉; 40. 选做:将数据插入SPJ数据库中的四个表S,P,J,SPJ中,并以.SQL文件和.txt文件的形式保存在磁盘
数据库设计及ER图 1.数据库设计流程 数据库作为数据的一个容器,不但对程序的performance有很大的影响,而且对应用程序 的扩展有非常大的影响.所以对应用程序来说,一个具有良好设计的数据库是非常重要的 .那么如何才能设计出性能好,又支持扩展的数据库呢?这是我们大家都要去探索的问题. 现在有很多版本的数据库设计的流程.然而这也只是目前阶段能设计出一个比较好的数据 库的一个途径.更好更优的数据库设计流程是我们追求的目标.但是现在,我们先来了解下 目前阶段标准的数据库设计流程.以助于我们在开发应用程序的时候能用到. 先来看下一张数据设计流程图 上图是数据库设计一个比较标准的流程图.我们就针对这个流程来讲解数据库设计各个阶 段. 需求分析阶段 我们在需求阶段注意两点: 1:考虑到可能的扩充和修改,是设计能易于修改和扩展 2:强调客户参与:目的有几个:更好的理解客户的需求,了解客户的对程序安全性和完整性 的要求,以及用户的处理需求. 概念结构设计阶段 在这个阶段我们要设计出能真实反应客观事物的模型,同时让设计的模型能易于理解,易 于扩展,能方便的向其他数据库转移. 逻辑结构设计 1:作为对象信息的属性,必须具有原子性的.也就是.我们在画ER图的时候,对象间的关系 必须是实体之间的关系,不能是属性和实体的关系. 2:确定数据之间的依赖关系(要极小化出来各个关系,消除冗余),同时要按照数据依赖理 论对关系模型进行检查. 数据库物理设计阶段 数据的存储结构以及配置 数据库实施阶段 定义数据库的结构,数据的装载,以及数据库的试运行. 数据库运行和维护阶段 要注意数据的转储和恢复,数据库的安全性和完整性控制.数据库的性能的监督,分析和改 造以及数据库的重构 2.数据库设计范式 第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。例:如职工号,姓名,电话号 码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码) 规范成为1NF有三种方法: 一是重复存储职工号和姓名。这样,关键字只能是电话号码。 二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性 三是职工号为关键字,但强制每条记录只能有一个电话号码。 以上三个方法,第一种方法最不可取,按实际情况选取后两种情况。 第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候 选关键字,则称关系R 是属于第二范式的。 例:选课关系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号, CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。 由以上条件,关键字为组合关键字(SNO,CNO) 在应用中使用以上关系模式有以下问题: a.数据冗余,假设同一门课由40个学生选修,学分就 重复40次。 b.更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同 一门课学分不同。 c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把 课程和学分存入。 d.删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修 ,则此门课程及学分记录无法保存。 原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO ,CNO)而不是完全依赖。 解决方法:分成两个关系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通 过SC1中的外关键字CNO相联系,需要时再进行自然联接,恢复了原来的关系 第三范式(3NF):如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存 在传递信赖,则称关系R是属于第三范式的。 例:如S1(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号, 姓名,所在系,系名称,系地址。 关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这 关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储, 插入,删除和修改时也将产生类似以上例的情况。 原因:关系中存在传递依赖造成的。即SNO -> DNO。 而DNO -> SNO却不存在,DNO -> LOCATION, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。 解决目地:每个关系模式中不能留有传递依赖。 解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION) 注意:关系S中不能没有外关键字DNO。否则两个关系之

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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