百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

数据分析师必备--SQL你准备好了吗?

bigegpt 2024-08-14 14:45 2 浏览

数据分析师的招聘JD你们一定不陌生:

可以说,不是每个数据分析岗都要求python,但是每个数据分析岗都需要会SQL。写这篇文章是希望帮助还没有实战过SQL的小伙伴、或者了解一些SQL语句,但是担心自己了解的太片面的小伙伴。

这篇文章主要介绍的是:如果想要面试数据分析岗位,最优先需要掌握的SQL技能是哪些呢?读完本文,你能快速知道:

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

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

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

本文将从三大块介绍入门SQL需要掌握的语法和知识,分别是最基础的选择(select)和连接(join/union);最常用的函数(distinct/group by/order by等);一些小小的进阶技巧(组内排序、取前百分之多少的值、时间函数)。

一、最基本(选数据)

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

-- 从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之后的内容存为临时表a

join

(select id, sex from table_2) b --将select之后的内容存为临时表b

on a.id =b.id

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

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

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

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

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

每种join 都有on , on的是左表和右表中都有的字段。join 之前要确保关联键是否去重,是不是刻意保留非去重结果。

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

-- 不去重,合并两张表的数据

select * from

(

select id from table_1

UNION ALL

select id from table_2

)t;

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

二、最常用

(不是用这个就是用那个,更有可能多重组合)

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

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

-- 罗列不同的id

select distinct id from table_1

-- 统计不同的id的个数

select count(distinct id) from table_1

-- 优化版本的count distinct

select 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_1

group by sex

-- 其它的聚合函数例如:max/min/avg/sum

-- 统计最大/最小/平均年龄

select max(age), min(age),avg(age) from

table_1

group by id

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

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

-- 统计A公司的男女人数

select count(distinct id) from table_1

where company = 'A'

group by sex

-- 统计各公司的男性平均年龄,并且仅保留平均年龄30岁以上的公司

select company, avg(age) from table_1

where sex = 'M'

group by company

having 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') from

iteblog;

--得到 www.iteblog.com

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

-- 以","为分隔符分割字符串,并转化为array

Select 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) from

iteblog;

-- 得到cd

三、基础进阶

?不想全局排序,需要分组排序?—— 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_percentiles

from 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天后的日期。

四、常见笔试/面试题

例:有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 s

join

(select sno from sc where scgrade < 60 group by sno having count(*) >= 2) t1

on s.sno = t1.sno

join

(select sno, avg(scgrade) as avg_grade from sc group by sno ) t2

on s.sno = t2.sno;

3. -- 考察筛选、连接

select sname from

( select sno from sc where cno = 1) a

join

(select sno from sc where cno = 2) b

on a.sno = b.sno

相关推荐

为3D手游打造, Visual Studio Unity扩展下载

IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...

由ArcMap属性字段自增引出字段计算器使用Python的技巧

1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...

微软首次回答 HoloLens 相关问题,终于爆料了

fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...

C#指针的应用(c#指针类型)

C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...

C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)

C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...

欢迎回来:Fortran意外重回流行编程语言20强榜单

TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...

C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案

简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...

C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤

在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...

C# (一)状态机模式(状态机代码实现)

最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...

C# 中 Predicate 详解(c#中的replace)

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...

C#中$的用法?(c#中&&什么意思)

文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...

C#并行编程:Parallel类(c# 并行处理)

在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...

颠覆认知!用Span重构foreach循环竟让数据处理快如闪电

在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...

Unity3D手游开发实践《腾讯桌球》客户端开发经验总结

本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...

.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...