关注上方“小詹学Python”,选择“星标公众号”

关键时间,第一时间送达!

| 作者:无眠

| 来源:知乎

前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:“楼主能分享一下文科生怎么转行做数据分析吗??”、“SQL、python这些学起来好痛苦!”我看着屏幕苦笑,数据分析岗位现在的热门程度如果要形容的话,基本就是随便抓一个微博网友都知道这个岗位了。

Anyway,言归正传,数据分析师的招聘JD你们一定不陌生:

可以说,每个数据分析岗都需要会SQL。

我本人曾在滴滴、美团、平安科技的数据分析类岗位实习过,实习期间会大量运用sql进行取数。也参与了2018年的秋招,做过网易、拼多多、新浪等等公司的数据分析笔试题,还是比较了解SQL常考的题目类型的。

写这篇文章是希望帮助还没有实战过SQL的小伙伴、或者了解一些SQL语句,但是担心自己了解的太片面的小伙伴。这篇文章主要介绍的是:如果想要面试数据分析岗位,最优先需要掌握的SQL技能是哪些呢?

读完本文,你能快速知道:

(1)除了select 这种基本的语句,我最应该马上掌握的SQL语句和知识是什么?

(2)面试中SQL题80%都在考察的语法是什么?

(3)这些语法应该怎么使用?

本文将从三大块介绍入门SQL需要掌握的语法和知识,分别是

  • 最基础的选择(select)和连接(join/union)

  • 最常用的函数(distinct/group by/order by等)

  • 一些小小的进阶技巧(组内排序、取前百分之多少的值、时间函数)

从一个实习和秋招过来人的角度看,这些知识基本够面试的时候用了,如果本身也在数据分析岗位实习或者实习过,可以在评论区讨论或者补充一些也常常用到的SQL知识,大家一起交流进步~ ps. 本文主要做知识点快速突破,具体的实战练习大家必不可少还是要做!

介绍完了三大块知识后,后续会有常见的SQL面试/笔试题,可以练习和交流~

本文对于SQL知识的介绍结构

1. 最基本(选数据)

  • 怎么把数据从表里选出来?

-- 从table_1中选择a这一列select a from table_1
  • 想要的数据在多张表里,想取多个字段,该怎么办?—— 表连接

-- table_1中有id,age; table_2中有id,sex。想取出id,age,sex 三列信息-- 将table_1,table_2 根据主键id连接起来select a.id,a.age,b.sex from (select id,age from table_1) a
--将select之后的内容存为临时表ajoin (select id, sex from table_2) b
--将select之后的内容存为临时表bon a.id =b.id

在这里先介绍一下几种join: (敲重点,很容易问的哦)

join : hive的join默认是inner join,找出左右都可匹配的记录;

left join: 左连接,以左表为准,逐条去右表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL;

right join:右连接,以右表为准,逐条去左表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL;

full outer join: 全连接,包含两个表的连接结果,如果左表缺失或者右表缺失的数据会填充NULL。

每种join 都有on ,>join 之前要确保关联键是否去重,是不是刻意保留非去重结果。

  • 两张表数据的字段一样,想合并起来,怎么办?

-- 不去重,合并两张表的数据select * from (select id from table_1UNION ALLselect id from table_2)t;

union和union all 均基于列合并多张表的数据,所合并的列格式必须完全一致。union的过程中会去重并降低效率,union all 直接追加数据。union 前后是两段select 语句而非结果集。

2. 最常用(更有多重组合)

为方便大家理解每个函数的作用,先建一个表,后面以这个为示例。

  • 如果有千万用户数据,想知道有多少去重的用户数?—— 去重 distinct

-- 罗列不同的idselect distinct id from table_1
-- 统计不同的id的个数select count(distinct id) from  table_1
-- 优化版本的count distinctselect count(*) from(select distinct id from table_1) tb

distinct 会对结果集去重,对全部选择字段进行去重,并不能针对其中部分字段进行去重。使用count distinct进行去重统计会将reducer数量强制限定为1,而影响效率,因此适合改写为子查询。

  • 想分性别进行统计,看看男女各多少?—— 聚合函数和group by

-- 统计不同性别(F、M)中,不同的id个数select count(distinct id) from table_1group by sex-- 其它的聚合函数例如:max/min/avg/sum
-- 统计最大/最小/平均年龄select  max(age), min(age),avg(age) from table_1group by id

聚合函数帮助我们进行基本的数据统计,例如计算最大值、最小值、平均值、总数、求和

  • 只想查看A公司的男女人数数据?—— 筛选 where/having

-- 统计A公司的男女人数select count(distinct id) from table_1where company = 'A'group by sex
-- 统计各公司的男性平均年龄,并且仅保留平均年龄30岁以上的公司select company, avg(age) from table_1where sex = 'M'group by companyhaving avg(age)>30;
  • 希望查询结果从高到低/从低到高排序?—— 排序 order by

-- 按年龄全局倒序排序取最年迈的10个人select id,age from table_1 order by age DESC limit 10
  • 将数值型的变量转化为分类型的变量?—— case when 条件函数

