1. limit 截断和偏移
limit可以用于截断和偏移查询结果。
select * from table limit n; -- 查table,只查n条
select * from table limit n,m -- 查table,从第n+1条开始,查m条
2. having 子句过滤
在 SQL 中,HAVING 子句用于在分组聚合后对分组进行过滤。它允许我们对分组后的结果进行条件筛选,只保留满足特定条件的分组。
HAVING 子句与条件查询 WHERE 子句的区别在于,WHERE 子句用于在 分组之前 进行过滤,而 HAVING 子句用于在 分组之后 进行过滤。
-- 按id分组汇总value,查汇总后大于100的结果
SELECT id, sum(value) AS sum_value
FROM table
GROUP BY id
HAVING sum(value) > 100;
3. union 和 union all区别
union返回的结果去重了;union all返回的结果没有去重。
4. 常用开窗函数
4.1 句式1:SUM(计算字段名) OVER (PARTITION BY 分组字段名)
开窗函数比group分组强大之处在于,可以返回分组字段之外的其他字段:
-- 查表table的所有记录,返回id,value,type_id,以及按type_id进行汇总value作为type_total_value
select id, value, type_id, sum(value) over(partition by type_id) as type_total_value from table;
4.2 句式2:SUM(计算字段名) OVER (PARTITION BY 分组字段名 ORDER BY 排序字段)
加上ORDER BY之后,SUM的结果就不是汇总,而是累加(先按排序字段排序,然后累加,每行的sumvalue结果值都是当前行value加上上一行累加的结果sumvalue)
-- 查表table的所有记录,返回id,value,type_id,以及按value降序排 然后按type_id进行累加value作为type_total_value
select id, value, type_id, sum(value) over(partition by type_id order by value desc) as type_total_value from table;
4.3 句式3:RANK() OVER (PARTITION BY 分组字段名 ORDER BY 排序字段)
RANK() 和 ROW_NUMBER() 都对查询结果进行排名。
注意:
RANK():当同一个type_id出现相同的value时,排名一样,同时下个人的排名会跳过一个序号(假如第二名和第三名value一样,排名结果是:1,2,2,4)
ROW_NUMBER():生成的序号一定都是连续且不重复的,排名不会重复或中断。
-- 查表table的所有记录,返回id,value,type_id,以及按type_id分组 按value降序来排名的排名序号
select id, value, type_id, sum(value) over(partition by type_id order by value desc) as type_total_value from table;
4.4 句式4:LAG(字段名, 偏移行数, 默认值) OVER (PARTITION BY 分组字段 ORDER BY 排序字段)
LAG 函数用于获取 当前行之前某行 的某一列的值。它可以帮助我们查看上一行的数据。
LEAD 函数用于获取 当前行之后某行 的某一列的值。它可以帮助我们查看上一行的数据。
-- 查表table的所有记录,返回id,value,type_id,以及按type_id分组 按value降序来排序后 上一条记录的id 和下一条记录的id
select id, value, type_id,
lag(id,1,null) over(partition by type_id order by value desc) as prev_id ,
lead(id,1,null) over(partition by type_id order by value desc) as next_id ,
from table;