开篇——SQL面试题痛的领悟

本文作者分享了自己从大学时期学习多种编程语言到工作后深入Python,再到意识到SQL重要性的历程。文章通过一个具体的SQL转换题目,展示了如何使用SQL进行数据转置,强调了在处理大数据时Python的局限性和SQL的高效简洁。同时,文章提醒读者在面试中重视SQL技能,指出SQL在某些场景下比Python更优的选择。
摘要由CSDN通过智能技术生成

前言

  • PS:学了这么久编程也是时候开始写一写一些笔记,心得啥的,也算是记录一下自己的成长经历了。

当初大学的时候,学的很杂各种C,JAVA,JS,R,SPSS,SAS,Android都有接触到也学了一点,纯粹是为了应付考试,学了就算了,基本上不会想着以后要干嘛,要咋滴。后来经过了社会的毒打,发现不学点技术那真是完蛋,从此走上了Python的不归路。

后来自学了Python比较长的一段时间了,但是SQL还是停留在上学那个时候的状态,结果对SQL只有模糊的印象,只会最最基本的select,甚至增删改都记不太清楚,以至于简简单单的增加语句:

insert into table(a, b, c) values(d, e, f);

都能写成:

insert table(a, b, c) into values(d, e, f);

之前总想着SQL只是用到普普通通的查询就好了,把查询到的所有数据读进来,然后用Python处理不就好了。

con = create_engine('mysql+pymysql://root:password@localhost:3306/database')
sql = 'select * from table'
df = pd.read_sql(sql, con=con)

但是,如果涉及到了数据量大的时候,这种方式是不可取的。

  1. 首先Python读取数据库不可避免的一个问题就是占用内存,数据量过大就很容易出现OOM,因为你现在是将整一个表存到内存当中,这无疑会过度占用内存空间的。
  2. 如果仅仅是一个查询需求,那么使用Python会显得代码量有些臃肿了,毕竟不管怎么样都是要导入包、登录数据库、使用loc、apply等等函数的,而相对来说SQL直接查询就显得更加简便而且快速。
  3. 以及不是所有的数据库机器都装有Python的,为了自己的技术便利给机器装一个Python通常也是难以被允许的。

到了去面试的时候,一做笔试题,那才叫一个抓鸡。真·书到用时方恨少啊。

SQL实现行列转置

印象特别深的一道题就是将table_1转换成table_2的形式。

table_1:

idyearmonthsal
12021111
22021212
32021313
42021414
52021515
62021616
720201111
820202112
920203113
1020204114
1120205115
1220206116

table_2:

yearm1m2m3m4m5m6
2021111213141516
2020111112113114115116

是不是很简单,而且难度也很低,但是当时就是不会啊,脚趾头都把鞋抓烂了。

好了直接贴代码(MySQL):

识别一下有没有同名的,有就删掉原表:

drop table if exists table_1;

创建表:

create table table_1(
id int(10) primary key,
syear int(10),
smonth int(10),
sal int(20)
);

插入table_1的数据:

insert into table_1(id, syear, smonth, sal) values(1, 2021, 1, 11);
insert into table_1(id, syear, smonth, sal) values(2, 2021, 2, 12);
insert into table_1(id, syear, smonth, sal) values(3, 2021, 3, 13);
insert into table_1(id, syear, smonth, sal) values(4, 2021, 4, 14);
insert into table_1(id, syear, smonth, sal) values(5, 2021, 5, 15);
insert into table_1(id, syear, smonth, sal) values(6, 2021, 6, 16);
insert into table_1(id, syear, smonth, sal) values(7, 2020, 1, 111);
insert into table_1(id, syear, smonth, sal) values(8, 2020, 2, 112);
insert into table_1(id, syear, smonth, sal) values(9, 2020, 3, 113);
insert into table_1(id, syear, smonth, sal) values(10, 2020, 4, 114);
insert into table_1(id, syear, smonth, sal) values(11, 2020, 5, 115);
insert into table_1(id, syear, smonth, sal) values(12, 2020, 6, 116);

查询一下看看结果:

select * from table_1;

在这里插入图片描述
接下来就是重头戏了:
主要的思想其实是,当 smonth = 1 的时候查询对应的sal作为一列,同理 smonth = 2 的时候也是一样的。
那么这个时候可以用到

case when a = '1' then b else c end

来解决这个问题,case when其实可以理解为当…就…不然,当列a的值=1,就输出b,不然就输出c,结束。

所以查询语句可以写成:

select syear as year,
sum(case when smonth = 1 then sal end) as m1,
sum(case when smonth = 2 then sal end) as m2,
sum(case when smonth = 3 then sal end) as m3,
sum(case when smonth = 4 then sal end) as m4,
sum(case when smonth = 5 then sal end) as m5,
sum(case when smonth = 6 then sal end) as m6
from table_1
group by year;

结果:
在这里插入图片描述
终于一道SQL的面试题就这样结束了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值