用一条SQL语句 查询出每门课都大于80分的学生姓名,表(MarkList)如下:

try23 2007-10-19 08:53:11
用一条SQL语句 查询出每门课都大于80分的学生姓名,表(MarkList)如下:

Name Course Mark
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 英语 100
王五 语文 81
…… …… ……

今天的面试题目,我是按下面写的,在查询中可以出来结果.但主考官说,这样不好,有更好的办法,他没告诉我,特此来求答案,谢谢.

SELECT DISTINCT Name
FROM MarkList
WHERE (Name IN
(SELECT name
FROM marklist
WHERE mark > 80))
...全文
10119 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
nyjxyy 2012-02-24
  • 打赏
  • 举报
回复
select distinct name from A
minus
select name from A
where fenshu<=80
追猫的兔子 2011-11-14
  • 打赏
  • 举报
回复
学习了
ansensp 2011-01-11
  • 打赏
  • 举报
回复
按姓名进行分组查询 然后指定条件 分组中分数的最小值都大于80的
select Name from MarkList group by Name having min(Mark) > 80
abeast00 2010-08-02
  • 打赏
  • 举报
回复
select distinct name from table  where  name not in (select distinct name from table where fenshu<=80)
秒华 2010-05-03
  • 打赏
  • 举报
回复
我看书上说”由Exists引出的子查询,其目标列表达式通常为 *”,为什么楼上各位的都不是呢?什么原因啊。
秒华 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lyw110 的回复:]
create table #test
(
Name varchar(10),
Course varchar(10),
Mark float
)

insert into #test
select '张三', '语文', 81 union
select '张三', '数学', 75 union
select '李四', '语文', 76 union
select '李四', '……
[/Quote]


这个好像不完整,如果有人没有选课,没有成绩,那他也会被选出来,这实际上是跟要求违背了吧?
jadeaccp 2008-07-31
  • 打赏
  • 举报
回复
select distinct 姓名 from 成绩表 group by 姓名 having min(成绩)>80
cxmcxm 2007-10-23
  • 打赏
  • 举报
回复
select distinct name
from marklist a
where not exists(select * from marklist where name=a.name and mark<=80)
Colin_Sun 2007-10-23
  • 打赏
  • 举报
回复
f05982和Lyw110的方法都比我写的强,学到了!
Colin_Sun 2007-10-23
  • 打赏
  • 举报
回复
仔细一看,lz的代码是不正确的,这样的查询结果是:至少一门功课在80分以上的学生!
Colin_Sun 2007-10-23
  • 打赏
  • 举报
回复
服了,我昨天面试的时候,也遇到了这个题目,咱俩不会去的同一公司吧!
我当时是这么回答的:
select name from marklist mal
where mark>80
group by name
having count(*)=(select count(*) from marklist where name=mal.name)
不知道这样写好不好?
  • 打赏
  • 举报
回复
楼主自己查询的结果不正确
  • 打赏
  • 举报
回复
我觉得wzy_love_sly 的好
先找出至少一科的分数低于80的学生姓名,再排除
f05982 2007-10-23
  • 打赏
  • 举报
回复
再簡化一下
select name from Marklist group by name having min(mark)>80
f05982 2007-10-23
  • 打赏
  • 举报
回复
select name,min(mark) from Marklist group by name having min(mark)>80
fcuandy 2007-10-20
  • 打赏
  • 举报
回复
要是不考滤逃考某课的问题,不用not exists的一种写法:

DECLARE @test table ( 
Name varchar(10),
Course varchar(10),
Mark float)
insert into @test
select '张三 ', '语文 ', 81 union
select '张三 ', '数学 ', 75 union
select '李四 ', '语文 ', 76 union
select '李四 ', '数学 ', 90 union
select '王五 ', '英语 ', 100 union
select '王五 ', '语文 ', 81

SELECT NAME FROM @test GROUP BY name HAVING count(*)=count(case when mark>=80 then 1 else null end)
--或者
SELECT NAME FROM @test GROUP BY name HAVING count(*)=sum(case when mark>=80 then 1 else 0 end)
zhou__zhou 2007-10-20
  • 打赏
  • 举报
回复
DECLARE @test table (
Name varchar(10),
Course varchar(10),
Mark float)
insert into @test
select '张三 ', '语文 ', 81 union
select '张三 ', '数学 ', 75 union
select '李四 ', '语文 ', 76 union
select '李四 ', '数学 ', 90 union
select '王五 ', '英语 ', 100 union
select '王五 ', '语文 ', 81
SELECT * FROM @test
/*查询出每门课都大于80分的学生姓名??*/
SELECT DISTINCT NAME FROM @test WHERE Mark>80
yfcomeon 2007-10-20
  • 打赏
  • 举报
回复
select distinct name from tb a where not exists(select * from tb where a.name=name and mark<80)
fcuandy 2007-10-20
  • 打赏
  • 举报
回复
若考滤数据完整性,这语句还需改进.

比如,张三有"化学"这门科的成绩,李四没参加考试,那这里就存在 李四没有化学科的成绩记录的情况.

