SQL 面试题练习

  1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名
name class score
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
  • 答案 1:使用子查询,先选择分数小于等于 80 分的学生姓名,只要姓名不在这里面的,就每门课程都大于 80 分
SELECT DISTINCT name 
FROM table 
WHERE name NOT IN
(SELECT DISTINCT name
FROM table WHERE score<=80);
  • 答案 2:使用 GROUP BY…HAVING…,将分数按姓名分组,选择分组最小分数大于 80 的组的姓名
SELECT name
FROM table
GROUP BY name
HAVING MIN(score)>80;
  1. 删除除了自动编号不同, 其他都相同的学生冗余信息
No id name class score
1 0001 张三 语文 81
2 0003 李四 数学 75
3 0001 张三 语文 81
  • 答案:按照后面几项进行分组,选取其最小编号作为唯一编号,删除不在唯一编号里的(即后面几项内容重复的),注意 MySQL 中子查询的格式,需指定别名。
DELETE FROM table
WHERE No NOT IN 
(SELECT * 
FROM 
(SELECT MIN(No) 
FROM table
GROUP BY id, name, class, score) A);
  1. 一个叫 team 的表,里面只有一个字段 name, 一共有 4 条纪录,分别是 a, b, c, d, 对应四个球队,现在四个球队进行比赛,用一条 SQL 语句显示所有可能的比赛组合
  • 答案:使用别名,自身比较并组合
SELECT a.name team1, b.name team2
FROM team a, team b
WHERE a.name<b.name
  1. 请用 SQL 语句实现:从 table 数据表中查询出所有月份的发生额都比 101 科目相应月份的发生额高的科目。table 中有很多科目,都有1-12 月份的发生额。字段分别为:
    no :科目代码,mon :发生额月份,num :发生额
  • 答案:先将 101 科目的数据拎出来,作为 b 表,然后提取出原数据表中月份和 b 表相同,发生额比 b 表大的数据,作为 c 表,然后对 c 表中按科目分类计数,结果为 12 个月的即为最终结果
SELECT c.* FROM
(SELECT a.* FROM table a, (SELECT * FROM table WHERE no=101) b
WHERE a.mon=b.mon AND a.num>b.num) c
GROUP BY c.no HAVING COUNT(c.mon)=12
  1. 面试题:怎么把这样一个表
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值