面试题四:手写sql
矫正数据,有以下2个表,建表语句如下所示
-- 订单表
create table t_order
(
id int auto_increment
primary key,
name varchar(255) null,
total int null
);
-- 插入数据
insert into sql_test.t_order (id, name, total) values (1, '家电', 1300);
insert into sql_test.t_order (id, name, total) values (2, '洗漱', 170);
insert into sql_test.t_order (id, name, total) values (3, '餐饮', 200); -- 详情表
create table t_detail
(
id int auto_increment
primary key,
detail varchar(255) null,
cost int null,
order_id int null
);
-- 插入数据
insert into sql_test.t_detail (id, detail, cost, order_id) values (1, '洗衣机', 500, 1);
insert into sql_test.t_detail (id, detail, cost, order_id) values (2, '电视机', 800, 1);
insert into sql_test.t_detail (id, detail, cost, order_id) values (3, '牙膏', 100, 2);
insert into sql_test.t_detail (id, detail, cost, order_id) values (4, '洗衣液', 70, 2);
insert into sql_test.t_detail (id, detail, cost, order_id) values (5, '白菜', 200, 3);
由于故障导致
t_order表中的total值出现异常,使用一个sql语句进行矫正;update t_order o,
(select order_id as oid, sum(cost) as t from t_detail GROUP BY order_id) b
set o.total = b.t
where o.id = b.oid;
分类求和题,有表如下
create table t_type
(
id int auto_increment
primary key,
type int null,
num int null
);
-- 插入数据
insert into sql_test.t_type (id, type, num) values (1, 1, 100);
insert into sql_test.t_type (id, type, num) values (2, 1, 200);
insert into sql_test.t_type (id, type, num) values (3, 2, 500);
insert into sql_test.t_type (id, type, num) values (4, 2, 200);
insert into sql_test.t_type (id, type, num) values (5, 3, 300);
insert into sql_test.t_type (id, type, num) values (6, 3, 180);
insert into sql_test.t_type (id, type, num) values (7, 4, 50);
insert into sql_test.t_type (id, type, num) values (8, 5, 60);
insert into sql_test.t_type (id, type, num) values (9, 6, 70);
要求:当
type>3时type=8,并且分类求和,要达到的效果如下:type sum 1 300 2 700 3 480 8 180 实现sql语句,需要使用到
case when xxx then xxx else xxx end语句:select case when type > 3 then 8 else type end as t, sum(case when type > 3 then num else num end)
from t_type
group by t;
学生成绩相关
-- 学生表
create table student(
id int unsigned primary key auto_increment,
name char(10) not null
);
insert into student(name) values('张三'),('李四');
-- 课程表
create table course(
id int unsigned primary key auto_increment,
name char(20) not null
);
insert into course(name) values('语文'),('数学');
-- 学生成绩表
create table student_course(
sid int unsigned,
cid int unsigned,
score int unsigned not null,
foreign key (sid) references student(id),
foreign key (cid) references course(id),
primary key(sid, cid)
);
insert into student_course values(1,1,80),(1,2,90),(2,1,90),(2,2,70);
查询重名的学生,按照name,id升序
select id,name from student where name in (select name c from student group by name HAVING count(name) > 1) order by name,id; -- exits写法
select t.id,t.name from student t where EXISTS (select s.name from student s where s.name = t.name GROUP BY name HAVING count(s.name) > 1 ) order by t.name,t.id;
在student_course表中查询平均分不及格的学生,列出学生id和平均分
select sid, AVG(score) as a from student_course GROUP BY sid HAVING a < 60;
在student_course表中查询每门课成绩都不低于80的学生id
select DISTINCT sid from student_course where sid not in (select sid from student_course where score < 80);
查询每个学生的总成绩,结果列出学生姓名和总成绩
select s.name, sum(c.score) from student_course c, student s where c.sid = s.id GROUP BY sid;
-- 上述方法会过滤掉没有成绩的人,因此需要使用左连接
select name,sum(score)
from student left join student_course
on student.id=student_course.sid
group by sid;
总成绩最高的学生,结果列出学生id和总成绩
select sid, sum(score) as ss from student_course GROUP BY sid order by ss desc limit 1;
在student_course表查询课程1成绩第2高的学生,如果第2高的不止一个则列出所有的学生
select * from student_coursewhere cid=1 and score = (
select score from student_course where cid = 1 group by score order by score desc limit 1,1
);
在student_course表查询各科成绩最高的学生,结果列出学生id、课程id和对应的成绩
select * from student_course as x where score>=
(select max(score) from student_course as y where cid=x.cid);
在student_course表中查询每门课的前2名,结果按课程id升序,同一课程按成绩降序
select * from student_course x where
2>(select count(distinct(score)) from student_course y where y.cid=x.cid and y.score>x.score)
order by cid,score desc;
一个叫team的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球队,两两进行比赛,用一条sql语句显示所有可能的比赛组合
select a.name, b.name
from team a, team b
where a.name < b.name
竖变横
-- 年 季度 销售
-- 1991 1 11
-- 1991 2 12
-- 1991 3 13
-- 1991 4 14
-- 1992 1 21
-- 1992 2 22
-- 1992 3 23
-- 1992 4 24
-- 查询结果
-- 年 一季度 二季度 三季度 四季度
-- 1991 11 12 13 14
-- 1992 21 22 23 24 select 年,
sum(case when 季度=1 then 销售量 else 0 end) as 一季度,
sum(case when 季度=2 then 销售量 else 0 end) as 二季度,
sum(case when 季度=3 then 销售量 else 0 end) as 三季度,
sum(case when 季度=4 then 销售量 else 0 end) as 四季度
from sales group by 年;
面试题四:手写sql的更多相关文章
- SpringBoot项目里,让TKmybatis支持可以手写sql的Mapper.xml文件
SpringBoot项目通常配合TKMybatis或MyBatis-Plus来做数据的持久化. 对于单表的增删改查,TKMybatis优雅简洁,无需像传统mybatis那样在mapper.xml文件里 ...
- Hive手写SQL案例
1-请详细描述将一个有结构的文本文件student.txt导入到一个hive表中的步骤,及其关键字 假设student.txt 有以下几列:id,name,gender三列 1-创建数据库 creat ...
- 面试题|手写JSON解析器
这周的 Cassidoo 的每周简讯有这么一个面试题:: 写一个函数,这个函数接收一个正确的 JSON 字符串并将其转化为一个对象(或字典,映射等,这取决于你选择的语言).示例输入: fakePars ...
- 前端面试题整理——手写AJAX
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 前端面试题之手写promise
前端面试题之Promise问题 前言 在我们日常开发中会遇到很多异步的情况,比如涉及到 网络请求(ajax,axios等),定时器这些,对于这些异步操作我们如果需要拿到他们操作后的结果,就需要使用到回 ...
- hibernate使用手写sql以及对结果list的处理
Session sees=simpleDAO.getSessionFactory().openSession(); String sql = "select * from fhcb_08_t ...
- js面试题之手写节流函数和防抖函数
函数节流:不断触发一个函数后,执行第一次,只有大于设定的执行周期后才会执行第二次 /* 节流函数:fn:要被节流的函数,delay:规定的时间 */ function throttle(fn,dela ...
- IDEA中mybatis插件自动生成手写sql的xml文件
上图: 选择这个安装,然后重启IDEA,ok.
- 前端面试题整理——手写简易jquery
class jQuery { constructor(selector) { const result = document.querySelectorAll(selector) console.lo ...
随机推荐
- 云计算OpenStack核心组件---cinder存储服务(10)
一.cinder介绍 1.Block Storage 操作系统获得存储空间的方式一般有两种: (1)通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系统: ...
- JDK 14 都已经发布了,Java 8 依然是我的最爱
在 JDK 版本的世界里,从来都是 Oracle 发他的新版本,我们 Java 程序员继续用我们的老版本 几年之前用 JDK 7,后来终于升级到了 JDK 8.自从升级了没多久,JDK 就开始了半年发 ...
- CentOS 6.5新增加硬盘挂载并实现开机自动挂载
Centos7.x请参考:https://www.cnblogs.com/himismad/p/7851548.html 在内网主机Centos 6.5新增一个50G硬盘 (搭建在CAS服务器,直接新 ...
- linux服务器环境安全防范教程
一.目录权限设置很重要:可以有效防范黑客上传木马文件. 如果通过 chmod 644 * -R 的话,php文件就没有权限访问了. 如果通过chmod 755 * -R 的话,php文件的权限就高了. ...
- NLP文本分类
引言 其实最近挺纠结的,有一点点焦虑,因为自己一直都期望往自然语言处理的方向发展,梦想成为一名NLP算法工程师,也正是我喜欢的事,而不是为了生存而工作.我觉得这也是我这辈子为数不多的剩下的可以自己去追 ...
- Prometheus监控软件部署方法
背景:负责基于区块链的某公正项目的状态上报模块设计编码,基于Prometheus进行二次开发 1.说明Prometheus 是一个开源的服务监控软件,它通过 HTTP 协议从远程机器收集数据并存储在本 ...
- 手把手教你实现三种绑定方式(call、apply、bind)
关于绑定首先要说下this的指向问题. 我们都知道: 函数调用时this指向window 对象调用函数时this指向对象本身 看下面得例子: // 1 function test(){ const n ...
- 毫米波RADAR与LIDAR探秘
毫米波RADAR与LIDAR探秘 说起激光雷达和毫米波雷达,相信业内人士并不陌生,激光雷达是以发射激光束探测目标的位置.速度等特征量的雷达系统.而毫米波雷达是指工作在毫米波波段探测的雷达.毫米波实质上 ...
- 深度学习框架集成平台C++ Guide指南
深度学习框架集成平台C++ Guide指南 这个指南详细地介绍了神经网络C++的API,并介绍了许多不同的方法来处理模型. 提示 所有框架运行时接口都是相同的,因此本指南适用于所有受支持框架(包括Te ...
- 用于ONNX的TensorRT后端
用于ONNX的TensorRT后端 解析ONNX模型以使用TensorRT执行. 另请参阅TensorRT文档. 有关最近更改的列表,请参见changelog. 支持的TensorRT版本 Maste ...