目录
- 一、函数
- 1. UNION ALL 以及 UNION
- UNION ALL
- UNION
- 2. group_concat
- 二、例题:
- 1. 列转行
- 2. 行转列
- 3. 查找第N高的数据,没有则返回null
一、函数
1. UNION ALL 以及 UNION
union:对多个结果,去重+排序
union all:对多个结果,不去重,不排序
UNION ALL
- 584. 寻找用户推荐人
- 1965. 丢失信息的雇员
UNION
- 1965. 丢失信息的雇员
2. group_concat
- 1484. 按日期分组销售产品
二、例题:
1. 列转行
- LeetCode_1795. 每个产品在不同商店的价格
2. 行转列
- LeetCode_1873. 计算特殊奖金
- LeetCode_627. 变更性别
- LeetCode_608. 树节点
关于 case when,可以看看这篇:【MySQL】SQL之CASE WHEN用法详解
3. 查找第N高的数据,没有则返回null
- LeetCode_176. 第二高的薪水
引申一下,如果获取第N高的数据呢?没有则返回null
Create table If Not Exists Employee (id int, salary int)
Truncate table Employee
insert into Employee (id, salary) values ('1', '100')
insert into Employee (id, salary) values ('2', '200')
insert into Employee (id, salary) values ('3', '300')
LIMIT + OFFSET (取第N高的数) + 子查询 (没有则返回null)
# 2. 挑出 Salary 列,显示的名字为 SecondHighestSalary
# 这里为什么要去重?是因为可能最高分有多个
SELECT DISTINCT
Salary AS SecondHighestSalary
# 1. 找到 Employee 表
FROM
Employee
# 3. 把表中的数据按照薪水排序,最高的在最上面
# !!!!! 第 N 低的数据呢?asc 排序,offset N !!!!!!!!
ORDER BY Salary DESC
# 4. limit 1 :取最高薪水
LIMIT 1
# 5. 偏移 N 位,就获取到了第 N 高的数据了
OFFSET 1
此时,如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,我们可以将其作为临时表。
SELECT
(SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1) AS SecondHighestSalary;
LIMIT + OFFSET (取第N高的数) + IFNULL (没有则返回null)
IFNULL(expr1,expr2)的用法:
假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。
IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary;
在前面的基础上,猜一猜 limit 3 offset 1 表示的是什么数据?