SQL是当之无愧的第一工具,排名第二的是BI,excel也相当重要,python所占比例不大。
随着经验要求上升,岗位对数据分析建模能力的要求越来越广泛,学习算法和建模是数据分析进阶的必备路径。建模指机器学习算法和深度学习算法。
业务能力排名第一,产品、运营和项目经验等也都和业务能力挂钩。除了业务外,统计分析、建模也十分重要。
select <select_list> from <table_list> [where <condition>] [group by <group_by_list>] [having <having_condition>] [order by <order_by_list> ASC|DESC] [limit <limit_number>]
select-查询 from-从 where-哪里(满足XX条件的) group by-依据XX分组 order by-依据XX排序 limit-限制N条 总结:从XX表中查询满足XX条件的XX列,结果依据XX分组,依据XX排序,限制返回N条。
怎么把数据从表中选择出来–select
想要的数据在多张表中,想取多个字段,该怎么办?–表连接
注意:
MySQL中不支持全连接
每种jion都有on,on的是左表和右表中都有的字段。join之前要确保关联键是否去重,是不是刻意保留非去重结果。
两张表数据的字段一样,想合并起来,怎么办?–union
union和union all均基于列合并多张表的数据,所合并的列格式必须完全一致。union的过程中会去重并降低效率,union all直接追加数据。
去重 distinct
如果有千万用户数据。想知道有多少不重复的用户数?
罗列不同的id
select distinct id from Table_1
统计不同的ld数
select count(distinct id) from Table_1
优化版本的count distinct
select count(*) from (select distinct id from table_1) tb
聚合 max/min/sum/count+group by
想分性别进行统计,看看男女各多少?
select count(distinct id) from table_1 group by hender;
select max(age),min(age),avg(age) from table_1
筛选 having、where
只想查看A公司的男女人数数据?
select count(distinct id) from table_1 where company = 'A' group by gender;
select company,avg(age) from table_1 where gender = "M" group by company having avg(age)>30
排序 order by
select id,age from table_1 order by age DESC limit 10;
条件 case when
select id case when CAST(salary as float)<50000 then "5万" when CAST(salary as float)>=5000 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;
cast是将salary转化为浮点数,防止是字符串不能计算
再举一个例子:
窗口函数是什么
窗口函数语法
MySQL开窗函数的种类
最常用的是前三个。
题型1【查询不在表里的数据】
这里有两张表,一张是学生表Table_1,一张是已经选课了的学生的信息表Table_2。现在要求找出还没有选课的同学。
解题思路:
完整代码:
同类题型——LeetCode数据库【183.从不订购的客户】
题型2【查找第N高的数据】
有一张“成绩表"Table_1,包含学生编号,选修课程的编号和成绩信息。现在需要找出某课程成绩第二高的学生成绩。这里以课程编号为“01"的同学为例。如果不存在第二高成绩的学生,那么查询应返回null。
解题思路:
select * from table_1 where 课程编号=‘01’;
select distinct 成绩 from table_1 where 课程编号=‘01’ order by 课程编号,成绩 desc limit 1 offset 1;
select ifnull(第二步的结果,null) as '01课第二名成绩';
完整代码
# 利用ORDER BY排序,再利用Limit限制offset偏移,排除只有1个值情况结合IFNULL SELECT IFNULL( (SELECT DISTINCT 成绩 FROM Table_1 ORDER BY 成绩 DESC LIMIT 1 OFFSET 1), NULL)AS "01课程第二高的成绩";
知识点
题型3【分组排序问题】
下图是成绩表Table_1中的内容,记录了每个学生学生编号,课程编号和成绩。现在需要根据成绩来排名,如果两个分数相同,那么排名要是并列的。
比如题目中的成绩从大到小排序应该是80,80,76,70,50,31。
分数相同排名并列,那么6位同学的排序应该是1,1,3,4,5,6。
解题思路:
完整代码
select *, rank() over (order by 成绩 desc) as "排名" from table_1;
知识点
rank, dense_rank, row_number三种开窗函数的区别
同类题型——LeetCode数据库【178.分数排名】
题型4【连续出现N类问题】
下面是某班级学生的某课程的成绩表(表名Sscore,列名:学号、成绩),使月SQL查找所有至少连续出现3次的成绩。
解题思路:
参考代码1
select distinct a.成绩 as 连续出现3次的成绩 from sscore as a, Sscore as b, Sscore as c where a.学号=b.学号-1 and b.学号= c.学号-1 and a.或绩=b.成绩and b.成绩= c.成绩;
参考代码2
SELECT 成绩, max(rk) AS 成绩_cnt FROM (SELECT 成绩, row_number() over(PARTITION BY成绩) AS rk --先计算出排名 FROM Sscore) t GROUP BY t.成绩--根据最大的排名来知道“成绩"的出现次数 HAVING 成绩_cnt >= 3;--用排名进行筛选
知识点
同类题型——LeetCode数据库【180.连续出现的数字】
参考:数据分析面试通关