【SQL应知应会】分析函数的点点滴滴(三)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【SQL应知应会】分析函数的点点滴滴(三)

1.什么是分析函数:

👉:传送门💖分析函数💖


1.1统计分析函数略解

👉:传送门💖统计分析函数💖


1.2.排序分析函数

👉:传送门💖排序分析函数💖


1.3 开窗函数 ROW 与 RANGE

👉:传送门💖开窗函数 ROW 与 RANGE💖


1.4 统计分析函数详解

👉:传送门💖统计分析函数💖


1.5 不使用order by时

👉:传送门💖不使用order by时💖


1.6 开窗函数与聚合函数

先进行聚合函数,再进行开窗函数


select deptno,

   sum(count(empno)) over(order by count(empno)

      rows between unbounded preceding and current row)

from emp t group by deptno;

1.会先进行聚合函数

select deptno,count(empno) from emp group by deptno order by count(empno)

1

在MySQL和Oracle中,还可以写成


select deptno,count(empno) cnt from emp group by deptno order by cnt

# 因为order by的执行顺序在select后

1

2

但是如果是having,则在Oracle中是不可以的


# MySQL:可以

select deptno,count(empno) cnt from emp group by deptno having cnt > 1; -- select先执行,having后执行

# Oracle:不可以

select deptno,count(empno) cnt from emp group by deptno having cnt > 1; -- having先执行,select后执行


# Oracle:可以

select deptno,count(empno) cnt from emp group by deptno having count(empno) > 1; -- oracle的having后面只能跟函数

# ChatGPT:

在 Oracle 中,HAVING 用于对 GROUP BY 结果进行筛选过滤,只有满足筛选条件的组才被返回。

通常情况下,HAVING 后面都是需要对分组后的结果进行聚合统计的函数,例如 SUM()、COUNT()、MAX()、

MIN()、AVG() 等函数,因为这些函数能够对每个分组内的数据进行计算,并返回分组后的统计结果。但是,

HAVING 后面也可以跟普通的表达式和逻辑运算符组成的条件,这时需要将这些条件中所涉及的列都包含在

GROUP BY 子句中。但是在这种情况下,需要注意你的查询结果是否符合你的预期,因为这种方法可能会

导致某些行被排除在分组结果之外。



微信图片_20230701101113.png

2.再进行开窗函数

下图中的结果就是在上图中的结果的基础上进行计算,3,3+6=9,9+6=15

# 开窗函数里面的内容,需要在聚合函数得到的结果的基础上进行

# 如聚合函数中只有deptno和count(empno)

select deptno,

   sum(count(empno)) over(order by count(empno)

      rows between unbounded preceding and current row)

from emp t group by deptno;


微信图片_20230701101101.png

2. 偏移分析函数 lag()与lead()用法

lag()与lead()函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的**前N行的数据(lag)和后N行的数据(lead)**作为独立的列,从而更方便地进行进行数据过滤。


over()表示 lag()与lead()操作的数据都在over()的范围内,他里面可以使用partition by 语句(用于分组) order by 语句(用于排序)


lead(field, num, defaultvalue) :field需要查找的字段,num往后查找的num行的数据,defaultvalue没有符合条件的默认值


lag() 的使用示例

select e.*,lag(sal) over() from emp e;

# 由下图,显然lag(sal)中有缺省值,为lag(sal,1,null)

1

2

代码效果及重点标注如下图所示:

微信图片_20230701101045.png


lead() 的使用示例


select e.*,lead(sal,2,null) over() from emp e;

1

代码效果及重点标注如下图所示:

微信图片_20230701101032.png

select e.*,lead(sal,1,null) over(partition by deptno) from emp e;

# 加了分区(分组),所以lead会在组内偏移

1

2

代码效果及重点标注如下图所示:

微信图片_20230701101021.png

MySQL可以在原始数据上还用lag()和lead(),Oracle需要在over()中加入内容,如partition by、order by

Oracle:select e.*,lead(sal,1,null) over(order by empno) from emp e;

1


微信图片_20230701101010.png

Oracle:select e.*,lead(sal,1,null) over(partition by job order by sal) from emp e;

1

微信图片_20230701100957.png

3. mysql低版本怎么实现分组排序:row_number()为例

3.1 原因:mysql8 版本才支持 over partition by 函数

3.2 解决方法:

set @rownum = 0;   -- @rownum自增参数,初始化参数为0

set @cid = '';     -- 初始化动态参数cid为空

select 'sid','cid',score

 from(

     select 'sid',  

        'cid',

         score,

       case when @cid = 'cid' then @rownum := @rownum + 1

          else @rownum := 1  -- 因为@cid初始化为空,所以第一次循环,@cid ≠ 'cid',所以不执行then,执行else子句

          end rn,

          @cid := 'cid', -- 第一轮循环时将cid的值赋给@cid

     from sc

     order by 'cid',score desc -- cid默认升序,score通过desc降序

     ) a

where rn <= 2;

表内容下图左半部分,代码运行解析下图右半部分

微信图片_20230701100941.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
SQL 存储 数据可视化
手机短信SQL分析技巧与方法
在手机短信应用中,SQL分析扮演着至关重要的角色
|
1天前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
2天前
|
SQL 数据库 索引
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
|
2天前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
1月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
2月前
|
SQL 数据处理 数据库
|
2月前
|
前端开发 Java JSON
Struts 2携手AngularJS与React:探索企业级后端与现代前端框架的完美融合之道
【8月更文挑战第31天】随着Web应用复杂性的提升,前端技术日新月异。AngularJS和React作为主流前端框架,凭借强大的数据绑定和组件化能力,显著提升了开发动态及交互式Web应用的效率。同时,Struts 2 以其出色的性能和丰富的功能,成为众多Java开发者构建企业级应用的首选后端框架。本文探讨了如何将 Struts 2 与 AngularJS 和 React 整合,以充分发挥前后端各自优势,构建更强大、灵活的 Web 应用。
42 0
|
2月前
|
SQL Oracle 关系型数据库
SQL 中的大小写处理函数详解
【8月更文挑战第31天】
75 0
|
2月前
|
SQL 数据采集 数据挖掘
为什么要使用 SQL 函数?详尽分析
【8月更文挑战第31天】
30 0
|
2月前
|
SQL 存储 关系型数据库
COALESCE 函数:SQL中的空值处理利器
【8月更文挑战第31天】
180 0