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
多用于分组求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;
题目 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/