[LeetCode解题]--SQL专题 [ 窗口函数的应用;差集 交集 并集;group by ]

    科技2024-05-24  84

    1.Limit x y详解

    limit n子句表示查询结果返回前n条数据

    offset n表示跳过x条语句

    limit y offset x 分句表示查询结果跳过 x 条数据,读取前 y 条数据

    limit x, y 分句表示: 跳过 x 条数据,读取 y 条数据

    题目 176. 第二高的薪水

    首先先将数据去重: SELECT DISTINCT Salary FROM Employee 再将是数据按薪水降序排除: SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC 分页的思想是一页一条数据,第二高的薪水则在第二页: SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 考虑到极端情况:没有第二薪水则为空,使用ifnull判断: SELECT IFNULL( (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1),null) AS SecondHighestSalary

     

    2.rank, dense_rank, row_number

    多用于分组求TOPN

    题目 178. 分数排名  184. 部门工资最高的员工   185. 部门工资前三高的所有员工

     

    select *,

       rank() over (order by 成绩 desc) as ranking,

       dense_rank() over (order by 成绩 desc) as dese_rank,

       row_number() over (order by 成绩 desc) as row_num

    from 班级

    总结

    rank函数生成的序号有可能不连续dense_rank函数在生成序号时是连续的

    row_number的用途非常广泛,排序最好用它行号,依次排序且不会重复

     

     

    模板

    # topN问题 sql模板 select * from ( select *, row_number() over (partition by 要分组的列名 order by 要排序的列名 desc) as 排名 from 表名) as a where 排名 <= N;

     

    3.求差集[ A - B]、交集[ A ∩ B ]、并[ A ∪ B ]集

    题目 183. 从不订购的客户

     

    4. union 和 union all

    595. 大的国家

    a. 使用 or 会使索引会失效,在数据量较大的时候查找效率较低,通常建议使用 union 代替 or。

    b. union在连接查询的两张表的时候,会自动去除 重复的数据。    union all 在连接查询的时候,只是简单的将两张表中的数据进行连接,不会去除重复的数据。

    5. group by

    1179. 重新格式化部门表

    Department 表: +------+---------+-------+ | id | revenue | month | +------+---------+-------+ | 1 | 8000 | Jan | | 2 | 9000 | Jan | | 3 | 10000 | Feb | | 1 | 7000 | Feb | | 1 | 6000 | Mar | +------+---------+-------+ SELECT id,revenue,MONTH FROM _1179_重新格式化部门表 GROUP BY id;

    GROUP BY id 会使department表按照id分组,生成一张虚拟表,当然我们是不可见的。【务必要把group by生成的虚拟表记住】

    +------+---------+-------+ | id | revenue | month | +------+---------+-------+ | | 8000 | Jan | | 1 | 7000 | Feb | | | 6000 | Mar | +------+---------+-------+ | 2 | 9000 | Jan | +------+---------+-------+ | 3 | 10000 | Feb | +------+---------+-------+

    在虚拟表中,所有id=1的revenue或者month数据都写在了同一个单元格中,如8000、7000、6000都是写在同一单元格内的。

    但是真正输出的时候,只有一条记录结果如下。[此时应该有聚合函数出场]

    如果还没看明白,推荐一篇文章

    https://blog.csdn.net/u014717572/article/details/80687042

     

     

    参考

    https://leetcode-cn.com/problems/department-top-three-salaries/solution/tu-jie-sqlmian-shi-ti-jing-dian-topnwen-ti-by-houz/

    Processed: 0.022, SQL: 8