热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sqlcast函数_SQL大厂面试常考知识点|新手速进

前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:“楼主能分享一下文科生怎么转行做数据分析吗&#

前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:

“楼主能分享一下文科生怎么转行做数据分析吗?”

“SQL、python这些学起来好痛苦!”

我看着屏幕苦笑,数据分析岗位现在的热门程度如果要形容的话,基本就是随便抓一个微博网友都知道这个岗位了。

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

1b470b1b6698b73ab746538a6c021fc3.png

可以说,不是每个数据分析岗都要求python,但是每个数据分析岗都需要会SQL。

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

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

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

  • 除了select 这种基本的语句,我最应该马上掌握的SQL语句和知识是什么?
  • 面试中SQL题80%都在考察的语法是什么?
  • 这些语法应该怎么使用?

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

2879f24266b0859cd1eb6b026b074d82.png

一.最基本(选数据)

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

-- 从table_1中选择a这一列select a from table_1

2. 表连接

-- 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: (敲重点,很容易问的哦)

094465fe7d4cccda32dddac380ca3304.png

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

82c2af8b910fd43ff8d04c94895b2042.png

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

e7cc6c047071e5ba5fb2938c0285305c.png

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

d9834c91b82c63ba5e016be5bf11609f.png

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

a49be2d559d4c09df0d42bc8a980c88d.png

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

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

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

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

二.最常用

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

1cba7d9359b4030489526d09526e6653.png

1. 去重 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,而影响效率,因此适合改写为子查询。

2. 聚合函数和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

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

3. 筛选 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;

4. 排序 order by

-- 按年龄全局倒序排序取最年迈的10个人select id,age from table_1 order by age DESC limit 10

5. case when 条件函数

-- 收入区间分组select id,(case when CAST(salary as float)<50000 Then &#39;0-5万&#39;when CAST(salary as float)>&#61;50000 and CAST(salary as float)<100000 then &#39;5-10万&#39;when CAST(salary as float) >&#61;100000 and CAST(salary as float)<200000 then &#39;10-20万&#39;when CAST(salary as float)>200000 then &#39;20万以上&#39;else NULL end from table_1;

case 函数的格式为(case when 条件1 then value1 else null end), 其中else 可以省&#xff0c;但是end不可以省。

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

6. 字符串

1)concat( A, B...)返回将A和B按顺序连接在一起的字符串&#xff0c;如&#xff1a;concat(&#39;foo&#39;, &#39;bar&#39;) 返回&#39;foobar&#39;。

select concat(&#39;www&#39;,&#39;.iteblog&#39;,&#39;.com&#39;) fromiteblog;

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

-- 以","为分隔符分割字符串&#xff0c;并转化为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(&#39;abcde&#39;,3,2) fromiteblog;-- 得到cd

三.基础进阶

1.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;

3ded48fc7b0fcdf2c70248cab6ec9966.png

按照depid分组&#xff0c;对salary进行排序(倒序)

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

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

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

row_number() 则在排序相同时不重复&#xff0c;会根据顺序排序。

2.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;

3.时间函数

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

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

常用的日期提取函数包括&#xff1a;

  • year()/month()/day()/hour()/minute()/second()
  • 日期运算函数包括datediff(enddate,stratdate) 计算两个时间的时间差(day)
  • date_sub(stratdate,days) 返回开始日期startdate减少days天后的日期
  • date_add(startdate,days) 返回开始日期startdate增加days天后的日期

想要学习MySQL课程

可以在九道门1块钱注册会员免费学哦~

b9a06587578c305eaaff98db5fbe1d2b.png



推荐阅读
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文介绍了如何使用 Spark SQL 生成基于起始与终止时间的时序数据表。通过 `SELECT DISTINCT goods_id, get_dt_date(start_time, i) as new_dt` 语句,根据不同的时间间隔 `i` 动态填充日期,从而构建出完整的时序数据记录。该方法能够高效地处理大规模数据集,并确保生成的数据表准确反映商品在不同时间段的状态变化。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 利用Java开发功能完备的电话簿应用程序,支持添加、查询与删除操作
    本研究基于Java语言开发了一款功能全面的电话簿应用程序,实现了与数据库的高效连接。该应用不仅支持添加、查询和删除联系人信息,还具备输出最大和最小ID号的功能,并能够对用户输入的ID号进行有效性验证,确保数据的准确性和完整性。详细实现方法可参阅相关文档。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 在PHP中,高效地分割字符串是一项常见的需求。本文探讨了多种技术,用于在特定字符(如“或”)后进行字符串分割。通过使用正则表达式和内置函数,可以实现更加灵活和高效的字符串处理。例如,可以使用 `preg_split` 函数来实现这一目标,该函数允许指定复杂的分隔符模式,从而提高代码的可读性和性能。此外,文章还介绍了如何优化分割操作以减少内存消耗和提高执行速度。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
  • 在将Excel数据导入MySQL数据库的过程中,如何确保不会生成重复记录?本文介绍了一种方法,通过PHP脚本检查数据库中是否存在相同的“Code”字段值,从而避免重复记录的产生。该方法不仅提高了数据导入的准确性,还增强了系统的健壮性。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
author-avatar
可心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有