前言
做数仓开发离不开 SQL ,写了很多 HQL 回头再看 MySQL 才发现,很多东西并不是 HQL 所独创的,而是几乎都来自于关系型数据库通用的 SQL;想到以后需要每天和数仓打交道,那么不管是 MySQL 还是 Oracle ,都需要深入了解一下,不能只停留在之前的 CRUD 上了。
1、MySQL 函数
1.1、GROUP_CONCAT 聚合函数
1.1.1、语法
GROUP_CONCAT([DISTINCT] 字段名* [ORDER BY DESC|ASC] [SEPARATOR] )
1.1.2、使用案例
把不同部门的员工合并到一行,按照 id 进行升序排序,并用 '-' 分割开来:
SELECT department,GROUP_CONCAT(DISTINCT emp_id,emp_name ORDER BY emp_id SEPARATOR '-') AS id_with_name
FROM emp
GROUP BY department;
运行结果:
1.2、数学函数
简单的函数没有必要啰嗦,这里只介绍一些常用的:
- ABS:绝对值
- CEIL:向上取整
- FLOOR:向下取整
- RAND:0~1随机数
- ROUND(x):四舍五入取整
- ROUND(x,y):四舍五入保留 y 位小数
- TRUNCATE(x,y):不四舍五入保留 y 位小数
1.3、字符串函数
1.4、日期函数
1.5、if 函数
MySQL 的 IF 函数和 HQL 是一样的,这里不做介绍。
1.6、窗口函数
窗口函数一般都是配合聚合函数使用的,毕竟使用窗口就是为了把一类时间或者其它属性有关系的数据联系在一起。这里同样只介绍一些我没用过的函数:
1.6.1、CUME_DIST
用途:分组内小于、等于当前rank值的行数 / 分组内总行数
公式:rank / rows
场景:查询小于等于当前行某个值的记录占总记录的比例
解释:其实就是用 rank 函数的结果 / 记录总数
-- 该员工的薪资超过了相同部门多少人
SELECT emp_id,
emp_name,
department,
salary,
ROUND(CUME_DIST() OVER (PARTITION BY department ORDER BY salary),2) AS rate
FROM emp;
1.6.2、FIRST_VALUE 和 LAST_VALUE
用途:分组内的第一条/最后一条记录的某个字段的值
应用场景:截止目前按照xx排序后的第一名/最后一名的值
注意:它是对每一条记录都进行一次计算(相当于 rows between unbounded preceding and current row),而不是全局进行计算(它不会把该行之后考虑进计算范围)
-- 查询出同部门内工资最低和最高的人的薪资
SELECT emp_name,
salary,
FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary) AS first,