近日有朋友发来几道SQL题,说是面试时遇到的。拿到题目一看,确实和一般的SQL题不太一样,还是有点小技巧在的,对于没有工作经验的新手来说,能写出一道题的有一小部分,能写出2道的就不多了。

不过对于有工作经验的程序员来说,这几道题至少有3道题是不在话下的。
如果你是刚刚毕业的同学,碰巧你面试遇到这几次题,又碰巧你学会做,那恭喜你,就凭这几道SQL题,你这次面试90%的可能就通过了。

废话不说先上题:

第1题:用一条SQL语句查询业务表(test_1)中某字段(A)中不是纯数字的记录

第2题:用一句SQL查询商品销量排榜表(test_2)销量排在第三位的到第六位的商品名称和销量
资料:商品销量排行榜test_2(商品编号:pro_id,销量: sales_volume)
商品表test2_pro(商品编号:pro_id,商品名称pro_name)

第3题:用一句SQL根据主键删除表里c字段的重复数据(表:test_3;主键:a,b两个字段,c字段为varchar)

第4题:用一句SQL 将业务表(test_4)的数据(图1),按每天,每家门店、每种支付方式对支付金额汇总,用一句SQL转成图2的格式。

===========================================
下面开始讲题

讲题之前先吐槽一下,SQL题做起来挺恶心的,没有经验的话必须得先把数据构建出来,要不然就算你写出来了都不敢保证你写的一定是对的,而有的时候数据构建的没有水平的话,就算你的SQL语句执行结果是对的,但是SQL语句不一定是对的。

以上这段话,有些同学可能看不懂,先不管他了,等你某年某月的某一天,有可能你会遇到一条SQL语句明明昨天执行结果是对的,可是今天怎么都不对,那时候你可能就会明白昨天执行结果是对的,是因为碰巧昨天的错误数据,遇到昨天的错误SQL,最后得到一个正确的结果。所以。。。。

好吧,这次我帮大家把数据构建好了,做SQL题的话,一定要去亲自实践,才能练出真本事,所以这篇文章中不直接给出答案,题目都不难,希望你亲自去实践一下,花一点时间自己找到答案,同时你也能收获解决问题的喜悦。如果你还有疑惑,也可以回到文章,答案获取方式就在文章的最后。

