SQL,从入门到熟练

本文是《如何七周成为数据分析师》的第十篇教程,如果想要了解写作初衷,可以先行阅读七周指南。温馨提示:如果您已经熟悉数据库,大可不必再看这篇文章,或只挑选部分。

在《写给新人的数据库指南》,我们已经成功的安装数据库,并且导入数据,今天进入SQL实战练习。SQL是数据库的查询语言,语法结构简单,相信本文会让你从入门到熟练。

掌握SQL后,不论你是产品经理、运营人员或者数据分析师,都会让你分析的能力边界无限拓展。别犹豫了,赶快上车吧!

以下的语句都在SequelPro的Query页面运行,其他操作页面不会有太大差异。标点符号必须为英文,这是新人很容易犯的错误。

SQL最小化的查询结构如下:

  1. select column from table

table是我们的表名,column是我们想要查询的字段/列,column可以用 * 代替,指代全部字段,意为从table表查询所有数据。

where 是基础查询语法,用于条件判断。

  1. select * from DataAnalyst
  2. where city = ‘上海‘

上图是最简化的查询语句,将所有城市为上海的职位数据过滤出来。我们也可以用 and 进行多条件判断。

  1. select * from DataAnalyst
  2. where city = ‘上海‘ and positionName = ‘数据分析师‘

or 语句则是或的关系

  1. select * from DataAnalyst
  2. where city = ‘上海‘ or positionName = ‘数据分析师‘

查找城市为上海,或者职位名称是数据分析师的数据,它们是并集。

当我们涉及到非常复杂的与或逻辑判断,应该怎么办?比如即满足条件AB,又要满足条件C,或者是满足条件DE。此时需要用括号明确逻辑判断的优先级。

  1. select * from DataAnalyst
  2. where (city = ‘上海‘ and positionName = ‘数据分析师‘) or (city = ‘北京‘ and positionName = ‘数据产品经理‘)

这条语句的含义是查找出上海的数据分析师或者是北京的产品经理。当有括号时,会优先进行括号内的判断,当有多个括号时,对最内层括号先进行判断,然后依次往外。

接下来的问题来了,当我们要查询多个条件,比如北京上海广州深圳南京这些城市,难道一个个用and关联起来?这太麻烦了,我们可以使用 in 。

  1. select * from DataAnalyst
  2. where city in (‘北京‘,‘上海‘,‘广州‘,‘深圳‘,‘南京‘)

当我们遇到字段数据类型是数值时,也可以使用符号> 、>=、< 、<=、!= 进行逻辑判断,!= 指的是不等于,等价于 <> 。

  1. select * from DataAnalyst
  2. where companyId >= 10000

上例是筛选出公司ID >= 10000的职位,为数值时,不需要像字符串一样加引号。

当我们需要取区间数值时,使用 between and

  1. select * from DataAnalyst
  2. where companyId between 10000 and 20000

between and 包括数值两端的边界,等同于 companyId >=10000 and companyId <= 20000。

如果要模糊查找,能用like。

  1. select * from DataAnalyst
  2. where positionName like ‘%数据分析%‘

语句的含义是在positionName列查找包含「数据分析」字段的数据,%代表的是通配符,含义是无所谓「数据分析」前面后面是什么内容。如果是 ‘数据分析%‘ ,则代表字段必须以数据分析开头,无所谓后面是什么。

除了上面所讲,还有一个常用的语法是not,代表逻辑的逆转,常见not in、not like、not null等。

接下来我们学习group by,它是数据分析中常见的语法,目的是将数据按组/维度划分。类似于Excel中的数据透视表,我们以city为例。

  1. select * from DataAnalyst
  2. group by city

它将城市划分成几组,通过group by 可以快速的浏览数据有哪些城市。我们看一下它的高阶用法。

  1. select city,count(1) from DataAnalyst
  2. group by city

上述语句,使用count函数,统计计数了每个城市拥有的职位数量。括号里面的1代表以第一列为计数标准。这里出现新的问题,当我们遇到重复数据怎么办?在DataAnalyst 这张表中,北京职位包含重复的职位ID,我们需要去重。

  1. select city,count(distinct positionId) from DataAnalyst
  2. group by city

北京的数据一下子少了2000,多余的重复值被排除在外。distinct 是去重函数,distinct positionId 会只计算唯一的positionId个数。日常工作中,活跃用户数、文章UV,都是用distinct 计算获得,这是唯一标示符ID的重要作用。

除了count,还有max,min,sum,avg等函数,也叫做聚合函数。用法和Excel没什么区别。

当我们在group by 添加多个字段,它将以多维的形式进行数据聚合。

  1. select city,workYear,count(distinct positionId) from DataAnalyst
  2. group by city,workYear

这就是数据分析师常用的多维分析法,通过group by 切分不同的维度进行对比,在不利用BI的情况下,通过SQL进行快速数据分析。

接下来学习逻辑判断,SQL也有if函数,和Excel的用法一摸一样,通过它我们能进行复杂的运算。比如我想统计各个城市中有多少数据分析职位,其中,电商领域的职位有多少,在其中的占比?

