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

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

分析函数的点点滴滴

  • 1.什么是分析函数:
    • 1.1统计分析函数略解
    • 1.2.排序分析函数
    • 1.3 开窗函数 ROW 与 RANGE
    • 1.4 统计分析函数详解
    • 1.5 不使用order by时
    • 1.6 开窗函数与聚合函数
  • 2. 偏移分析函数 lag()与lead()用法
  • 3. mysql低版本怎么实现分组排序:row_number()为例
    • 3.1 原因:mysql8 版本才支持 over partition by 函数
    • 3.2 解决方法:

本篇文章依然是讲SQL的分析函数的知识点,在前面的两篇文章中已经讲解了分析函数是什么、统计分析函数和排序分析函数也进行了详细的讲解和代码演示、开窗函数,这篇文章,将重心放在开窗函数与聚合函数的联合使用,并讲解了偏移分析函数lag()lead()的用法和代码演示,在文章的末尾,对row_number()进行了扩展,因为MySQL5.7中是没有这个函数的,mysql8 版本才支持 over partition by 函数的,那么对于低版本的MySQL我们应该如何应对呢?那就快一起来学习这篇文章吧。
如果有不去的地方,大家可以评论区或者私信我,十分感谢

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)

在MySQL和Oracle中,还可以写成

select deptno,count(empno) cnt from emp group by deptno order by cnt
# 因为order by的执行顺序在select后

但是如果是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 子句中。但是在这种情况下,需要注意你的查询结果是否符合你的预期,因为这种方法可能会
导致某些行被排除在分组结果之外。

请添加图片描述

  • 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;

在这里插入图片描述

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)
  • 代码效果及重点标注如下图所示:
    在这里插入图片描述

  • lead() 的使用示例

select e.*,lead(sal,2,null) over() from emp e;
  • 代码效果及重点标注如下图所示:
    在这里插入图片描述
select e.*,lead(sal,1,null) over(partition by deptno) from emp e;
# 加了分区(分组),所以lead会在组内偏移
  • 代码效果及重点标注如下图所示:
    在这里插入图片描述
  • MySQL可以在原始数据上还用lag()lead(),Oracle需要在over()中加入内容,如partition byorder by
Oracle:select e.*,lead(sal,1,null) over(order by empno) from emp e;

在这里插入图片描述

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

在这里插入图片描述

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;
  • 表内容下图左半部分,代码运行解析下图右半部分
    在这里插入图片描述
    请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32404.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机中CPU、内存、缓存的关系

CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 内存&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 缓存&#xff08;Cache&#xff09; CPU、内存和缓存之间有着密切的关系&#xff0c;它们共同构成了计算机系统的核…

go-cqhttp签名服务sign-server的本地搭建

新版go-cqhttp新增签名服务器签名服务器相关问题 Issue #2242 Mrs4s/go-cqhttp GitHubhttps://github.com/Mrs4s/go-cqhttp/issues/2242 其在win10系统下本地化搭建的方式为&#xff1a; 1.解压缩qq安装包提取lib里面的libfekit.so、libQSec.so文件并存放至一个文件夹&…

nodejs高版本降为低版本的详细解决方案

部分老旧项目需要使用低版本的node,网上很多是无效的,高版本无法直接安装低版本node,但是低版本nodejs可以安装部分高版本node,从而达到升级效果,下面这篇文章主要给大家介绍了关于nodejs高版本降为低版本的详细解决方案,需要的朋友可以参考下 1.首先通过控制面板应用卸载当前环…

Spark 4/5

4. 启动Spark Shell编程 4.1 什么是Spark Shell spark shell是spark中的交互式命令行客户端&#xff0c;可以在spark shell中使用scala编写spark程序&#xff0c;启动后默认已经创建了SparkContext&#xff0c;别名为sc 4.2 启动Spark Shell Shell /opt/apps/spark-3.2.3-bi…

opencv检测二维码和条形码

文章目录 1 excel制作简单二维码2 识别二维码和条形码2.1 相关库2.2 decode解码2.3 圈出二维码的位置2.4 判断二维码是否授权 3 完整代码3.1 使用图片进行识别3.2 使用摄像头实时识别 4 总结 1 excel制作简单二维码 使用excel可以实现制作二维码&#xff0c;但只能实现做英文和…

Docker容器日志管理详解

1. 简介 Docker容器日志是指容器在运行过程中产生的各种日志信息&#xff0c;包括错误、警告、信息等。Docker将所有容器的日志统一管理&#xff0c;方便用户对容器进行监控、故障排查和性能分析。 1.1 什么是Docker容器日志 Docker容器日志是容器在运行过程中产生的各种日志…

ASEMI代理NXP高压三端双向可控硅BT139-800E综合指南

编辑-Z BT139-800E是一种高压三端双向可控硅开关&#xff0c;近年来由于其卓越的性能和多功能性而广受欢迎。这种强大的半导体器件广泛应用于各种应用&#xff0c;包括电机控制、照明控制和温度调节。 BT139-800E的特点 1.高压能力&#xff1a;BT139-800E设计用于处理高压&am…

