Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >这几道SQL面试题秒杀大部分的0年工作经验的毕业生

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

作者头像
熬夜的花斑狗
发布于 2022-08-19 09:48:22
发布于 2022-08-19 09:48:22
3060
举报
文章被收录于专栏:开发+运维+架构开发+运维+架构

近日有朋友发来几道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);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

下面先说说第一题:

用一条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 Student

where 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 )

1

2

3

用一个子查询 查出重复的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 结单日期,门店

1

2

3

4

====================================================

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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵
图片💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40📘 AI 面试题库系列:https://www.showmeai.tech/tutorials/48📘 本文地址:https://www.showmeai.tech/article-detail/318📢 声明:版权所有,转载请联系平台与作者并注明出处📢 收藏ShowMeAI查看更多精彩内容图片本篇内容基于场景面试题完成,在给定场景和数据表的前提下,有一系列的分析挖掘问题,
ShowMeAI
2022/08/26
5670
面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵
SQL 必知必会 50 题(31 - 35)
最主要的错误在于 GROUP BY 后边跟着的是统计结果,其次在于 HAVING 后边的 COUNT() 其实是可以不用再次计算的,可以直接利用已经统计出的结果。第二处不算错误,但是改了之后能提高 SQL 语句所执行的效率。
村雨遥
2022/06/15
3520
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
文章目录 一、订单确认功能实现 1.后台处理逻辑 2.JS 二、订单支付成功页面 1.后台逻辑 2.页面设计 3.实际效果 一、订单确认功能实现 1.后台处理逻辑 class OrderView(LoginRequiredJSONMixin,View): def post(self,request): # 这里省略了很多操作,这些操作不需要事务 # 1.订单信息 # 1.1 获取用户信息 user = request.u
愚公搬代码
2022/02/07
4900
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
MySQL实战面试题(附案例答案+建表语句+模拟数据+案例深度解析),练完直接碾压面试官
使用YEAR()和MONTH()函数从signup_date字段中提取年份和月份,并匹配给定的条件。
小白的大数据之旅
2024/11/20
2000
重温SQL Server的行转列和列转行,面试常考题
行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 的运算符PIVOT来实现。用传统的方法,比较好理解。层次清晰,而且比较习惯。但是PIVOT 、UNPIVOT提供的语法比一系列复杂的SELECT…CASE 语句中所指定的语法更简单、更具可读性。下面我们通过几个简单的例子来介绍一下列转行、行转列问题。
SQL数据库开发
2024/04/24
1K0
重温SQL Server的行转列和列转行,面试常考题
好的数据库面试题集合
http://blog.csdn.net/sandyzhs/article/details/4059709
bear_fish
2018/09/20
1.9K0
MySQL 系列教程之(十五)SQL 面试题精讲
查询每个主播的最大level以及对应的最小gap(注意:不是每个主播的最大level和最小gap)
ruochen
2021/08/17
45.9K0
MySQL 系列教程之(十五)SQL 面试题精讲
30道经典SQL面试题讲解(11-20)
本篇节选自书籍《对比Excel,轻松学习SQL数据分析》一书,主要讲解数据分析面试中常见的30道SQL面试题。1-10题见:30道经典SQL面试题讲解(1-10)
张俊红
2021/01/05
8100
30道经典SQL面试题讲解(11-20)
面试官:深度不够,建议回去深挖。—— 你的回答,总绕来绕去?
从刚面试的问题回答中,能看得出你用了不少拙力背了不少题。直接拿这些技术点问,你可以回答。但同样是这些技术点,我换个场景来问用到了什么技术,你就像从没有听说过一样。当然不可否认你能通过背把这些内容记住也是一种能力,但作为招聘从事软件编程的码农来说,其实更希望是招聘那些通过实际场景积累下来技术经验研发人员,对各个技术点有张有弛,举一反三。这也是一个理科生该具备的学习编程的基本素质,也更具有培养价值。
小傅哥
2022/10/17
1.1K0
面试官:深度不够,建议回去深挖。—— 你的回答,总绕来绕去?
面试官:深度不够,建议回去深挖。
从刚面试的问题回答中,能看得出你用了不少拙力背了不少题。直接拿这些技术点问,你可以回答。但同样是这些技术点,我换个场景来问用到了什么技术,你就像从没有听说过一样。当然不可否认你能通过背把这些内容记住也是一种能力,但作为招聘从事软件编程的码农来说,其实更希望是招聘那些通过实际场景积累下来技术经验研发人员,对各个技术点有张有弛,举一反三。这也是一个理科生该具备的学习编程的基本素质,也更具有培养价值。
小傅哥
2022/12/13
8790
面试官:深度不够,建议回去深挖。
高性能电子商务平台构建(一)
1.设置:站点设置;帐号同步;上传设置;SEO设置;消息通知;支付方式;权限设置;配送地区;
硬核项目经理
2019/08/06
1.6K0
oracle面试必会6题经典_oracle常见面试题
1.你要对操纵Oracle数据库中的数据。下列哪个选项表示Oracle中select语句的功能,
全栈程序员站长
2022/11/02
2.5K0
面试小结汇总
第一阶段:分析需求,公司先把需求给到我们,让我们先去了解一两天,这两天我们会把一些不明确的需求点记录下来。输出:不明确的需求问题,然后会有一个需求的澄清会,我们把不理解的地方在会议上说出来,包含需求的合理性,还有可测性等。
wangmcn
2022/07/26
6480
2021年软件测试面试题大全[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 一、面试基础题 简述测试流程: 1、阅读相关技术文档(如产品PRD、UI设计、产品流程图等)。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划
全栈程序员站长
2022/07/23
1.2K0
2021年软件测试面试题大全[通俗易懂]
解锁Agent的数据分析潜能,开启智能决策新时代(19/30)
在当今数字化浪潮中,Agent 宛如一颗璀璨的新星,正迅速崛起并成为各个领域不可或缺的得力助手。从智能客服领域的 7×24 小时在线答疑,到内容创作领域的灵感激发与文案生成;从智能推荐系统中的精准个性化推荐,再到销售场景下的客户线索自动跟进,Agent 凭借其自主执行任务的卓越能力,深度融入人们的生产生活,极大地提升了效率,降低了成本。
正在走向自律
2025/01/25
1870
解锁Agent的数据分析潜能,开启智能决策新时代(19/30)
字节面试题: Mysql索引结构,为什么要用b+树?
在数据库管理系统中,索引是一种数据结构,用于快速定位和访问数据库表中的特定记录。它类似于书籍的目录,可以帮助数据库系统快速定位到数据所在的位置,而不必扫描整个数据表。MySQL支持多种类型的索引,包括主键索引、唯一索引、普通索引和全文索引等。
GeekLiHua
2025/01/21
1210
字节面试题: Mysql索引结构,为什么要用b+树?
一套前后台全部开源的H5商城送给大家
博主给大家推荐一套全部开源的H5电商项目「waynboot-mall」。由博主在2020年开发至今,已有三年之久。那时候网上很多的H5商城项目都是半开源版本,要么没有H5前端代码,要么需要加群咨询,属实恶心。于是博主决定自己开发一套完整的移动端H5商城,包含一个管理后台、一个前台H5商城、一套后端接口。项目地址如下:
wayn
2023/05/07
1.2K0
一套前后台全部开源的H5商城送给大家
Kettle构建Hadoop ETL实践(九):事实表技术
上两篇里介绍了几种基本的维度表技术,并用示例演示了每种技术的实现过程。本篇说明多维数据仓库中常见的事实表技术。我们将讲述五种基本事实表扩展,分别是周期快照、累积快照、无事实的事实表、迟到的事实和累积度量。和讨论维度表一样,也会从概念开始认识这些技术,继而给出常见的使用场景,最后以销售订单数据仓库为例,给出Kettle实现的作业、转换和测试过程。
用户1148526
2020/11/26
6.1K0
Kettle构建Hadoop ETL实践(九):事实表技术
2019年最新PHP面试题
答:我叫xxx,来自北京,20xx年毕业于xx大学计算机xx系,毕业后在武汉从事了x年的php开发工作,公司是一个外包公司,主要做微信开发,公众号推广,商城,论坛的开发
码农编程进阶笔记
2021/07/20
7180
平平无奇SQL面试题:经典50例
组函数: 去重 distinct() 统计总数sum() 计算个数count() 平均数avg() 最大值max() 最小数min()
大数据真好玩
2021/07/07
2.6K0
推荐阅读
相关推荐
面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档