51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 16032|回复: 29
打印 上一主题 下一主题

[原创] 几道经典的SQL笔试题目(有答案)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-12-9 15:31:42 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
(1)表名:购物信息
购物人      商品名称     数量
A            甲          2
B            乙          4
C            丙          1
A            丁          2
B            丙          5
……
(其他用户实验的记录大家可自行插入)

给出所有购入商品为两种或两种以上的购物人记录

答:select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(*) >= 2);

(2)表名:成绩表
姓名   课程       分数
张三     语文       81
张三     数学       75
李四     语文       56
李四     数学       90
王五     语文       81
王五     数学       100
王五     英语       49
……
(其他用户实验的记录大家可自行插入)

给出成绩全部合格的学生信息(包含姓名、课程、分数),注:分数在60以上评为合格

答:select * from 成绩表 where 姓名 not in (select distinct 姓名 from 成绩表 where 分数 < 60)
或者:
select * from 成绩表 where 姓名 in (select 姓名 from 成绩表 group by 姓名 having min(分数) >=60)


(3)表名:商品表
名称   产地             进价
苹果   烟台                2.5
苹果   云南                1.9
苹果   四川                3
西瓜   江西                1.5
西瓜   北京                2.4
……
(其他用户实验的记录大家可自行插入)

给出平均进价在2元以下的商品名称

答:select 名称 from 商品表 group by 名称 having avg(进价) < 2

(4)表名:高考信息表
准考证号   科目       成绩
2006001     语文       119
2006001     数学       108
2006002     物理       142
2006001     化学       136
2006001     物理       127
2006002     数学       149
2006002     英语       110
2006002            语文       105
2006001            英语        98
2006002     化学       129
……
(其他用户实验的记录大家可自行插入)

给出高考总分在600以上的学生准考证号

答:select 准考证号 from 高考信息表 group by 准考证号 having sum(成绩) > 600

(5)表名:高考信息表
准考证号        数学        语文        英语        物理        化学
2006001                108         119         98        127         136
2006002                149         105        110        142         129
……
(其他用户实验的记录大家可自行插入)

给出高考总分在600以上的学生准考证号

答:select 准考证号 from 高考信息表 where (数学+语文+英语+物理+化学) > 600



(四部分)
(一)表名:club

id gender age
67 M      19
68 F      30
69 F      27
70 F      16
71 M      32
……(其余测试数据请自行插入)

查询出该俱乐部里男性会员和女性会员的总数

答:select gender,count(id) from club group by gender

(二)表名:team
ID(number型) Name(varchar2型)
1                  a
2                  b
3                  b
4                  a
5                  c
6                  c
要求:执行一个删除语句,当Name列上有相同时,只保留ID这列上值小的
例如:删除后的结果应如下:
ID(number型) Name(varchar2型)
1                  a
2                  b
5                  c
请写出SQL语句。

delete from team where id not in (select min(id) from team group by name)

(三)表名:student

name course score
张青 语文     72
王华 数学     72
张华 英语     81
张青 物理     67
李立 化学     98
张燕 物理     70
张青 化学     76

查询出“张”姓学生中平均成绩大于75分的学生信息

答:select * from student where name in (select name from student
where name like '张%' group by name having avg(score) > 75)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

30#
发表于 2009-10-24 05:15:44 | 只看该作者
其实我想大家也都已经注意到了,最后一题的问题和第一题有点相似:
第一题:select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(*) >= 2);
最后一题:select * from student where name in (select name from studentwhere name like '张%' group by name having avg(score) > 75)
刚开始我也认为是应该这样:
第一题:select * from 购物信息 group by 购物人 having count(*) >= 2
最后一题:select * from studentwhere name like '张%' group by name having avg(score) > 75
之后看了看答案和恢复,又比较了两题得相似性,我自己认为就像楼上的仁兄说的“GROUP BY 表示分组,但是不是随便哪些字段分组都可以,SELECT后面的所有字段,除了SUM、COUNT、AVG等汇总统计字段之外,其它的都必须放在GROUP BY里面进行分组”。拿最后一题来说,GROUP BY后面是NAME字段,而如果结果是:
select * from studentwhere name like '张%' group by name having avg(score) > 75,那么就与仁兄所说的话违背了:*代表了符合要求的所有记录,里面的字段除了有NAME外,还有COURSE和SCORE,但是COURSE不是GROUP BY的,换句话说他与分组时无关的,我自己想应该是如果有分组条件存在在SQL语句中,那么SQL后面不能跟其他的和分组无关的字段。
所以像第一题和最后一题,如果只是需要“购物人”和“NAME"这俩个字段的信息,答案可以是:
第一题:select * from 购物信息 group by 购物人 having count(*) >= 2
最后一题:select * from studentwhere name like '张%' group by name having avg(score) > 75
如果需要的是*,是所有字段的信息,那么我就要“多此一举”的加子查询,借用“IN"来输出我们想要的所有字段的信息。
回复 支持 反对

使用道具 举报

该用户从未签到

29#
发表于 2009-8-28 16:48:44 | 只看该作者
学习了
回复 支持 反对