industryField是公司的行业领域,虽然我们能用where like 计算出有几个电商的数据分析师,但是占比的计算会比较麻烦,此时可以用if。

  1. select if(industryField like ‘%电子商务%‘,1,0) from DataAnalyst

上面的公式利用if判断出哪些是电商行业的数据分析师,哪些不是。if函数中间的字段代表为true时返回的值,不过因为包含重复数据,我们需要将其改成positionId。之后,用它与group by 组合就能达成目的了。

  1. select city,
  2. count(distinct positionId),
  3. count(if(industryField like ‘%电子商务%‘,positionId,null))
  4. from DataAnalyst
  5. group by city

第一列数字是职位总数,第二列是电商领域的职位数,相除就是占比。记住,count是不论0还是1都会纳入计数,所以第三个参数需要写成null,代表不是电商的职位就排除在计算之外。

接下来是新的问题,如果我想找出各个城市,数据分析师岗位数量在500以上的城市有哪些,应该怎么计算?有两种方法,第一种,是使用having语句,它对聚合后的数据结果进行过滤。

  1. select city,count(distinct positionId) from DataAnalyst
  2. group by city having count(distinct positionId) >= 500

第二种,是利用嵌套子查询。

我们将第一次查询获得的城市职位数的结果,看作一张新的表,利用as 将它命名为t1( table1 的简写),将职位数命名为一个新的字段counts。然后外面再套一层select 过滤出counts >=500。

这种查询方式就叫嵌套子查询,使用场景比较广泛,where 后面也能跟子查询。

很多时候,数据是凌乱的,我们希望结果能够呈现一定的顺序,这时候就用到order by语句。

  1. select city,count(distinct positionId) as counts from DataAnalyst
  2. group by city
  3. order by counts

看,数据就按照统计结果升序排列,如果需要降序,则是order by counts desc,后面加一个desc就好了。如果是多个字段,按逗号分隔即可。

我们再来熟悉SQL的常用函数,首先是时间。因为我们的练习数据中没有时间,首先用now创建出一个时间字段。

  1. select now()

直接执行它,就能获得当前的系统时间,精确到秒。其实select不一定后面要跟from。

  1. select date(now())

它代表的是获得当前日期,week函数获得当前第几周,month函数获得当前第几个月。其余还包括,quarter,year,day,hour,minute。

时间函数也包含各种参数,比如week,因为中西方计算第几天是不一样的,西方把周日算作一周中的第一天,而我们习惯周一。

  1. select week(now(),0)

除了以上的日期表达,也可以使用dayofyear、weekofyear 的形式计算。它和上面的部分函数等价。

怎么对时间进行加减法呢?这时候靠date_add函数出马。

  1. select date_add(date(now()) ,interval 1 day)

我们可以改变1为负数,达到减法的目的,也能更改day为week、year等,进行其他时间间隔的运算。如果是求两个时间的间隔,则是datediff(date1,date2)或者timediff(time1,time2)。

时间函数的运用比较灵活,没有特殊限定,网络上的文档和教程也不少,可以深入学习。

最后是数据清洗类的函数。

  1. select left(salary,1) from DataAnalyst

MySQL支持left、right、mid等函数,这里又和Excel一样。我们通过salary计算数据分析师的工资吧(这一步骤,在曾经的文章中已经用Excel和BI多次讲解,所以我就不多赘述了,只讲过程,不熟悉的同学可以看历史内容)。

首先利用locate函数查找第一个k所在的位置。

  1. select locate("k",salary),salary from DataAnalyst

然后使用left函数截取薪水的下限。

  1. select left(salary,locate("k",salary)-1),salary from DataAnalyst

为了获得薪水的上限,要用substr函数,或者mid,两者等价。

  1. substr(字符串,从哪里开始截,截取的长度)

薪水上限的开始位置是「-」位置往后推一位。截取长度是整个字符串减去「-」所在位置,刚好是后半段我们需要的内容,不过这个内容是包含「K」的,所以最后结果还得再减去1。

这里不了解不要紧,可以将计算过程分步骤运行。基本上,了解了上面写法的含义,文本清洗这块就没有问题了(not like用来清洗乱七八糟的薪水,我简单处理了)。再然后计算不同城市不同工作年限的平均薪资。

上面语句,我们用了文本清洗、子查询嵌套、分组聚合、排序等多种用法,属于较复杂的查询。重复数据的问题,因为我是复制了一份北京数据,数量刚好乘二,对平均数没有影响,感兴趣的朋友可以再加一步清洗掉它。

下面是三道思考题:

查询出哪家公司招聘的岗位数最多;

查询出O2O、电子商务、互联网金融这三个行业,哪个行业的平均薪资最高;

查询出各城市的最高薪水Top3是哪家公司哪个岗位。

做完上面的题目,你已经神功初成,数据分析的SQL意见没有大问题了。更复杂的查询,也无非是嵌套更多的内容,本质思路是一样的。

