数据库--解题知识点细节

limit…offset

  1. limit…offset后面字段只接受正整数(即0、负数、小数都不行)或者单一变量(意味着不能用表达式),也就是说想取一条,limit 2-1、limit 1.1这类的写法都是错误的。
  2. limit x,y 等同于 limit x offset y ,即跳过y行,取x行数据

窗口函数

  1. 窗口函数语法
<窗口函数> 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 列名
fromgroup 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值