mysql常用的sql

在数据库中找到排序后第二行的数据:

select salary as secondhighsalary from emplyee order by salary desc limit 1 offset 1 ;

limit 用法查询:

;SELECT DISTINCT Salary
                FROM Employee
                ORDER BY Salary DESC
                LIMIT 开始行 (包含开始行,0代表第一行), 行数(需要多少条数据)

在数据库中查询第k大的记录的函数(无则返回为空):

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    DECLARE P INT DEFAULT N-1;
    IF (P<0) THEN
        RETURN NULL;
    ELSE 
    RETURN (
        SELECT IFNULL(
            (
               SELECT DISTINCT Salary
                FROM Employee
                ORDER BY Salary DESC
                LIMIT P, 1
            ), NULL
        ) AS SecondHighestSalary   
    );
    END IF;
END

涉及到排名问题,这里我们可以使用 窗口函数来实现,mysql8 中已经实现了这个功能;

举例: 在这里插入图片描述

已知的三种窗口函数:
  • rank()
  • dense_rank()
  • row_number()

看一下测试效果:


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 班级

在这里插入图片描述

根据举例我们这里应该看清楚了:

  • row_number : 完全按照行数排名,不会去管是否有成绩重复;
  • rank : 他也是按照行数排名,不过这里的重复的成绩的标号一样
  • dense_rank : 重复的成绩标号一样,下一个成绩会在此基础上加一;

窗口函数:

什么是窗口函数?

窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。

窗口函数的基本语法如下:

<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)

那么语法中的<窗口函数>都有哪些呢?

<窗口函数>的位置,可以放以下两种函数:

1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。

2) 聚合函数,如sum. avg, count, max, min等

举例
select *,
   rank() over (partition by 班级
                 order by 成绩 desc) as ranking
from 班级表

在这里插入图片描述
窗口函数博客链接

选择出logs表中num字段数值相等并且id连续的num值:

select l1.Num AS ConsecutiveNums from Logs l1,Logs l2,Logs l3 where l1=l2-1 and l2=l3-1 and l1.num=l2.num and l2.num =l3.num ;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值