-- 收入区间分组select id,(case when CAST(salary as float)<50000 Then '0-5万'when CAST(salary as float)>=50000 and CAST(salary as float)<100000 then '5-10万'when CAST(salary as float) >=100000 and CAST(salary as float)<200000 then '10-20万'when CAST(salary as float)>200000 then '20万以上'else NULL end from table_1;
  • case 函数的格式为(case when 条件1 then value1 else null end), 其中else 可以省,但是end不可以省。

在这个例子里也穿插了一个CAST的用法,它常用于string/int/double型的转换。

  • 字符串

1. concat( A, B...)返回将A和B按顺序连接在一起的字符串,如:concat('foo', 'bar') 返回'foobar'

select concat('www','.iteblog','.com') fromiteblog;--得到 www.iteblog.com

2. split(str, regex)用于将string类型数据按regex提取,分隔后转换为array。

-- 以","为分隔符分割字符串,并转化为arraySelect split("1,2,3",",")as value_array from table_1;-- 结合array index,将原始字符串分割为3列select value_array[0],value_array[1],value_array[2] from (select  split("1,2,3",",")as value_array from table_1 )t

3. substr(str,0,len) 截取字符串从0位开始的长度为len个字符。

select substr('abcde',3,2) fromiteblog;
-- 得到cd

3. 基础进阶

  • 不想全局排序,需要分组排序?—— row_number()

-- 按照字段salary倒序编号select *, row_number() over (order by salary desc) as row_num from table_1;
-- 按照字段deptid分组后再按照salary倒序编号select *, row_number() over (partition by deptid order by salary desc) as rank from table_1;

按照depid分组,对salary进行排序(倒序)

除了row_number函数之外,还有两个分组排序函数,分别是rank() 和dense_rank()。

  • rank()排序相同时会重复,总数不会变 ,意思是会出现1、1、3这样的排序结果;

  • dense_rank() 排序相同时会重复,总数会减少,意思是会出现1、1、2这样的排序结果。

  • row_number() 则在排序相同时不重复,会根据顺序排序。

  • 想要获取top10%的值?—— percentile 百分位函数

-- 获取income字段的top10%的阈值select percentile(CAST (salary AS int),0.9)) as income_top10p_threshold from table_1;
-- 获取income字段的10个百分位点select percentile(CAST (salary AS int),array(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) as income_percentilesfrom table_1;
  • 想要对时间字段进行操作?—— 时间函数

-- 转换为时间数据的格式select to_date("1970-01-01 00:00:00") as start_time from table_1;
-- 计算数据到当前时间的天数差 select datediff('2016-12-30','2016-12-29');-- 得到 "1"

to_date函数可以把时间的字符串形式转化为时间类型,再进行后续的计算;

  • 常用的日期提取函数包括 year()/month()/day()/hour()/minute()/second()

  • 日期运算函数包括datediff(enddate,stratdate) 计算两个时间的时间差(day);

  • date_sub(stratdate,days) 返回开始日期startdate减少days天后的日期。

  • date_add(startdate,days) 返回开始日期startdate增加days天后的日期。

4. 常见笔试/面试题

例:有3个表S,C,SC:

S(SNO,SNAME)代表(学号,姓名)

C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)

SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)

问题:

1. 找出没选过“黎明”老师的所有学生姓名。

2. 列出2门以上(含2门)不及格学生姓名及平均成绩。

3. 既学过1号课程又学过2号课所有学生的姓名。

1. -- 考察条件筛选select sname from s where sno not in( select sno from sc where cno in   (select distinct cno from c where cteacher='黎明'   ));
2. -- 考察聚合函数,条件筛选select s.sname, avg_grade from sjoin(select sno from sc where scgrade < 60 group by sno having count(*) >= 2) t1on s.sno = t1.snojoin(select sno, avg(scgrade) as avg_grade from sc group by sno ) t2on s.sno = t2.sno;
3. -- 考察筛选、连接select sname from ( select sno from sc where cno = 1) ajoin  (select sno from sc where cno = 2) bon a.sno = b.sno

做SQL题的时候注意理解每个题目希望你用的是什么知识点,这样有助于巩固。

当初我学SQL的时候,盯着《SQL必知必会》翻来覆去的看,但是知识点真的比较多,也比较零碎。在写这篇文章之前,也看过知乎上关于SQL学习的文章,有的比较广泛而全面,有的则很干货,全部是牛客上的SQL题目的解析。

基于自己的体会,我写了这篇SQL面试和笔试的入门文章,主旨是快速、清晰的把握重点。希望大家都能快快入门SQL

END来和小伙伴们一起向上生长呀~~~扫描下方二维码,添加小詹微信,可领取千元大礼包并申请加入 Python学习交流群,群内仅供学术交流,日常互动,如果是想发推文、广告、砍价小程序的敬请绕道!一定记得备注「交流学习」,我会尽快通过好友申请哦!(添加人数较多,请耐心等待)
(扫码回复 1024  即可领取IT资料包)

