1. SQL 应掌握内容
参考链接 - 冷凡社长 -【避坑指南】数据分析师的SQL到底应该掌握到什么程度
case when 的用法- 窗口函数 如何使用
- 变量的使用
- 分组查询 严格模式
- 空值 的影响处理
count(*) 和 count(列) exist - 临时表
- 自联接
- 文本时间函数
1.1 知识点归纳
2. SQL 查询问题
2.1 简单查询
2.1.1 查找重复数据
? 参考链接 - 猴子数据分析- 《图解SQL面试题》- 图解面试题:如何查找重复数据?
知识点:
- 重复
?
\Rightarrow
? group by(重复项)
?
\Rightarrow
? count()
having 语句更高效,
- where 语句无法与聚合函数count 一起使用,
where 子句的运行顺序排在第二,运行到 where 时,表还没有被分组。 - sql 子句的书写顺序和运行顺序
- 关键字的顺序
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... - SELECT 语句的执行顺序
FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT
2.2 复杂查询
2.2.1 查找第N高的数据
? 参考链接 - 猴子数据分析- 《图解SQL面试题》- 图解面试题:如何查找第N高的数据?
知识点:
-
limit 和 offset
limit n 子句表示查询结果返回前 n 条数据, offset n 表示跳过 n 条语句;limit y offset x 分句表示查询结果跳过 x 条数据,读取前 y 条数据; -
ifnull(a, b)
- 如果 value1 不是空,结果返回
a ;如果 value1 是空,结果返回 b 。
2.3 多表查询
2.3.1 多表联结
? 参考链接 - 猴子数据分析- 《图解SQL面试题》- 图解面试题:多表如何查询?
知识点:
- 左联结(
left join ),联结结果保留左表的全部数据; - 右联结(
right join ),联结结果保留右表的全部数据; - 内联结(
inner join ),取两表的公共数据;
图源:《图解SQL面试题》- 图解面试题:多表如何查询?
2.3.2 查找不在表里的数据
? 参考链接 - 猴子数据分析- 《图解SQL面试题》- 图解面试题:如何查找不在表里的数据?
2.3.3 涨工资
? 参考链接 - 猴子数据分析- 《图解SQL面试题》- 图解面试题:你有多久没涨过工资了?
CREATE table `薪水表`(`雇员编号` VARCHAR(10), `薪水` int(10), `起始日期` datetime, `结束日期` datetime);
insert into `薪水表` values('10002', '72527', '2001-08-02', '2003-01-01');
insert into `薪水表` values('10002', '75432', '2003-01-01', '2004-01-01');
insert into `薪水表` values('10005', '94692', '2001-09-09', '2003-01-01');
insert into `薪水表` values('10006', '43311', '2001-08-02', '2004-01-01');
CREATE table `雇员表`(`雇员编号` VARCHAR(10), `出生日期` datetime, `姓名` VARCHAR(10), `性别` VARCHAR(10), `雇用日期` datetime);
insert into `雇员表` values('10002', '1976-09-09', '小明', '男','2001-08-02');
insert into `雇员表` values('10005', '1973-08-07', '小红', '女','2001-09-09');
insert into `雇员表` values('10006', '1980-08-28', '小兰', '女','2001-08-02');
select m.雇员编号,当前薪水-入职薪水 as 薪水涨幅
from
(select 雇员编号,薪水 as 当前薪水
from 薪水表
where 结束日期 = '2004-01-01') as m
left join
(select a.雇员编号,薪水 as 入职薪水
from 雇员表 as a
left join 薪水表 as b
on a.雇员编号 = b.雇员编号
where a.雇用日期 = b.起始日期 and a.雇员编号 in
(select 雇员编号
from 薪水表
where 结束日期 = '2004-01-01')) as n
on m.雇员编号 = n.雇员编号
order by 薪水涨幅;
|