MySQL:函数

在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数。

在MySQL中,函数非常多,主要可以分为以下几类:

  • 聚合函数
  • 数学函数
  • 字符串函数
  • 日期函数
  • 控制流函数
  • 窗口函数

聚合函数

  • 在MySQL中,聚合函数主要由:countsumminmaxavggroup_concat()等。
  • group_concat() 函数可以实现行的合并,group_concat()函数首先根据group by指定的列进行分组,并且用分隔符分隔,将同一个分组中的值连接起来,返回一个字符串结果。

格式:

group_concat([distinct] 字段名 [order by 排序字段 asc/desc] [separator '分隔符']);

说明:

  1. 使用distinct可以排除重复值;
  2. 如果需要对结果中的值进行排序,可以使用order by子句;
  3. separator是一个字符串值,默认为逗号.

示例:

create database mydb4;
use mydb4;
create table emp(emp_id int primary key auto_increment comment '编号',emp_name char(20) not null default '' comment '姓名',salary decimal(10,2) not null default 0 comment '工资',department char(20) not null default '' comment '部门'
);insert into emp(emp_name,salary,department) 
values('张晶晶',5000,'财务部'),('王飞飞',5800,'财务部'),('赵刚',6200,'财务部'),('刘小贝',5700,'人事部'),('王大鹏',6700,'人事部'),('张小斐',5200,'人事部'),('刘云云',7500,'销售部'),('刘云鹏',7200,'销售部'),('刘云鹏',7800,'销售部');-- 将所有员工的名字合并成一行 
select group_concat(emp_name) from emp;-- 指定分隔符合并 
select department, group_concat(emp_name separator ';' ) from emp group by department; -- 指定排序方式和分隔符 
select department, group_concat(emp_name order by salary desc separator ';' ) from emp group by department;

数学函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

字符串函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

日期函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

控制流函数

在这里插入图片描述
在这里插入图片描述

case when语句:

use mydb4; 
-- 创建订单表
create table orders(oid int primary key, -- 订单idprice double, -- 订单价格payType int -- 支付类型(1:微信支付 2:支付宝支付 3:银行卡支付 4:其他)
);insert into orders values(1,1200,1);
insert into orders values(2,1000,2);
insert into orders values(3,200,3);
insert into orders values(4,3000,1);
insert into orders values(5,1500,2);-- 方式1
select 
*  ,
case when payType=1 then '微信支付' when payType=2 then '支付宝支付' when payType=3 then '银行卡支付' else '其他支付方式' 
end  as payTypeStr
from orders;
-- 方式2
select 
*  ,
case payTypewhen 1 then '微信支付' when 2 then '支付宝支付' when 3 then '银行卡支付' else '其他支付方式' 
end  as payTypeStr
from orders;

窗口函数

介绍:

  • MySQL 8.0 新增窗口函数,窗口函数又被称为开窗函数,与Oracle 窗口函数类似,属于MySQL的一大特点.
  • 非聚合窗口函数是相对于聚函数来说的。聚合函数是对一组数据计算后返回单个值(即分组),非聚合函数一次只会处理一行数据。窗口聚合函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数。

区别如图:
在这里插入图片描述

语法结构:

window_function ( expr ) OVER ( PARTITION BY ... ORDER BY ... frame_clause 
)

其中,window_function 是窗口函数的名称;expr 是参数,有些函数不需要参数;OVER子句包含三个选项:

  • 分区(PARTITION BY)

    • PARTITION BY选项用于将数据行拆分成多个分区(组),它的作用类似于GROUP BY分组。如果省略了 PARTITION BY,所有的数据作为一个组进行计算.
  • 排序(ORDER BY)

    • OVER 子句中的ORDER BY选项用于指定分区内的排序方式,与 ORDER BY 子句的作用类似.
  • 以及窗口大小(frame_clause)。

    • frame_clause选项用于在当前分区内指定一个计算窗口,也就是一个与当前行相关的数据子集。
序号函数

序号函数有三个:ROW_NUMBER()RANK()DENSE_RANK(),可以用来实现分组排序,并添加序号。

