前言
面试中偶尔会要求我们写SQL,而工作中其实未必写的很难,我是完全不会复杂SQL,这个时候我们稍微复习下就好。
这篇博客直接给题目和答案,原理啥的没必要分析了,面试能回答就回答,我个人觉得面试问SQL,问的很深的多半是外包。
大家不要过分关注表名和结构,主要看SQL大概怎么写就行了。
各种面试题
1. 给出所有购入商品为两种或两种以上的购物人记录
购物人 商品名称 数量
A 甲 2
B 乙 4
select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(*) >= 2);
2. 给出成绩全部合格的学生信息(包含姓名、课程、分数)
姓名 课程 分数
张三 语文 81
张三 数学 75
select * from 成绩表 where 姓名 not in (select distinct 姓名 from 成绩表 where 分数 < 60)
或者:
select * from 成绩表 where 姓名 in (select 姓名 from 成绩表 group by 姓名 having min(分数) >=60)
3.给出平均进价在2元以下的商品名称
名称 产地 进价
苹果 烟台 2.5
苹果 云南 1.9
select 名称 from 商品表 group by 名称 having avg(进价) < 2
关于having语法,这个其实是配合group by去使用的。
4.给出高考总分在600以上的学生准考证号
准考证号 科目 成绩
2006001 语文 119
2006001 数学 108
select 准考证号 from 高考信息表 group by 准考证号 having sum(成绩) > 600
5.给出高考总分在600以上的学生准考证号(与4的区别是单列记录成绩而不分科目)
准考证号 数学 语文 英语 物理 化学
2006001 108 119 98 127 136
2006002 149 105 110 142 129
select 准考证号 from 高考信息表 where (数学+语文+英语+物理+化学) > 600
6.查询出该俱乐部里男性会员和女性会员的总数
id gender age
67 M 19
68 F 30
select gender,count(id) from club group by gender
7.有重复值删除最小的(这个实际业务肯定是自己代码判断)
ID(number型) Name(varchar2型)
1 a
2 b
3 b
4 a
5 c
6 c
要求:执行一个删除语句,当Name列上有相同时,只保留ID这列上值小的
例如:删除后的结果应如下:
ID(number型) Name(varchar2型)
1 a
delete from team where id not in (select min(id) from team group by name)