sql over函数_SQL 高级函数

今天是高端局,都是超级高大上的内容,惯例上目录

fe9036f74d5eab19cb56ca8ef67f3571.png
今天觉得红黑配色好好看呀

今天没有什么具体的栗子合集,大家的应用场景都很不一样,so,到具体知识点,我们再具体举栗子。

窗口函数

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

基础语法

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

关于这个语法点,下文会有详细的介绍

窗口函数分类

窗口函数总共分两类,一类是专用窗口函数,另一类是聚合函数

专用窗口函数

专用窗口函数大致又三个,rank(),, dense_rank(), row_number()三个,我们来一个一个看。

首先来看rank(),认真讲,这个大家应该很熟悉,作为窗口函数的用法,其实就是把rank()直接套进基础语法里面就可以了。

举个具体例子

54c287f92f7e082dc73dc728c549c3a7.png
班级表

我们要再每个班级内进行排名。

我们先来看看code怎么写

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

我们再来看看这个code里面的语法点。

先说不认识的,之前没见过的partition by,这个的作用跟group by差不多,就是对数据进行分组,我们的栗子里,就是对数据按照班级列进行分组。那partition by和group by有什么区别呢?我们为什么要学习两个功能相同的函数呢?

这是因为,group by汇总分组后,改变了表原有的行数,一行只有一个类别。而partition by和rank 函数,则不会改变原表的行数。

b5b0743666551441b1f25d0ad9112126.png

a872598230f5cf1ef3e6516bb96210f0.png

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_numfrom 班级表;

d6656c548a626f0f3992d323d89066b9.png

橘色框框的地方,其实就是重点显示它们三者不同之处的地方。说完了专用窗口函数,我们再来说说聚合窗口函数

聚合窗口函数

我们常说的聚合函数,其实就是,sum(), avg(),count(),min(),max()这些,这波又是一个code帮你搞定聚合窗口函数系列

select *,        sum(成绩) over (order by 学号) as current_sum,avg(成绩) over (order by 学号) as current_avg,       
count(成绩) over (order by 学号) as current_count,       
max(成绩) over (order by 学号) as current_max,       
min(成绩) over (order by 学号) as current_min  from 班级表;

输出结果

8d461e8658e2609fb6ea0e5dc24a8c51.png

如果想要知道所有人成绩的总和、平均等聚合结果,看最后一行即可。

这样使用窗口函数有什么用呢?聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。

avg()作为窗口函数时,如果我们想对返回数据做出限制的时候,一般情况下,我们会想到使用where语句。例如,我们要返回,比平均成绩高的学生。

select *,                
avg(成绩) over (partition by 科目) as avg_score from 成绩表 where 成绩 › avg_score;

但是这么写,SQL会出现错误,为什么呢?

记得我们之前重复了无数次的,SQL运行顺序嘛?再来复习一次。

a98f9fc585fdb5817e551196286c415b.png

在我们,运行到,where语句的时候,我们在select里面求的平均值,根本都还没有运行,所以这个where条件没有办法执行。

解决方法:子查询

select * from 
(select *, avg(成绩) over (partition by 科目) as avg_score from 成绩表) as b 
where 成绩 › avg_score;

窗口函数的移动平均

select *, avg(成绩) over (order by 学号 rows 2 preceding) as current_avg from 班级表;

出现了新的关键词!!!rows 2 preceding,欢迎大家来到英语翻译训练营,在这里rows 2 preceding 是说,之前两行。用在这里就是表明,结果就是自身记录及其前两行记录的平均。

注意事项

  • 在上述的这三个专用窗口函数中,函数后面的括号不需要任何参数,保持()空着就可以,但是()不可省略。
  • 窗口函数原则上只能写在select子句中。
  • partition子句可是省略,就仅是按照成绩进行排序。
  • 窗口函数,不减少原表的行数,所以经常用来在每组内排名。但是group by会减少原表行数(例如,同一组内两个最高分均为80,我们如果用group by就会只筛选出来一个。)

窗口函数使用场景

  1. 组内Top N 排名问题
  2. 累计求和
  3. 组内比较问题(eg.查找组内大于平均值数据)

SQL存储过程

概念: 这个存储过程,本质上就是记录记录和呼叫重复行为的语句。

分类 : 无参数存储过程,有参数存储过程以及默认参数存储过程

无参数存储过程

定义过程

create procedure 存储过程名称() begin ‹sql语句› ; end;

呼叫过程

call 存储过程名称();

有参数存储过程

定义过程

create procedure 存储过程名称(参数1,参数2,...) begin ‹sql语句› ; end;

