SQL 常忘记知识点汇总

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;

 

 

下一篇: