wushimiang12面试题的总结(一)

filebat 2005-07-04 01:02:46
看了wushimiang12的面试题,我把内容总结了一下,想再讨论讨论.
原帖:http://community.csdn.net/Expert/topic/4114/4114705.xml?temp=.1520349
题目:
学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
............................................
题目:(1)查询数学分数在表中第10名到第15名的学生信息
(2)删除除了自动编号不同,其他都相同的学生冗余信息
(3)查询各科成绩前3名的学生信息

现将整理出的第一题的解法拿出来讨论讨论
...全文
312 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liusujian02 2006-07-03
  • 打赏
  • 举报
回复
mark
sh_caizicheng 2006-03-08
  • 打赏
  • 举报
回复
mark
upeveryday 2005-09-06
  • 打赏
  • 举报
回复
1. select top 5 from 学生表 where 自动编号 not in (select top 10 自动编号 from 学生表 order by 自动编号) order by 自动编号
w3k 2005-07-04
  • 打赏
  • 举报
回复
真晕,bu dong
mydefoliate 2005-07-04
  • 打赏
  • 举报
回复
顶一下!
觉得这问题要考虑到各种特殊情况的话比较麻烦,就像如果没有10~15名,或者不止5人排在10~15名之间...
shyming 2005-07-04
  • 打赏
  • 举报
回复
至于分数相同的问题我想要看具体要求,如果第15名的有5个,而要求的只是10~15的任意5名,那上述方法2,3可以满足,而1,4会出问题,如果要求的是10~15名的所有人--就是说5个84分的都是第15名的人都要选择出来,那以上都不合要求噢,要写成 select * from tbl where 分数 in (select 分数 from 第10到第15)....
shyming 2005-07-04
  • 打赏
  • 举报
回复
如果表数据较多,个人觉得效率方面应该是3最好,2,4次之,1的就最低了,理解如下:
1.效率最低.执行过程应该是:先从表中选出top 10并放入内存(遍历表一次,时间复杂度n),再选择top 5再遍历一次(时间复杂度1n),而且此次遍历时每一笔数据都要和缓冲池的top 10作id比较(时间复杂度10n) --时间复杂度12n.
2.有创意,执行效率一般.遍历table 2次,时间复杂度应该是2n.
3.效率最高.遍历数据库一次,第二次在15列里选择5列,可以忽略,时间复杂度应该是1n.空间复杂度也比其他大不了多少.
4.时间复杂度略高于2,也是2n.
不知道大家怎么看

heguosheng 2005-07-04
  • 打赏
  • 举报
回复
up
filebat 2005-07-04
  • 打赏
  • 举报
回复
顶一下, 让讨论来得更猛烈些吧。
filebat 2005-07-04
  • 打赏
  • 举报
回复
对比:第二种和第三种的效率高些, 第一种和第四种效率比较低。
缺陷: 如果数学分数有相同, 则上面的解法都有待商榷了。(分数相同的话,应该是名次是并列的)
比如说:现在有一张表 ta( id int, score int),id表示学号, score表示分数
内容为: id score
1 90
2 80
3 80
4 70
5 65
6 60
求出前二名的记录, 即
id score
1 90
2 80
3 80
那前三名呢?

表的定义:
if object_id('ta') is not null drop table ta
go
create table ta(id int, score int)
insert ta select 1, 90
union all select 2, 80
union all select 3, 80
union all select 4, 70
union all select 5, 65
union all select 6, 60

--备注:感觉这个问题,应该再生成一个名次列才可以。
filebat 2005-07-04
  • 打赏
  • 举报
回复
第一题,网友的解答:
--------------------------------------------------------------------------
回复人: phantomMan(去年学Delphi,年底.net,今年5月SQL,现在XML,何时学 JAVA ?) ( ) 信誉:100 2005-6-30 14:32:20 得分: 0
select top 5 * from tablename
where 课程名称='数学' and
学号 not in(
select top 10 学号 from tablename order by 分数
)
------------------------------------------------------
回复人: xiaonvjing(飞扬) ( ) 信誉:100 2005-7-2 20:38:21 得分: 0
查询数学分数在表中第10名到第15名的学生信息
select a.* from (select top 15 * from stud order by 自动编号 )a left
join (select top 10 * from stud order by 自动编号 ) b on a.自动编号=b.自动编号
where b.自动编号 is null
------------------------------------------------------
回复人: WangZWang(阿来) ( ) 信誉:100 2005-7-3 0:14:37 得分: 0
Select top 5 * from (
Select top 15 * from t where 课程名称 = '数学'
order by 分数 desc ) x
order by 分数
------------------------------------------------------
回复人: xiaoxiangqing(肖祥清) ( ) 信誉:100 2005-7-3 1:11:39 得分: 0
select * from table1 where id in(select top 15 id from table1 where 课程名称='数学' order by 分数 desc) and id not in(select top 5 id from table1 where 课程名称='数学' order by 分数 desc)

27,580

社区成员

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

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