使用道具 举报

该用户从未签到

28#
发表于 2009-8-27 17:43:10 | 只看该作者

建议

我是一个开发人员
现在转测试的。
我有几条建议,希望对你们有帮助
一 编写SQL语句的时候关键字最好是大写。因为你就算是小写的,但程序运行的时候,程序内部也会将小写转换成为大写,那何不直接写成大写呢。这样也减少了软件的工作量,提高了性能。
二 拼写SQL语句的时候尽量的少用到in,比如第一题就可以用自联接。
其实这些东西在面试的时候,给面试官看的时候,是特别显眼的。他们会认为你的基础比别人要扎实的多,而不是光光只知道怎么查询。
回复 支持 反对

使用道具 举报

该用户从未签到

27#
发表于 2009-8-25 17:36:23 | 只看该作者
看一下数据库的书籍,总结一下,谢谢了
回复 支持 反对

使用道具 举报

该用户从未签到

26#
发表于 2009-8-25 16:53:12 | 只看该作者
额!这些我们都学过,但是今天看着有些陌生,不过感觉前几题的思路一致,明白一题就OK了
回复 支持 反对

使用道具 举报

该用户从未签到

25#
发表于 2009-8-23 02:42:09 | 只看该作者

回复 1# 的帖子

看了楼主的贴子我发现我就业有问题咯
回复 支持 反对

使用道具 举报

该用户从未签到

24#
发表于 2009-8-22 23:37:28 | 只看该作者
第一题这样行吗?
select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(商品名称) >= 2);
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2016-5-17 20:35
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    23#
    发表于 2009-5-19 20:43:11 | 只看该作者
    有点意思。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22#
    发表于 2009-5-19 13:43:19 | 只看该作者
    先收藏
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    21#
    发表于 2009-5-19 13:40:10 | 只看该作者
    “系统会提示你course, score 两个字段都应该放在GROUP BY 后面进行分组 ”

    还是不太明白啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2009-5-19 12:17:17 | 只看该作者
    多谢!学习学习。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2009-5-18 20:51:21 | 只看该作者
    having今天刚 碰到好些,正好这不怎么会用。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
    发表于 2009-5-18 17:33:22 | 只看该作者
    多谢楼主的无私奉献
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17#
    发表于 2009-5-15 17:22:21 | 只看该作者
    面试的时候遇到过这样的类似查询题目,顶
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
    发表于 2009-5-15 13:42:55 | 只看该作者
    厄```原来
    select * from student
    where name like '张%'
    group by name having avg(score) > 75)

    select * from (select name, course, score from student group by name having sum(score) >75) where name like'张%'
    都是错误的

    原因是
    GROUP BY 表示分组,但是不是随便哪些字段分组都可以,SELECT后面的所有字段,除了SUM、COUNT、AVG等汇总统计字段之外,其它的都必须放在GROUP BY里面进行分组,所以,下面这样的语句是错误的:
    select name, course, score from student group by name having sum(score) >75
    系统会提示你course, score 两个字段都应该放在GROUP BY 后面进行分组
    而且仔细一看sum(score)代表的是总分,可题目要求的是平均分吧?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15#
    发表于 2009-5-14 15:44:00 | 只看该作者
    对于最后一题的答案
    select * from student where name in (select name from student
    where name like '张%' group by name having avg(score) > 75)

    问题1:我也很疑惑为什么要用在用in 做嵌套?这样很效率影响查询效率,而且还麻烦.

    我第一次的答案是
    select * from student
    group by name having avg(score) > 75
    where name like '张%'
    问题2:想问下GROUP BY 关键字一定要放到 WHERE 的后面吗?
    select * from student
    where name like '张%'
    group by name having avg(score) > 75)
    问题3:这个两个语句有无分别?

    至于看到13楼的答案
    select * from (select name, course, score from student group by name having sum(score) >75) where name like'张%'
    我个人认为是可以的,有没有高手说明一下啊?如果可以的话,为什么不这样写?
    select * from (select * from student group by name having sum(score) >75) where name like'张%'
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-2-27 11:36
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    14#
    发表于 2009-3-24 20:12:40 | 只看该作者
    学习ing,谢了,楼主
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-3-1 13:43
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    13#
    发表于 2009-3-24 19:57:39 | 只看该作者
    学着写的,第一和第二和最后跟楼主有些不一样。
    1.selcect 购物人,商品名称,数量 from 购物信息 group by 购物人 have count(*)>=2
    2.select 姓名,课程,分数 from 成绩表 group by  姓名 having 分数 > 60
    最后一个
    select * from (select name, course, score from student group by name having sum(score) >75) where name like'张%'
    不喜欢用in,速度太慢。

    楼上
    select * from student
    where name like '张%' group by name having avg(score) > 75
    是出不来的 后面有聚合函数
    至于用having不用group by 无语中 不分组怎么having

    [ 本帖最后由 hyj785 于 2009-3-25 07:59 编辑 ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-7-4 15:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    12#
    发表于 2009-3-24 14:48:34 | 只看该作者
    不错。非常经典
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-28 18:26 , Processed in 0.101401 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表