呼叫过程同上。

这个举个栗子,

比如,我要找到,学号为0001的学生姓名,这个过程,我不能直接定义学号0001叭,那万一,我下次要找学号为0002的学生呢?如果只能用一次,这个存储过程不久没意义了嘛!所以这个定义过程,应该是

create procedure getNum(num varchar(100)) 
begin  select 姓名  from 学生表 where 学号=num; end;

getNum后面定义值和值的类型。

然后,呼叫函数的时候,可以直接写成

call getNum(0001);

就可以找到学号为0001的学生的姓名啦。

默认参数的储存过程

最后我们来说说,默认参数存储过程。

依然还是分三种,IN, OUT, INOUT(我没有在跳健身操,真的。)

IN 输入参数:参数初始值在存储过程前被指定为默认值,在存储过程中修改该参数的值不能被返回

f1425944b13bff752c984fced7f7128a.png

总结下来就是,我不管你怎么改,但是我改不认同,就是不认,最开始是多少就是多少。

OUT输出参数:参数初始值为空,该值可在存储过程内部被改变,并可返回

620d4fc0d97a90d3966bf3b3c527ebae.png

该改还是得改的OUT。

INOUT输入输出参数:参数初始值在存储过程前被指定为默认值,并且可在存储过程中被改变和在调用完毕后可被返回

注意事项

  • 定义存储过程语法里的SQL语句代码块必须是完整的sql语句,必须用“;”结尾
  • 定义的储存过程的名字,不可重复,否则会引起系统报错
  • 存储过程和视图在实际应用中有什么区别
    • 视图只是一段固定的sql语句,方便重复查询;
    • 存储过程约等于编程,可以实现复杂的操作,例如传参、建表、写入、数据同步等过程。业务比较复杂、重复性工作比较多,存储过程会比较实用。
  • 把重复要做的事情整理成一步一步的业务步骤,然后把业务步骤写成sql语句,然后再把sql语句写到存储过程的语法里。就像自动驾驶一样,把可能遇到的状况提前规划好,就不需要自己操纵方向盘,车子就按照我们写的步骤向前开了。

优缺点:

优点: 执行速度非常非常快,效率很高

缺点: 很难迁移到别的数据库。

鉴于这个缺点,所以这个存储过程的知识点,做个了解就好啦!不是太常用~今天的分享就到这里啦!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】SVN各种颜色状态

黄色感叹号(有冲突): 这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人的…

实现二分归并排序算法_如何实现归并排序?

归并排序归并排序是分而治之的排序算法。划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序。递归写法归并排序递归写法的思想是&…

【手算】逆序数树形计算方法

计算过程: 给定一列数,从左向右,依次将每个数拿出来,作为一棵树的树根。从剩下的数中,找比此数小的数,作为子节点加入到树中。重复1、2,直到到达最后一个数停止。 数出二级节点,即…

【转】SVN冲突出现场景

如今是一个团结协作的时代,开发一个系统,往往会多人协作共同完成。版本管理是必不可少的,常用的软件有Git,SVN等。今天说一下,SVN管理版本时,如果出现冲突后,如何快速解决冲突。 首先说明一个问…

Qt Creator和Visual Studio双环境开发技能攻略

前言 刚接触Qt开发时,大多数同学的第一行Qt代码是在Qt Creator中写下的。 众所周知,Qt Creator是Qt官方提供的Qt集成开发环境1,提供了对Qt应用开发的全过程支持。也就是说,使用Qt Creator做Qt开发是完全够用的。不管是在Windows…

大疆无人机高程不准_大疆消费级无人机快速倾斜摄影测量实践

摘要:分别用 RTK两种测量模式测定像控点,用大疆消费级无人机 Phantom4PRO 开展倾斜摄影测量,最后进行成果检验。结果表明:RTK 电台模式(不做坐标校正,精度低)、RTK-CORS 网络模式测定像控点都能…

【转】CLR Profiler 性能分析工具 (转)

最近关注程序性能的优化方面,本想写篇CLRProfiler的简要文档,看到pengpeng已写好,那就转载好了,偷偷懒。 .Net的尽管拥有非常强大调试器,但也有很多局限性,只限于CLR之上,无法得到CLR的具体细节…

魔百盒哪款型号配置高_松下负离子吹风机怎么样哪款好?推荐型号?2020年9月松下负离子电吹风选购攻略...

先说结论,方便时间不多的朋友,松下(panasonic)负离子吹风机怎么样哪款好?推荐型号?1、EH-ENE2-A405——松下(panasonic)负离子电吹风机推荐EH-ENE2-A405。带负离子功能,1…