CREATE TABLE `test_1` (`a` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `test_1` (`a`) VALUES ('abcd1234');
INSERT INTO `test_1` (`a`) VALUES ('1234');
INSERT INTO `test_1` (`a`) VALUES ('1234abcd');
INSERT INTO `test_1` (`a`) VALUES ('abcd');
INSERT INTO `test_1` (`a`) VALUES ('<>?:"');
INSERT INTO `test_1` (`a`) VALUES ('abcd1234aaaa');
INSERT INTO `test_1` (`a`) VALUES ('abcd1234aa234234aa');CREATE TABLE `test_2` (`pro_id` int(11) NOT NULL,`sales_volume` int(11) NOT NULL,PRIMARY KEY (`pro_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (1, 7);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (2, 8);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (3, 1);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (4, 9);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (5, 10);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (6, 6);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (7, 4);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (8, 5);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (9, 3);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (10, 2);CREATE TABLE `test2_pro` (`pro_id` int(11) NOT NULL,`pro_name` varchar(255) DEFAULT NULL,PRIMARY KEY (`pro_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (1, 'Mate20');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (2, 'Mate20Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (3, 'Mate30');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (4, 'Mate30Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (5, 'Mate40');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (6, 'Mate40Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (7, 'Mate50');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (8, 'Mate50Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (9, 'P10');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (10, 'P20');CREATE TABLE `test_3` (`a` int(11) NOT NULL,`b` int(11) NOT NULL,`c` varchar(255) DEFAULT NULL,PRIMARY KEY (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (1, 1, 'Tom');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (1, 2, 'Tom');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (2, 1, 'Jarry');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (2, 2, 'Martin');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (2, 3, 'Amy');CREATE TABLE `test_4` (`单号` varchar(255) DEFAULT NULL,`门店` varchar(255) DEFAULT NULL,`结单日期` datetime DEFAULT NULL,`支付方式` varchar(255) DEFAULT NULL,`支付金额` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020001', '1001', '2022-08-15', '现金', 3);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020002', '1002', '2022-08-14', '支付宝', 4);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020003', '1003', '2022-08-15', '微信', 7);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020004', '1001', '2022-08-14', '银行卡', 6);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020005', '1001', '2022-08-15', '现金', 8);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020006', '1003', '2022-08-14', '微信', 12);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020007', '1004', '2022-08-15', '银行卡', 13);

下面先说说第一题:

用一条SQL语句查询业务表(test_1)中某字段(A)中不是纯数字的记录

这个题大眼一看应该不难,但是一般情况下用传统的SQL语句是办不到的,也就是说你想用LIKE 去查,对不起,搞不定。这时候得用正则表达式。去搜一搜正则的用法吧。

再来看第二题:

用一句SQL查询商品销量排榜表(test_2)销量排在第三位的到第六位的商品名称和销量
资料:商品销量排行榜test_2(商品编号:pro_id,销量: sales_volume)
商品表test2_pro(商品编号:pro_id,商品名称pro_name)

这个题不难,学习还可以的毕业生同学也能做出来,有两个考点。
一是表连接,二是limit的用法,具体不再细说。

然后是第三题

用一句SQL根据主键删除表里c字段的重复数据(表:test_3;主键:a,b两个字段,c字段为varchar)

这道题有点难度,网上能找到很多删除重复数据的帖子,但99%都是一个主键,这道题两个主键就有点麻烦了,不过思路都是差不多的。
比如说这个思路:

delete from Studentwhere Name in( select Name from Student group by  Name having count(Name) > 1) and ID not in(select  max(ID) from Student group by  Name having count(Name) > 1 )

用一个子查询 查出重复的Name清单,然后用name in (),选定要被删除的记录。
然后再用一个id not in () 把重复的数据中保留下来id值最大的那一条,其它的则删除掉。

而我们知道,用IN子查询的时候,子查询里只能有一列,可这个需要匹配多列怎么办呢?这可怎么办?

其实问题出来了,子查询只能支持一列,而思路其实也已经有了,就是把多列变成一列就OK了。怎么变成一列呢?
办法有很多,比如说用concat把两列连接起来,不过你要注意,如果这两个有两条记录,a,b列分别是11,2,和1,12。如果你不做处理的话,会影响执行结果哦,怎么解决这个问题呢?开动一下你脑筋吧。

最后第四题:

用一句SQL 将业务表(test_4)的数据(图1),按每天,每家门店、每种支付方式对支付金额汇总,用一句SQL转成图2的格式。

其实这道SQL面试题蛮经典的,典型的行转列,很多新手是蒙圈的。类似这个问题的解决思路常见的有两种:
一种是子查询大法,另一种是case大法,两种SQL语句看起来都挺让人崩溃的。
今天我再介绍一种MYSQL里面的SUM(IF())方法。

select 门店,结单日期,sum(if(支付方式='现金',t.支付金额,0)) as 现金
from test_4 t
group by 门店,结单日期
order by 结单日期,门店

====================================================
其实呢,学习SQL没有捷径,最好的办法就是去练习。练习的时候要注意首先要把问题分析透彻,其次是把复杂问题拆解,然后一步一步去测试,一步一步去解决,就算是3000行的SQL语句也能写得出来。

为防止大家范懒,我把答案上传到了CSDN资源里,点击链接可以去下载:

https://download.csdn.net/download/aley/86401105
需要1分的下载分,学知识总要付出点努力的嘛。如果想骂我欢迎在评论里面吐槽。哈哈。

没有分的同学也可以到VX公众号搜索【姚SIR面试间】,关注后回复“SQL面试题01”,也可以得到答案。

这几道SQL面试题秒杀大部分的0年工作经验的毕业生相关推荐

  1. 这10道Java面试题!大部分的人回答不出来

    1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 2.为什么Java中不支持多重继承? 3.为什么Java不支持运算符重载? 4.为什么 String 在 Java 中是不可 ...

  2. Java继承_这10道Java面试题!大部分的人回答不出来

    1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 2.为什么Java中不支持多重继承? 3.为什么Java不支持运算符重载? 4.为什么 String 在 Java 中是不可 ...

  3. java开发工程师面试题总结(适用于1-2年工作经验的人)

    这些资料有的是自己在网上看到的,有的是自己亲身经历后整理的. 1.JAVA的垮平台原理 JVM也是一个软件,不同的平台有不同的版本.我们编写的Java源码,编译后会生成一种 .class 文件,称为字 ...

  4. 30道经典SQL面试题讲解(11-20)

    本篇节选自书籍<对比Excel,轻松学习SQL数据分析>一书,主要讲解数据分析面试中常见的30道SQL面试题.1-10题见:30道经典SQL面试题讲解(1-10) 11 行列互换 现在我们 ...

  5. 30道经典SQL面试题讲解(1-10)

    本篇节选自书籍<对比Excel,轻松学习SQL数据分析>一书,主要讲解数据分析面试中常见的30道SQL面试题. 1 查询每个班学生数 现在有一张全校学生信息表stu_table,这张表存储 ...

  6. 50道MySQL面试题,经典~

    一.测试表数据 学生表:student [学号,学生姓名,出生年月,性别] 成绩表:score [学号,课程号,成绩] 课程表:course [课程号,课程名称,教师号] 教师表:teacher [教 ...

  7. python面试宝典黑马_110道Python面试题,自学党的福音!

    Python面试题,Python面试题分享,110道Python面试题分享! 面试,无论是你做什么工作都会遇到的问题,今天黑马君总结了110道Python面试题,分享给正在找工作的Python程序员们 ...

  8. 9道很棘手的面试题,大部分人只会3道

    棘手的Java面试问题是那些有一些惊喜元素的问题.如果你试图用常识回答一个棘手的问题,你很可能会因为需要一些特定的知识而失败.大多数棘手的Java问题来自于令人困惑的概念,如函数重载和覆盖,多线程,掌 ...

  9. sql a 表 若包含b表 则a 表 列显示_几道常见的SQL面试题,看你能答对几道?

    分享几道比较常见的SQL面试题,在不看底部参考答案的情况下,看自己能做对几道. 1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名 2. 学生表 如下: 删除除了自动编号不同, 其他都相同的 ...

最新文章

  1. 插入排序之——直接插入排序(c/c++)
  2. MATLAB 仿真分析龙门吊车
  3. js如何判断当前页面是否处于激活状态
  4. 请你讲一讲JavaScript有哪些数据类型, 数据类型判断有哪些方法?
  5. 【NLP傻瓜式教程】手把手带你RCNN文本分类(附代码)
  6. java 接口隔离_关于接口隔离原则的一个实现:
  7. mac mysql not found_mac版mysql安装后显示mysql: command not found咋整?
  8. SSM框架之Spring MVC(四)异常处理和拦截器实现
  9. Postman界面介绍及实例(转)
  10. 64位 setupdienumdeviceinterfaces_win7 32位重装系统详细教程
  11. macOS的Fn键实用技巧分享
  12. iOS App图标和启动画面尺寸http://www.jianshu.com/p/adpKye
  13. YAF redis
  14. 写一个自动阅读的方法(需要运用html和css和JavaScript)
  15. 一个案例,入门Java动态代理技术
  16. [原创]C#中国象棋网络版源代码-C# Chinese Chess Source Code
  17. 软件设计实验一 UML建模实验
  18. 在VMware上用深度技术安装windows xp
  19. 云e办学习笔记(四)SpringSecurity学习(二)
  20. 决手动打开凭据管理器报0x80070005错误的问题-CMD方式

热门文章

  1. 道一云七巧-低代码快速开发平台 JNPF快速开发平台 3.4 更新介绍说明
  2. 矛盾集合体——static的相关用法介绍
  3. Facebook登录(Login Button)
  4. matlab图形标注与修饰函数title、xlabel、ylabel 【matlab图行绘制二】
  5. unity shader 实现Ps的 19号笔刷厚涂阴影效果
  6. 2021-11-14阿迪看医生
  7. intel服务器最新主板芯片组,拒绝阴霾 主板芯片组如何承载时代经典
  8. 图像中出现的“鬼影”和“重影”区分
  9. python作业答案用什么软件好_什么软件可以搜python答案
  10. java语言程序设计郑莉课后答案_java语言程序设计郑莉第九篇课后习题答案.docx...