数据分析学习Day8---Mysql(入门)
SQL最小化的查询结构如下:
select column fromt able
table是我们的表名,column是我们想要查询的字段/列,column可以用 * 代替,指代全部字段,意为从table表查询所有数据。
where 是基础查询语法,用于条件判断。
select*from DataAnalyst
where city = '上海'
上图是最简化的查询语句,将所有城市为上海的职位数据过滤出来。我们也可以用 and 进行多条件判断。
select * from DataAnalyst
where city = '上海' and positionName = '数据分析师'
or 语句则是或的关系
select*from DataAnalyst
where city = '上海' or positionName = '数据分析师'
查找城市为上海,或者职位名称是数据分析师的数据,它们是并集。
当我们涉及到非常复杂的与或逻辑判断,应该怎么办?比如即满足条件AB,又要满足条件C,或者是满足条件DE。此时需要用括号明确逻辑判断的优先级。
select*from DataAnalyst
where(city = '上海'and positionName = '数据分析师')or(city = '北京'and positionName = '数据产品经理')
这条语句的含义是查找出上海的数据分析师或者是北京的产品经理。当有括号时,会优先进行括号内的判断,当有多个括号时,对最内层括号先进行判断,然后依次往外。
接下来的问题来了,当我们要查询多个条件,比如北京上海广州深圳南京这些城市,难道一个个用and关联起来?这太麻烦了,我们可以使用 in 。
select * from DataAnalyst
where city in ('北京','上海','广州','深圳','南京')
当我们遇到字段数据类型是数值时,也可以使用符号> 、>=、< 、<=、!= 进行逻辑判断,!= 指的是不等于,等价于 <> 。
select * from DataAnalyst
where companyId >= 10000
上例是筛选出公司ID >= 10000的职位,为数值时,不需要像字符串一样加引号。
当我们需要取区间数值时,使用 between and
select * from DataAnalyst
where companyId between 10000 and 20000
between and 包括数值两端的边界,等同于 companyId >=10000 and companyId <= 20000。
如果要模糊查找,能用like。
select * from DataAnalyst
where position Name like '%数据分析%'
语句的含义是在positionName列查找包含「数据分析」字段的数据,%代表的是通配符,含义是无所谓「数据分析」前面后面是什么内容。如果是 '数据分析%' ,则代表字段必须以数据分析开头,无所谓后面是什么。
除了上面所讲,还有一个常用的语法是not,代表逻辑的逆转,常见not in、not like、not null等。
接下来我们学习group by,它是数据分析中常见的语法,目的是将数据按组/维度划分。类似于Excel中的数据透视表,我们以city为例。
select * from DataAnalyst
group by city
它将城市划分成几组,通过group by 可以快速的浏览数据有哪些城市。我们看一下它的高阶用法。
select city,count(1) from DataAnalyst
group by city
上述语句,使用count函数,统计计数了每个城市拥有的职位数量。括号里面的1代表以第一列为计数标准。这里出现新的问题,当我们遇到重复数据怎么办?在DataAnalyst 这张表中,北京职位包含重复的职位ID,我们需要去重。
select city,count(distinct positionId) from DataAnalyst
group by city
北京的数据一下子少了2000,多余的重复值被排除在外。distinct 是去重函数,distinct positionId 会只计算唯一的positionId个数。日常工作中,活跃用户数、文章UV,都是用distinct 计算获得,这是唯一标示符ID的重要作用。
除了count,还有max,min,sum,avg等函数,也叫做聚合函数。用法和Excel没什么区别。
当我们在group by 添加多个字段,它将以多维的形式进行数据聚合。
select city,workYear,count(distinct positionId) from DataAnalyst
group by city,workYear
这就是数据分析师常用的多维分析法,通过group by 切分不同的维度进行对比,在不利用BI的情况下,通过SQL进行快速数据分析。
接下来学习逻辑判断,SQL也有if函数,和Excel的用法一模一样,通过它我们能进行复杂的运算。比如我想统计各个城市中有多少数据分析职位,其中,电商领域的职位有多少,在其中的占比?
industryField是公司的行业领域,虽然我们能用where like 计算出有几个电商的数据分析师,但是占比的计算会比较麻烦,此时可以用if。
SELECT city,
COUNT(DISTINCT positionId),
COUNT(if(industryField like '%电子商务%',positionId,null))
FROM dataanalyst
GROUP BY city
第一列数字是职位总数,第二列是电商领域的职位数,相除就是占比。记住,count是不论0还是1都会纳入计数,所以第三个参数需要写成null,代表不是电商的职位就排除在计算之外。
接下来是新的问题,如果我想找出各个城市,数据分析师岗位数量在500以上的城市有哪些,应该怎么计算?有两种方法,第一种,是使用having语句,它对聚合后的数据结果进行过滤。
select city,count(distinct positionId) from DataAnalyst
group by city having count(distinct positionId) >= 500
第二种,是利用嵌套子查询。
我们将第一次查询获得的城市职位数的结果,看作一张新的表,利用as 将它命名为t1( table1 的简写),将职位数命名为一个新的字段counts。然后外面再套一层select 过滤出counts >=500。
这种查询方式就叫嵌套子查询,使用场景比较广泛,where 后面也能跟子查询。
很多时候,数据是凌乱的,我们希望结果能够呈现一定的顺序,这时候就用到order by语句。
看,数据就按照统计结果升序排列,如果需要降序,则是order by counts desc,后面加一个desc就好了。如果是多个字段,按逗号分隔即可。
最后是数据清洗类的函数。
MySQL支持left、right、mid等函数,这里又和Excel一样。我们通过salary计算数据分析师的工资吧(这一步骤,在曾经的文章中已经用Excel和BI多次讲解,所以我就不多赘述了,只讲过程,不熟悉的同学可以看历史内容)。
首先利用locate函数查找第一个k所在的位置。
然后使用left函数截取薪水的下限。
为了获得薪水的上限,要用substr函数,或者mid,两者等价。
薪水上限的开始位置是「-」位置往后推一位。截取长度是整个字符串减去「-」所在位置,刚好是后半段我们需要的内容,不过这个内容是包含「K」的,所以最后结果还得再减去1。
这里不了解不要紧,可以将计算过程分步骤运行。基本上,了解了上面写法的含义,文本清洗这块就没有问题了(not like用来清洗乱七八糟的薪水,我简单处理了)。再然后计算不同城市不同工作年限的平均薪资。
上面语句,我们用了文本清洗、子查询嵌套、分组聚合、排序等多种用法,属于较复杂的查询。重复数据的问题,因为我是复制了一份北京数据,数量刚好乘二,对平均数没有影响,感兴趣的朋友可以再加一步清洗掉它。