-- 格式
row_number()|rank()|dense_rank() over ( partition by ... order by ... 
) -- 操作
use mydb4; 
create table employee( dname varchar(20), -- 部门名 eid varchar(20), ename varchar(20), hiredate date, -- 入职日期 salary double -- 薪资
); insert into employee values('研发部','1001','刘备','2021-11-01',3000);
insert into employee values('研发部','1002','关羽','2021-11-02',5000);
insert into employee values('研发部','1003','张飞','2021-11-03',7000);
insert into employee values('研发部','1004','赵云','2021-11-04',7000);
insert into employee values('研发部','1005','马超','2021-11-05',4000);
insert into employee values('研发部','1006','黄忠','2021-11-06',4000);insert into employee values('销售部','1007','曹操','2021-11-01',2000);
insert into employee values('销售部','1008','许褚','2021-11-02',3000);
insert into employee values('销售部','1009','典韦','2021-11-03',5000);
insert into employee values('销售部','1010','张辽','2021-11-04',6000);
insert into employee values('销售部','1011','徐晃','2021-11-05',9000);
insert into employee values('销售部','1012','曹洪','2021-11-06',6000);-- 对每个部门的员工按照薪资排序,并给出排名
select 
dname,
ename,
salary,
row_number() over(partition by dname order by salary desc) as rn 
from employee;-- 对每个部门的员工按照薪资排序,并给出排名 rank
select 
dname,
ename,
salary,
rank() over(partition by dname order by salary desc) as rn 
from employee;-- 对每个部门的员工按照薪资排序,并给出排名 dense-rank
select 
dname,
ename,
salary,
dense_rank() over(partition by dname order by salary desc) as rn 
from employee;--求出每个部门薪资排在前三名的员工- 分组求TOPN
select 
* 
from 
(select dname,ename,salary,dense_rank() over(partition by dname order by salary desc)  as rnfrom employee
)t
where t.rn <= 3-- 对所有员工进行全局排序(不分组)
-- 不加partition by表示全局排序
select dname,ename,salary,dense_rank() over( order by salary desc)  as rn
from employee;
开窗聚合函数-SUM、AVG、MIN、MAX

在窗口中每条记录动态地应用聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT()),可以动态计算在指定的窗口内的各种聚合函数值。

操作:

select  dname,ename,salary,sum(salary) over(partition by dname order by hiredate) as pv1 
from employee;-- 如果没有order by排序语句,默认把分组内的所有数据进行sum操作
select cookieid,createtime,pv,sum(pv) over(partition by cookieid) as pv3
from itcast_t1;  select  dname,ename,salary,sum(salary) over(partition by dname order by hiredate  rows between unbounded preceding and current row) as c1 
from employee;select  dname,ename,salary,sum(salary) over(partition by dname order by hiredate   rows between 3 preceding and current row) as c1 
from employee;select  dname,ename,salary,sum(salary) over(partition by dname order by hiredate   rows between 3 preceding and 1 following) as c1 
from employee;select  dname,ename,salary,sum(salary) over(partition by dname order by hiredate   rows between current row and unbounded following) as c1 
from employee;
分布函数 - CUME_DIST和PERCENT_RANK

CUME_DIST

  • 用途:分组内小于、等于当前rank值的行数 / 分组内总行数
  • 应用场景:查询小于等于当前薪资salary的比例

操作:

select  dname,ename,salary,cume_dist() over(order by salary) as rn1, -- 没有partition语句 所有的数据位于一组cume_dist() over(partition by dept order by salary) as rn2 
from employee;

PERCENT_RANK:

  • 用途:每行按照公式(rank-1) / (rows-1)进行计算。其中,rankRANK()函数产生的序号,rows为当前窗口的记录总行数.
  • 应用场景:不常用

操作:

select dname,ename,salary,rank() over(partition by dname order by salary desc ) as rn,percent_rank() over(partition by dname order by salary desc ) as rn2
from employee;
前后函数-LAG、LEAD
  • 用途:返回位于当前行的前n行(LAG(expr,n))或后n行(LEAD(expr,n))的expr的值
  • 应用场景:查询前1名同学的成绩和当前同学成绩的差值

操作:

-- lag的用法
select dname,ename,hiredate,salary,lag(hiredate,1,'2000-01-01') over(partition by dname order by hiredate) as last_1_time,lag(hiredate,2) over(partition by dname order by hiredate) as last_2_time 
from employee;-- lead的用法
select dname,ename,hiredate,salary,lead(hiredate,1,'2000-01-01') over(partition by dname order by hiredate) as last_1_time,lead(hiredate,2) over(partition by dname order by hiredate) as last_2_time 
from employee;
头尾函数 - FIRST_VALUE、LAST_VALUE
  • 用途:返回第一个(FIRST_VALUE(expr))或最后一个(LAST_VALUE(expr))expr的值
  • 应用场景:截止到当前,按照日期排序查询第1个入职和最后1个入职员工的薪资

操作:

-- 注意, 如果不指定ORDER BY,则排序混乱,会出现错误的结果
selectdname,ename,hiredate,salary,first_value(salary) over(partition by dname order by hiredate) as first,last_value(salary) over(partition by dname order by  hiredate) as last 
from  employee;
其他函数 - NTH_VALUE(expr, n)、NTILE(n)

NTH_VALUE(expr, n):

  • 用途:返回窗口中第n个expr的值。expr可以是表达式,也可以是列名

  • 应用场景:截止到当前薪资,显示每个员工的薪资中排名第2或者第3的薪资

操作:

-- 查询每个部门截止目前薪资排在第二和第三的员工信息
select dname,ename,hiredate,salary,nth_value(salary,2) over(partition by dname order by hiredate) as second_score,nth_value(salary,3) over(partition by dname order by hiredate) as third_score
from employee;

NTILE:

  • 用途:将分区中的有序数据分为n个等级,记录等级数

  • 应用场景:将每个部门员工按照入职日期分成3组

操作:

-- 根据入职日期将每个部门的员工分成3组
select dname,ename,hiredate,salary,
ntile(3) over(partition by dname order by  hiredate) as rn 
from employee;-- 取出每个部门的第一组员工
select
*
from
(SELECT dname,ename,hiredate,salary,NTILE(3) OVER(PARTITION BY dname ORDER BY  hiredate) AS rn FROM employee
)t
where t.rn = 1;

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

同为科技(TOWE)柔性定制化PDU插座

随着科技的进步&#xff0c;越来越多的精密电子设备&#xff0c;成为工作生活密不可分的工具。 电子电气设备的用电环境也变得更为复杂&#xff0c;所以安全稳定的供电是电子电气设备的生命线。 插座插排作为电子电气设备最后十米范围内供配电最终核心部分&#xff0c;便捷、安…

javaweb-Day06~08

1.mysql数据库 单行注释的–注释后面要加空格才能真正实现注释&#xff0c;即“-- ” &#xff08;1&#xff09;所有的关系型数据库都是基于SQL语句的 2.DDL 3.数据库设计 4. DML 5.DQL &#xff08;1&#xff09;总 6.多表设计 &#xff08;1&#xff09;一对多 &#x…

基于遗传优化SVM的电机参数预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 数据收集与预处理 4.2模型构建与训练 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 输入&#xff1a;电机结构参数x1 x2 x3 x4 x5(分别是铁心高度 铁心厚度 绕组…

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件&#xff0c;专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl&#xff0c;可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…

PythonQt练习

下面是一个简单登录界面的搭建 import sys# 从PySide6中导入必要的模块&#xff0c;用于创建GUI界面 from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit from QtCore import Qt# 导入Qt Designer生成的UI文件 from TAJ import Ui_Form from secon…

【Windows系统下打造高效智能聊天平台LobeChat解锁远程协作新体验】

文章目录 前言1. LobeChat功能介绍2. 本地安装LobeChat3. 如何使用LobeChat工具4. 安装Cpolar内网穿透5. 实现公网访问LobeChat6. 固定LobeChat公网地址 前言 在这个数字化飞速发展的时代&#xff0c;人工智能已经深深地融入了我们的生活。从智能家居到自动驾驶&#xff0c;再…

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器&#xff08;模块化编写&#xff09; 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…

Linux 文本处理三剑客基本用法

Linux文本处理三剑客 - grep sed awk 1. 基本用法 grep 是一种强大的文本搜索工具&#xff0c;用于在文件中搜索指定的模式&#xff08;通常是字符串或正则表达式&#xff09;&#xff0c;并输出匹配的行。以下是 grep 的一些基本用法&#xff1a; 基本语法 grep [选项] 模式…

美畅物联丨智能监控,高效运维:视频汇聚平台在储能领域的实践探索

在当今全球能源格局不断变化的大背景下&#xff0c;对清洁能源的需求正以惊人的速度增长。储能项目作为平衡能源供需、提升能源利用效率的关键环节&#xff0c;其规模和复杂度也在不断攀升。在储能项目的运营管理过程中&#xff0c;安全监控、设备运维以及数据管理等方面面临着…

记一次跑前端老项目的问题

记一次跑前端老项目的问题 一、前言二、过程1、下载依赖2、启动项目3、打包 一、前言 在一次跑前端老项目的时候&#xff0c;遇到了一些坑&#xff0c;这里记录一下。 二、过程 1、下载依赖 使用 npm install下载很久&#xff0c;然后给我报了个错 core-js2.6.12: core-js…

【AI系统】推理引擎架构

推理引擎架构 在深入探讨推理引擎的架构之前&#xff0c;让我们先来概述一下推理引擎的基本概念。推理引擎作为 AI 系统中的关键组件&#xff0c;负责将训练好的模型部署到实际应用中&#xff0c;执行推理任务&#xff0c;从而实现智能决策和自动化处理。随着 AI 技术的快速发…

opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警

安装python&#xff0c;pycharm&#xff0c;自行安装。 Python下安装OpenCv 2.1 打开cmd,先安装opencv-python pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 再安装opencv-contrib-python pip install opencv-contrib-python --user …

微信小程序购物车全选反选功能以及合计

微信小程序基于Vant Weapp的购物车功能实现 1、单选 使用微信小程序原生表单组件checkbox和checkbox-group 注意&#xff1a;checkbox原生不支持bind:change事件&#xff0c;checkbox-group支持 <checkbox-group bindchange"handleCheck"><checkbox val…

Linux输入设备应用编程

本章学习输入设备的应用编程&#xff0c;首先要知道什么是输入设备&#xff1f;输入设备其实就是能够产生输入事件的设备就称为输入设备&#xff0c;常见的输入设备包括鼠标、键盘、触摸屏、按钮等等&#xff0c;它们都能够产生输入事件&#xff0c;产生输入数据给计算机系统。…

Unity 利用Button 组件辅助Scroll View 滚动

实现 创建枚举类ScrollDir 以区分滚动方向。每组两个按钮负责同方向上左右/上下滚动。 Update 中实时获取Scroll View 滚动条当前位置。 if (dir.Equals(ScrollDir.vertical)) {posCurrent scroll.verticalNormalizedPosition; } else if (dir.Equals(ScrollDir.horizontal)…

Mac快速安装 chromedriver驱动

全篇大概1200字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间5分钟。 什么是chromedriver&#xff1f; ChromeDriver 充当了 Selenium WebDriver 和 Chrome 浏览器之间的桥梁&#xff0c;允许开发者通过编程控制浏览器进行自动化测试或操作。 一、下载chromedriver…

【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义

文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代&#xff0c;安全问题已成为技术领域不可忽视的…

快速上手 RabbitMQ:使用 Docker 轻松搭建消息队列系统

在现代的分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件、提高系统可扩展性和可靠性的重要工具。RabbitMQ 是一个广泛使用的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xf…

字符串函数和内存函数

字符串函数 1、strlcpy 【字符串拷贝】 &#xff08;将原字符串中的字符拷贝到目标字符数组中&#xff0c;包括终止符号\0&#xff0c;并在这里停止&#xff1b;为了避免越界&#xff0c;目标字符串数组应该足够大去接收&#xff09;&#x1f446; &#xff08;返回值是 dest…

【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方

文章目录 机器学习入门&#xff1a;从零开始学习基础与应用前言第一部分&#xff1a;什么是机器学习&#xff1f;1.1 机器学习的定义1.1.1 举个例子&#xff1a;垃圾邮件分类器 1.2 机器学习的核心思想1.2.1 数据驱动的模式提取1.2.2 为什么机器学习比传统方法更灵活&#xff1…