SQL | 数据分析面试必备SQL语句+语法相关推荐

  1. hive 日期函数_数据分析面试必备——SQL窗口函数你会了吗?

    之前写过一篇sql的文章,面向基础的sql操作(无眠:数据分析面试必备--SQL你准备好了吗?),目前已经有12000+收藏(收藏是点赞的5倍,你们可真狠心哪),也可以看出众多同学对sql学习的热情. ...

  2. server sql 分组 去重 字符串拼接_SQL | 数据分析面试必备SQL语句+语法

    | 作者:无眠 | 来源:知乎 前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:"楼主能分享一下文科生怎么转行做数据分析吗??".&qu ...

  3. hive sql练习_SQL语句+语法 I 数据分析面试必备

    - 点击上方"中国统计网"订阅我吧!- 前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:"楼主能分享一下文科生怎么转行做数据分 ...

  4. hive sql数据分析面试整理

    1.写作目的说明 hive sql是从事数据分析的同学的基本功.无论是秋招.春招或者是实习,sql都是面试官考察的重点,拿刚刚过去的19秋招来说,搜狐.网易.京东等在数据分析师岗位面试时都考了sql, ...

  5. 面试必备SQL调优方案

    前言 以我个人做的项目为例,因为早期开发项目上线以后用户量还不是很大,之前考虑过数据量大时是否做sql优化,但是一直因为项目还在开发中没来得及细心的调优下SQL,由于业务前期数据量比较小,基本都能满足 ...

  6. 诚之和:SQL 左连接 - 示例连接语句语法

    在关系型数据库中,表之间通常以某种方式相互关联,允许它们的信息在整个数据库中仅写入一次.然后,当你需要分析数据时,你需要组合来自这些相关表的信息. 要在 SQL 中执行此操作,您可以使用JOIN语句. ...

  7. sql两个列值以下划线拼接得到一个新的列_面试必备sql知识点——MySQL基础

    在刷了上百道sql题后,发现所有的题目都是基于某一个或几个知识点来做考察的,所以理清基础的知识细节,才能在题目考察到任意知识点时,找到解决线索. 温故而知新,学习在于总结,于是我再次对已经学习过的my ...

  8. sql server 多条记录数据合并为一条_面试必备sql知识点——MySQL基础

    在刷了上百道sql题后,发现所有的题目都是基于某一个或几个知识点来做考察的,所以理清基础的知识细节,才能在题目考察到任意知识点时,找到解决线索. 温故而知新,学习在于总结,于是我再次对已经学习过的my ...

  9. 数据分析-面试(SQL真题)

    文章目录 1. 淘宝 题目一 题目二(重点:漏斗转化率) 题目三(重点:复购率) 2. 腾讯 题目一(重点:留存率) 3. 字节 题目一 题目二 小结 注:时间内有限,可能有不少瑕疵,目前只看思路 1 ...

最新文章

  1. 2021年大数据Flink(四十一):​​​​​​​Flink实现订单自动好评
  2. Hadoop新手篇:hadoop入门基础教程
  3. HDU4267(2012长春网络赛)
  4. win2012活动目录介绍
  5. Ext FormPanel布局 (一行显示两对控件元素)
  6. java学习(151):字节输出流
  7. python中convert函数用法_Python Pandas DataFrame.tz_convert用法及代码示例
  8. flash flip 效果集
  9. 6491: Daydream
  10. C#基础17:匿名方法与Lambda表达式
  11. SEO专题之三:SEO与网站开发
  12. Struts2返回JSON数据的具体应用范例
  13. 算法设计与分析(第2版)屈婉玲 刘田 张立昂 王捍贫编著 第三章课后习题答案
  14. python程序设计搜题软件下载_智慧职教云课堂APPPython程序设计期末考试搜题公众号答案...
  15. ONVIF 获取RTSP URL过程
  16. java io bio nio aio 详解
  17. 四川大学计算机学院现代软件工程(双语 百度云,四川大学2012软件工程导论(双语) (A 闭 )...
  18. 【HDL系列】乘法器(5)——Radix-2 Booth乘法器
  19. 奇虎360笔试题 最后一个字符
  20. 40张动图完美解析各种传感器工作原理

热门文章

  1. Redis淘汰删除策略
  2. mysql 导出表结构和表数据 mysqldump用法(自己测试了)
  3. 麒麟810处理器_华为nova5跑分公布,麒麟810到底是什么水平?
  4. linux 关中断 调度,关中断是否禁止任务调度?关中断能作为互斥吗?
  5. rip协议中周期性广播路由信息的报文_距离矢量路由协议(RIP)
  6. 无极菜单 php,ThinkPHP菜单无极分类 ThinkPHP菜单无极分类实例讲解
  7. catch句子_「实用英文」知道 catch on 是什么意思吗?catch 精选短语合集
  8. java string字节数组_java(基本类型或者String字符串)与(字节数组)相互转换
  9. 【mybatis】 “if“ 相关联的 “test“ 属性值不能包含 ‘<‘ 字符
  10. window系统下安装TensorFlow-gpu