limit…offset
- limit…offset后面字段只接受正整数(即0、负数、小数都不行)或者单一变量(意味着不能用表达式),也就是说想取一条,limit 2-1、limit 1.1这类的写法都是错误的。
- limit x,y 等同于 limit x offset y ,即跳过y行,取x行数据
窗口函数
- 窗口函数语法
<窗口函数> over (partition by 用于分组的列名
order by 用于排序的列名 asc/desc)
<窗口函数>的位置内,可以放两种函数:
- 专用窗口函数,如rank,dense_rank,row_number等
- 聚合函数,如sum,avg,count,max,min等
2.窗口函数有以下功能:
- 同时具有分组和排序的功能
- 不减少原表的行数,经常应用在每组内的排名
3.窗口函数原则上只写在select子句中
4.窗口函数使用场景
- 业务需求“在每组内排名”,比如
排名问题:每个部门按业绩来排名
topN问题:找出每个部门排名前N的员工进行奖励
5.rank,dense_rank,row_number三个窗口函数的区别
1)rank函数:就是如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4。
2)dense_rank函数:就是如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2。
3)row_number函数:就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。
作者:houzidata
链接:https://leetcode-cn.com/problems/rank-scores/solution/tu-jie-sqlmian-shi-ti-jing-dian-pai-ming-wen-ti-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
使用窗口函数,不使用group by的原因是:group by 会减少表的行数,即相同的内容只显示一行,起到去重的目的,但并不是删除数据
连续问题
针对于连续问题,如“连续出现三次”等,可以采用自连接的方法,即复制多张表,利用序列顺序,得出where中的条件
自连接
采用where和join…on…都可以实现自连接,相对而言,join的效率会更高
group by 和 having结合
- 优先级:where>group by>having>order by
- where和having的区别:where在分组前过滤数据,且where中不能含有聚合函数;having在分组后过滤数据,且条件中经常包含聚合数据
- 一般情况下,group by 必须要和聚合函数结合使用
经典问题:找重复出现n次的数据
select 列名
from 表
group by 列名
having count(列名) > n;
where…in…
where 条件 in 表名:在另外一个表中寻找条件,此时条件不能少于一个
多表联接
其中上图黑色框里的sql解决的问题是:不在表里的数据,也就是在表A里的数据,但是不在表B里的数据。
注意:在sql中,null不能用等于号来判断,而是用is判断
作者:猴子
链接:https://leetcode-cn.com/problems/customers-who-never-order/solution/tu-jie-sqlmian-shi-ti-cha-zhao-bu-zai-biao-li-de-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
取第几个数据问题
针对这种问题,可以采用limit … offset方法,跳过多少行,取多少行数据
ifnull()函数
ifnull函数是一种判断空值的函数:ifnull(a, b)
即如果不为空则执行a,如果为空则执行b,一般使用此函数时,会用一个查找的sql语句替换a,用null替换b
例题:查找成绩第二的学生,如果存在则返回该成绩,如果不存在,那么查询应返回 null。
删除表内容
删除一般在实际中用处不大,如果想删除某些东西,使用delete from 表名 where 条件
即可
日期类型
如果在题中遇到‘日期’这类的数据,它的数据类型为日期类型
为大家介绍两个时间计算的函数:
datediff(日期1, 日期2):
得到的结果是日期1与日期2相差的天数。
如果日期1比日期2大,结果为正;如果日期1比日期2小,结果为负。要使用记录日期即datediff(w1.RecoredDate,w2.RecoredDate)
另一个关于时间计算的函数是:
timestampdiff(时间类型, 日期1, 日期2)
这个函数和上面diffdate的正、负号规则刚好相反。
日期1大于日期2,结果为负,日期1小于日期2,结果为正。
在“时间类型”的参数位置,通过添加**“day”, “hour”, “second”**等关键词,来规定计算天数差、小时数差、还是分钟数差。
作者:houzidata
链接:https://leetcode-cn.com/problems/rising-temperature/solution/tu-jie-sqlmian-shi-ti-ru-he-bi-jiao-ri-qi-shu-ju-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:houzidata
链接:https://leetcode-cn.com/problems/rising-temperature/solution/tu-jie-sqlmian-shi-ti-ru-he-bi-jiao-ri-qi-shu-ju-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。