所以要先 (select distinct 科目 from 表) x
每个人的记录与 x 左连,没有某科成绩的用isnull替换为0 ,然后再用 not exists处理才是准确的
(当然,如果每个人都没参加'化学'这门科的考试, 也就是说,每个人都逃了一门课的考试,这个实际中不太现实, 如果确实有这种情况, 那么 select distinct 科目 from 表 得到的结果不能表述所有的科目, 还需要建立科目表)
try23 2007-10-20
  • 打赏
  • 举报
回复
在此感谢各位回答,特别是Lyw110 ,这种办法真简洁,佩服.
加载更多回复(7)
该工具支持多个型号,包括但不限于idata95w、idata95v以及iData95等。它是一种pda刷机软件,即个人数字助理(Personal Digital Assistant)设备的固件升级程序。刷机通常指的是将设备的固件或者操作系统进行更新或替换的过程,可以用来修复系统问题、提升设备性能或更新新功能。 刷机工具的操作过程通常包括连接设备到电脑、选择正确的固件版本、执行刷机程序以及等待过程完成。在进行刷机之前,用户需要确保下载的刷机工具版本与自己的设备型号相匹配,并严格遵循操作说明,以避免刷机失败导致设备变砖(即设备无法启动)。 在压缩包文件列中仅提到了"A5V2R2刷机工具",这可能明该工具是为特定版本的idata95系列产品设计的。可能是指固件的版本号,比如A5V2R2可能代某个版本的固件,其中A5可能示版本类型,V2示版本号,R2可能示修订级别。 刷机工具有时还包含有解锁Bootloader(引导程序)的功能,这在某些设备中是进行刷机前的必要步骤。Bootloader是设备启动时首先运行的一段代码,负责加载操作系统。在一些设备上,Bootloader被锁定,以防止非授权的系统更改。解锁Bootloader可能会清除设备上的所有数据,因此这个过程需要谨慎操作。 刷机工具的使用通常涉及以下步骤: 1. 准备工作:备份好设备上的个人数据,确保数据安全。 2. 下载对应的刷机工具:根据设备型号下载相应的刷机工具,确保来源的安全可靠。 3. 启动设备至下载模式:这通常需要在设备关闭状态下同时按住特定的几个按键来进入。 4. 连接设备到电脑:使用USB数据线将设备连接到电脑。 5. 运行刷机工具:打开刷机工具软件,通常会有一个简单的用户界面指导用户完成刷机过程。 6. 执行刷机程序:根据软件指示选择相应的固件文件,然后软件会自动完成刷机过程。 7. 刷机后处理:刷机完成后,通常需要手动启动设备或进行额外的配置以确保设备正常运行。 刷机不仅在技术上有一定风险,而且可能会使设备的保修失效。因此,如果没有足够的经验或者不确定是否需要刷机,建议不要轻易尝试。此外,刷机也可能导致设备的某些功能无法使用或不稳定,所以在进行刷机之前应该进行充的了解和准备。"
“1-考试报名系统1”项目是一个数据结构程设计,旨在创建一个考试报名系统。该项目由汪明杰同学在软件学院软件工程专业,同济大学进行,指导教师为张颖。 本文档详细阐述了项目的析、设计、实现和测试过程。首先,项目背景指考试报名系统对学校教务管理的重要性,特别是在处理大量考试人员时的挑战。接着,项目需求析部明确了系统应具备的功能,包括用户友好性、数据处理能力等。 在项目要求中,功能要求详细列了系统应具备的各个功能,如: 1.3.1 功能要求:这可能包括考生注册、考试选择、报名、取消报名、查询考试信息等功能。 1.3.2 输入格式:可能涉及考生信息输入的格式规范,如姓名、学号、选择的考试科目等。 1.3.3 输格式:可能涉及打印报名成功通知、查询结果展示等输信息的格式。 项目设计部讨论了数据结构和类的设计: 2.1 数据结构设计:可能使用数据结构如链来存储和管理考生信息和考试数据。 2.2 类设计:包括结点类(ListNode)、双向链类(List)以及数据库类(DataBase),用于构建系统的核心结构。 在项目实现章节,详细描述了各个功能的实现逻辑和代码,包括: 3.1 项目主体功能:涵盖系统的整体流程和代码实现。 3.2 项目初始化:如何加载初始数据,包括读取文件和手动输入。 3.3 插入数据:添加新的考生信息或考试报名。 3.4 删除数据:取消考生的报名。 3.5 修改数据:更新考生信息或考试选择。 3.6 查询数据:根据特定条件查找考生信息或考试详情。 3.7 统计数据:可能包括统计报名人数、考试科目选择情况等。 最后,项目测试部涵盖了各种测试用例,确保系统的正确性和稳定性,如: 4.1 项目初始化测试:验证数据加载功能。 4.2 插入、删除、查找、修改和统计测试:别检查各功能是否正常工作。 4.7 边界测试:测试特殊情况,如插入已存在的考生、删除不存在的考生等。 这个“1-考试报名系统1”项目涵盖了软件开发的完整生命周期,从需求析到设计、实现和测试,体现了软件工程中的核心原则,特别是数据结构的应用和系统功能的实现。

34,871

社区成员

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

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