[Leetcode] 0026. 删除有序数组中的重复项

26. 删除有序数组中的重复项 点击上方&#xff0c;跳转至Leetcode 题目描述 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语…

yum安装LNMP

目录 前言 一、yum安装要用在线yum源 二、安装Nginx 1、搭建Nginx环境 2、安装yum 3、查看Nginx是否安装成功 4、设置开机自启 三、安装MySQL 1、除系统中所有以"mariadb"开头的软件包 2、安装MySQL 3、设置开机自启 4、查看MySQL初始密码 5、修改MySQL密码…

C#和LABVIEW的对决:哪种上位机编程语言更适合你?

今天&#xff0c;我们将谈论主流的上位机编程语言。你听说过C#和LABVIEW吗&#xff1f;它们是的上位机编程语言&#xff0c;C#作为自动化主流编程语言特别受欢迎&#xff0c;LABVIEW用于自动化测试&#xff0c; 首先&#xff0c;我们来了解C#语言。C#是一种文本语言&#xff0c…

Docker教程

Docker 能解决的问题 ⾸先&#xff0c;我们先来看⼏个问题&#xff1a; 1. 合作开发的时候&#xff0c;在本机可以运⾏&#xff0c;在别⼈的电脑上跑不起来。 这⾥我们以 Java Web 应⽤程序为例&#xff0c;⼀个 Java Web 应⽤程序涉及很多东⻄&#xff0c;⽐如 JDK 、 Tomc…

基于ChatGPT的端到端语音聊天机器人项目实战(三)

企业级ChatGPT开发入门实战 第1课 基于ChatGPT的端到端语音聊天机器人项目实战 Gavin老师:NLP_Matrix_Space 1.4 使用FastAPI构建语音聊天机器人后端实战 在后端代码(backend)中调用了OpenAI API及其他的服务,如图1-10所示。 图1- 10 后端代码调用OpenAI API openai_requ…

Spring Boot 日志的主要组件及其特点

Spring Boot 日志的主要组件及其特点 在开发应用程序时&#xff0c;日志是非常重要的一部分。它可以帮助我们了解应用程序的运行情况&#xff0c;发现并解决问题。在 Spring Boot 中&#xff0c;有许多不同的日志框架可供选择。本文将介绍 Spring Boot 日志的主要组件及其特点…

【MySQL高级篇笔记-索引优化与查询优化(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、索引失效案例 二、关联查询优化 1、采用左外连接 2、采用内连接 3、join语句原理 1.驱动表和被驱动表 2.Simple Nested-Loop Join(简单嵌套循环连接) 3.Index Nested-Loop Join(索引嵌套循环连接) 4.Block Nested-Loop J…

CSS面经

1、CSS的BFC 一、何为BFC BFC&#xff08;Block Formatting Context&#xff09;格式化上下文&#xff0c;是Web页面中盒模型布局的CSS渲染模式&#xff0c;指一个独立的渲染区域或者说是一个隔离的独立容器。 二、形成BFC的条件 1、浮动元素&#xff0c;float 除 none 以外的值…

WebRTC音视频会议底层支撑技术

WebRTC允许应用使用P2P通信。WebRTC是一个广泛的话题&#xff0c;在本文中&#xff0c;我们将重点讨以下问题。 为什么Web RTC 如此受欢迎&#xff1f; 在P2P连接过程中会发生什么 信号传递 NATs和ICE STUN & TURN服务器 VP9视频编解码器 WebRTC APIs 安全 1.为什…

物联网到底如何实现万物互联?

前言&#xff1a;作为计算机相关专业的你&#xff0c;绝对听说过物联网这个词&#xff0c;它的解释相比你也听过&#xff0c;叫万物互联&#xff0c;也就是所谓的IOT&#xff0c;但是说实话它到底如何实现的万物互联的你可能还真不知道。不是每个物体都有一个网络接口或者实体接…

C++primer(第五版)第三章(字符串、向量和数组)

本章主要介绍了字符串和vector以及数组&#xff0c;但是vector和数组差不多甚至比数组更加强大&#xff0c;完全可以用vector来代替数组&#xff0c;所以尽管书中有介绍数组&#xff0c;但我也不过多记录&#xff0c;有兴趣的小伙伴可以自行查看原书。 3.1命名空间的using声明…

FreeRTOS_列表和列表项

目录 1. 什么是列表和列表项&#xff1f; 1.1 列表 1.2 列表项 1.3 迷你列表项 2. 列表和列表项初始化 2.1 列表初始化 2.2 列表项初始化 3. 列表项插入 3.1 列表项插入函数分析 3.2 列表项插入过程图示 3.2.1 插入值为 40 的列表项 3.2.2 插入值为 60 的列表项 3…

【二】构造函数和原型

ES6&#xff08;ECMAScript 6.0&#xff09;之前js没有引入类的概念 在ES6之前&#xff0c;对象不是基于类创建的&#xff0c;而是用一种称为构建函数的特殊函数来定义对象和它们的特征 ES6之前创建对象可以通过以下三种方式创建对象&#xff1a; 对象字面量&#xff1a; v…