讲到这里,只剩join语法还没有教大家。因为练习数据只有一张表,而join又是SQL中比较容易混淆的难点,我会单独开一篇内容讲解,到时候使用SQLZoo和LeetCode的案例。

LeetCode是知名的算法竞赛网站,可以在上面和全世界的程序员比拼算法,当然我们只练习SQL,完成后,至少能秒杀全世界50%的程序员吧。

原文地址:https://www.cnblogs.com/syncnavigator/p/10198357.html

时间: 2024-11-09 18:16:10

SQL,从入门到熟练的相关文章

1.SQL语句入门

--SQL语句入门-- --1.sql语言是解释语言 --2.它不区分大小写 --3.没有“”,所有字符或者字符串都使用''包含 --4.sql里面也有类似于c#的运算符 -- 算术运算符:+ - * / % -- 关系运算符:> < >= <= =(赋值与逻辑相等都是=), <> != -- 逻辑运算符:!(not)&&(and) || (or) --5.在sql中没有BOOL值的概念,也就意味着条件中不能写true/false 但是对于bit类型的值

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了.我们要判断,任意一张表插入失败都回滚,就是都不插入,这就是事务的基本使用. 一,sql事务定义 所谓事务是用户定义的一个数据库操作序列,是一个不可分割的工作

SQL从入门到基础&ndash;03 SQLServer基础1(主键选择、数据插入、数据更新)

一.SQL语句入门 1. SQL语句是和DBMS"交谈"专用的语句,不同DBMS都认SQL语法. 2. SQL语句中字符串用单引号. 3. SQL语句中,对于SQL关键字大小写不敏感,对于字符串值大小写敏感. 4. 创建表.删除表不仅可以手工完成,还可以执行SQL语句完成,在自动化部署.数据导入中用的很多,Create Table T_Person(Id int not NULL,Name nvarchar(50),Age int NULL).Drop Table T_Person1

sql xml 入门

/*sql xml 入门: 1.xml: 能认识元素.属性和值 2.xpath: 寻址语言,类似windows目录的查找(没用过dir命令的话就去面壁) 语法格式,这些语法可以组合为条件: "."表示自己,".."表示父亲,"/"表示儿子,"//"表示后代, "name"表示按名字查找,"@name"表示按属性查找 "集合[条件]" 表示根据条件取集合的子集,条件可以

(译文)A/B测试从入门到熟练指南

(译文)A/B测试从入门到熟练指南 原文地址: http://www.smashingmagazine.com/2014/07/11/roadmap-to-becoming-an-a-b-testing-expert/ A/B测试,也叫做分离测试(也有叫做对比测试的),这是一种针对观察页面布局相似的两个不同版本着陆页的转化率, 来进行对比的点蚀测试方法(抽样测试法). A/B测试是通过观察和测试用户使用过程,找到最快捷引导用户到目标页面的着陆页版本.比如注册或者订阅网站信息的引导页面. 测试的内

1 小时 SQL 极速入门(三)——分析函数

转自:https://www.cnblogs.com/injet/p/10122832.html 前面两篇我们从 SQL 的最基础语法讲起,到表联结多表查询.大家可以点击链接查看1 小时 SQL 极速入门(一)1 小时 SQL 极速入门(二)今天我们讲一些在做报表和复杂计算时非常实用的分析函数.由于各个数据库函数的实现不太一样,本文基于 Oracle 12c . ROW_NUMBER()函数 这个函数在平时用的还是比较多的.这个函数的作用是为分组内的每一行返回一个行号.我们还是举例来说明.假设我

vue需要知道哪些才能算作入门以及熟练

前两天接到一个面试官问我vue什么程度才算作可以用于开发,以前从没遇到过类似问题.只能大致说了一些,事后觉得也应该总结一下,前端vue这么火热那究竟什么才算做入门什么才算做熟练,只是我个人观点,不代表所有人,每个人理解可能有所不同,本次不说精通级,在我看来除了那些参与框架开发维护以及那些能对vue提出有价值意义的人之外都不能说自己精通,当然如果能自己手写一套和vue差不多甚至更胜vue的那不算精通vue了,那算精通js的大神.本次博文仅对职场中入门与熟练 入门级需要掌握 1.生命周期 befor

Oracle PL/SQL语言入门

简介:PL/SQL(Procedural Language/Structured Query Language)是一种过程化语言,属于第三代语言,它与C.C++.Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑.它允许SQL的数据操纵语言和查询语句包含在块结构(block_structured)和代码过程语言中,使PL/SQL成为一个功能强大的事务处理语言. 一.背景介绍 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通

使用WinDbg调试SQL Server——入门

这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题来写这篇文章. 缘由 当使用SQL Server时,你到底需不需要像WinDbg这样的调试器?简单回答:从不需要!SQL Server是一个稳定的产品,使用它提供的技术(扩展事件,DMVs/DMFs)进行故障排除已经可以了,从不会用到WinDbg.如果你有疑问的话,在你独自尝试调试讨厌的SQL Se