【转】WebAPI ASP.Net 发布部署中常见的两个错误未能找到 CodeDom未能加载System.Web.WebPages.Razor

未能加载文件或程序集“System.Web.WebPages.Razor, Version3.0.0.0, Culturene 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft... 在包管理器中异常安装包MVC5 及 CodeDom,重新编译部署即可…

QSplitter设置宽高比例的正确方法

问题 实际开发中,需要经常调整QSplitter中子窗口的宽度/高度比例。对水平QSplitter来说,是宽度比例;对垂直QSplitter来说,是高度比例。下面以水平QSplitter为例说明。 我们首先应该会想起看看QSplitter是不是有设置比例的函数。…

我要回家软件_工具用的好,下班回家早,推荐几个堪称神器的高效率软件

工具用的好,下班回家早,别人已经早早下班,你还在哼哧哼哧的加班,有时候并不是你比别人慢,而是你没有找到提高工作效率的工具呀,我这次推荐几个堪称神器的高效率软件工具,也许能极大的提高你的工…

【转】带你玩转Visual Studio——01.开篇介绍

开篇之前,先唠叨几句 本人从事C开发工作一年半,总想就C开发方面写点东西。写什么呢?想了一下还是写点跟开发密切相关的吧,要说跟开发最密切相关的那莫过于就是开发工具了,也就是常常说的集成开发环境(IDE)。 这一年多…

丢失模式不联网有用吗_用眼过度,打开手机“护眼模式”真的有用吗?

现如今,人们越来越离不开手机,用手机办公或者用手机娱乐,因疫情在家学习的学生们,都需要通过手机来进行学习,深夜剁手的你是不是也躲在被子里,一遍又一遍地刷新着消息,入睡前的最后一件事是关掉…

【基础】Qt-VS调试器下载与配置

前言 因为MSVC版的Qt不自带调试器,所以在Windows上使用MSVC版的Qt进行开发时,需要配置调试器。 本文讲解了在Windows下,下载和配置MSVC版Qt调试器的过程,并给出下载地址。 调试器选择 下表列出了不同平台下的调试器选择方案&am…

【转】带你玩转Visual Studio——02.带你新建一个工程

接着上一篇文章带你玩转Visual Studio——开篇介绍继续讲这个主题&#xff0c;现在我们从创建一个新的工程开始。 一步一步创建项目 依次选择菜单&#xff1a;File\New\Project&#xff0c;打开New Project对话框。<1>.选择项目类型&#xff1a;Win32 Console Applicat…

【必知必会】pro文件及常用配置

前言 笔者在工作中了解到&#xff0c;有部分同学对Qt的项目文件&#xff0c;即.pro文件的基本配置编写不是很了解。作为一名Qt工程师&#xff0c;.pro文件的编写也是必会的技能&#xff0c;本文对此进行一个讲解&#xff0c;并将相关资料做一个汇总。 .pro文件的介绍 .pro文…

stm32烧录软件_stm32怎么烧录程序

STM32烧录程序目前笔者知道的有三种&#xff1a;JLink &#xff0c;Ulink和串口烧录&#xff0c;使用工具分别为&#xff1a;JLink&#xff0c;ULink以及USB转TTL线。ULink 烧录程序在安装MDK过程中&#xff0c;会有提示是否安装驱动&#xff0c;该驱动就为ULink驱动&#xff0…

【探究】信号槽到底能不能有返回值?

【探究】信号槽到底能不能有返回值&#xff1f; 前言 Qt信号槽到底可不可以有返回值呢&#xff1f;问了下身边的同事&#xff0c;有的人说可以&#xff0c;有的人说不可以。在实际项目中&#xff0c;确实没看到过有人使用带返回值的信号槽&#xff0c;可以说存在感很低。平时…

【转】第01课:生活中的监听模式——一坑爹的热水器

用程序来模拟生活从剧情中思考监听模式 监听模式监听模式的模型抽象 代码框架类图基于框架的实现模型说明 设计要点推模型和拉模型应用场景 【故事剧情】 刚刚大学毕业的 Tony 只身来到北京这个硕大的城市&#xff0c;开始了北漂的生活。但刚刚毕业的他身无绝技、包无分文&…

【经验】Qt项目开发必备工具

在实际的项目中&#xff0c;除了需要掌握Qt开发框架本身&#xff0c;还需要掌握一些开发工具。这些工具能起到事半功倍的效果&#xff0c;甚至某些工具是开发不可或缺的。下面笔者就介绍一些常用的开发工具的用法及下载地址&#xff0c;希望对缺少实际项目经验的同学提供一些参…