近日有朋友发来几道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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有