1.MySQL的主要函数

1.1 聚合函数


group_concat()函数的使用

CREATE DATABASE bianbian4;
USE bianbian4;
CREATE TABLE emp (emp_id INT PRIMARY KEY auto_increment COMMENT '编号',emp_name VARCHAR ( 20 ) NOT NULL DEFAULT '' COMMENT '姓名',salary DECIMAL ( 10, 2 ) NOT NULL DEFAULT 0 COMMENT '工资',department VARCHAR ( 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 GROUP_CONCAT(emp_name SEPARATOR ';') FROM emp;
-- 指定排序方式和分隔符
SELECT department,GROUP_CONCAT(emp_name ORDER BY salary desc SEPARATOR ';') FROM emp GROUP BY department;

1.2 数学函数



-- 数学函数
SELECT abs(-10);
SELECT abs(10);
SELECT abs(表达式或者字段) FROM 表;
-- ceil 向上取证;
select ceil(1.1); -- 2
select ceil(1.0); -- 1
-- 向下取整
select floor(1.1); -- 1
select floor(1.9); -- 1
-- 取最大值
select greatest(1,2); -- 2
-- 最小值
select least(1,2,3); -- 1

1.3 字符串函数




1.4 日期函数







1.5 控制流函数

1.5.1 if逻辑判断语句

判断状态时,可以使用IF函数进行判断:

1.5.2 case when函数

case when 相当于 C语言的switch()语句

1.6 窗口函数


窗口函数分类:

窗口函数语法结构:

1.6.1 序号函数

序号函数:row_number()、rank()、dense_rank(),可以用来实现分组排序,并添加序号。

use bianbian4;
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),
('研发部','1002','关羽','2021-11-02',5000),
('研发部','1003','张飞','2021-11-03',7000),
('研发部','1004','赵云','2021-11-04',7000),
('研发部','1005','马超','2021-11-05',4000),
('研发部','1006','黄忠','2021-11-06',4000),('销售部','1001','曹操','2021-11-01',2000),
('销售部','1002','许褚','2021-11-02',3000),
('销售部','1003','典韦','2021-11-03',5000),
('销售部','1004','张辽','2021-11-04',6000),
('销售部','1005','徐晃','2021-11-05',9000),
('销售部','1006','曹洪','2021-11-06',6000);
-- 对每个部门的员工按照薪资排序,并给出排名
select dname,ename,salary,
row_number() over (partition by dname order by salary desc) as row_rank,
rank() over (partition by dname order by salary desc) as rk,
dense_rank() over (partition by dname order by salary desc) as dense_rk
from employee;-- 求出每个部门薪资排在前三的员工,-分组求topN
select *
from
(
select dname,ename,salary,
dense_rank() over (partition by dname order by salary desc) as dense_rk
from employee
) as t
where t.dense_rk<=3;
-- 对所有员工进行全局排序
select dname,ename,salary,
dense_rank() over (order by salary desc) as dense_rk
from employee

row_number():不考虑相不相同,顺序的数字不变,1,2,3
rank():考虑相同的情况,跳数字
dense_rank():考虑相同情况, 不跳数字
如下图:

1.6.2 开窗聚合函数

-- 按照分组日期累加
select dname,ename,hiredate,salary, sum(salary) over (partition by dname order by hiredate ) as c1
from employee

-- 如果没有order by 将分组内的数据全部相加
select dname,ename,hiredate,salary, sum(salary) over (partition by dname  ) as c1
from employee


实现区间统计,以sum为例子,数据是上面创建的数据:

-- 指定范围进行相加
-- 起始行: unbounded preceding 到当前的行 current row
select dname,ename,hiredate,salary, sum(salary) over (partition by dname order by hiredate rows between unbounded preceding and current row) as c1
from employee-- 当前行的上面三行
select dname,ename,hiredate,salary, sum(salary) over (partition by dname order by hiredate rows between 3 preceding and current row) as c1
from employee-- 向上三行+当前行+下面一行
select dname,ename,hiredate,salary, sum(salary) over (partition by dname order by hiredate rows between 3 preceding and 1 following) as c1
from employee-- 当前行到最后
select dname,ename,hiredate,salary, sum(salary) over (partition by dname order by hiredate rows between current row and unbounded following) as c1
from employee

1.6.3 分布函数

cume_dist()的介绍:
用途:分组内小于、等于当前rank值的行数/分组内总行数
应用场景:查询小于等于当前薪资的比列

cume_dist()的实例:

use bianbian4;
selectdname,ename,salary,cume_dist() over(order by salary) as rn1,cume_dist() over(partition by dname order by salary) as rn2
from employee;
/*
不加partition by 是全部行数:
rn1 表示整个工资比当前数小于等于的数所占比例
3/12 = 0.25   (3000)
5/12 = 0.4166666666666667  (4000)有partition by,看本组:
rn2表示含义案例:
1 / 6 = 0.16666666666666666   (3000,在研发组中)
*/

cume_dist()的结果:

percent_rank的介绍:

percent_rank代码:

selectdname,ename,salary,rank() over(partition by dname order by salary desc) as rn1,percent_rank() over(partition by dname order by salary desc) as rn2
from employee;
/*
rn2:
第一行:(1-1)/ (6-1) = 0
第二行:(1-1)/ (6-1) = 0
第三行:(3-1)/ (6-1) = 0.4
*/

percent_rank()结果:

1.6.4 前后函数 LAG和LEAD

selectdname,ename,salary,hiredate,-- 将上一行的,放在当前的后面,如果没有默认'2000-01-01'lag(hiredate,1,'2000-01-01') over(partition by dname order by hiredate ) as rn1,-- 将上两行的值,放在当前的后面,如果没有默认nulllag(hiredate,2) over(partition by dname order by hiredate ) as rn2
from employee;

1.6.5 头尾函数first_value和last_value


first_value()和last_value()案例:

selectdname,ename,salary,hiredate,-- 到目前为止的第一个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;

1.6.6 其他函数nth_value(expr,n)、ntile(n)


nth_value(expr,n)案例:

selectdname,ename,salary,hiredate,-- 到目前为止的排第1行的薪资nth_value(salary,1) over(partition by dname order by hiredate ) as first_salary,-- 到目前为止的排第2行的薪资nth_value(salary,2) over(partition by dname order by hiredate ) as second_salary
from employee;



ntile案例:

selectdname,ename,salary,hiredate,-- 分成3组ntile(3) over(partition by dname order by hiredate ) as nt
from employee;
-- 取出每一个部门第一组员工
select *
from
(
selectdname,ename,salary,hiredate,-- 分成3组ntile(3) over(partition by dname order by hiredate ) as nt
from employee
) t
where t.nt =1;

参考

https://www.bilibili.com/video/BV1iF411z7Pu?p=99&spm_id_from=pageDriver

MySQL的函数以及相关案例与练习相关推荐

  1. mysql日期函数使用案列_MySQL中curdate()函数的代码案例

    这篇文章主要介绍了MySQL curdate()函数的实例详解的相关资料,希望通过本文能帮助到大家理解应用MysqL curdate()的使用方法,需要的朋友可以参考下 MySQL CURDATE功能 ...

  2. mysql添加函数库_创建mysql函数

    如何使用MySQL提升权限 前不久网上公开了一个MySQL Func的漏洞,讲的是使用MySQL创建一个自定义的函数,然后通过这个函数来攻击服务器.最早看到相关的报道是在o-otik上,但是公布的是针 ...

  3. MySQL 自定义函数一文读懂

    MySQL函数 含义:一组预先编译好的SQL语句的集合,理解成批处理语句 1.提高代码的重用性 2.简化操作 3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率. 存储过程与函数区别: ...

  4. mysql 统计报表界面查询案例 经典sql语句

    要照着一个界面实现一个报表及其报表统计的查询功能. 界面如下: 而我,则要只通过一条sql语句,来完成所有字段的展示. 根据界面得知, 查询条件有4个,分别为商机名称,单位简称,开始时间,结束时间. ...

  5. mysql创建函数失败_MYSQL创建函数出错如何解决

    在使用MySQL数据库时,有时会遇到MySQL函数不能创建的情况.下面就教您一个解决MySQL函数不能创建问题的方法,供您借鉴参考.希望能帮助到大家. 案例一: 目前在项目中,执行创建mysql的函数 ...

  6. mysql 聚合函数内比较运算符_关于常用 MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结...

    /* 关于MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结,*/ -- 1 运算符优先级  /* 12.1.1. 操作符优先级 以下列表显示了操作符优先级的由低到高的顺序.排列在同一行的操作符 ...

  7. 数据库系列之mysql 自定义函数function,函数和存储过程的区别

    mysql 自定义函数function,函数和存储过程的区别 https://blog.csdn.net/u010365819/article/details/80470448 https://blo ...

  8. MySQL max()函数

    转载自  MySQL max()函数 MySQL MAX函数介绍 MySQL MAX()函数返回一组值中的最大值.MAX()函数在许多查询中非常方便,例如查找最大数量,最昂贵的产品以及客户的最大付款. ...

  9. MySQL min()函数

    转载自  MySQL min()函数 MySQL MIN函数 MIN()函数返回一组值中的最小值.MIN()函数在某些情况下非常有用,例如找到最小的数字,选择最便宜的产品,获得最低的信用额度等. 以下 ...

  10. mysql 自定义函数function,函数和存储过程的区别

    From: https://blog.csdn.net/u010365819/article/details/80470448 1.MySQL自定义函数简介 在MySQL中使用自定义函数也需要相应的要 ...

最新文章

  1. django 链接地址匹配流程
  2. Java培训深度学习都要学什么
  3. java包(翻译自Java Tutorials)
  4. python sklearn 归一化_第3章 Sklearn概述
  5. SQL SERVER 的SQL语句优化方式小结
  6. Springboot 下 EasyExcel 的数据导入导出
  7. js删除数组中指定元素_js中数组操作详解
  8. leetcode167. 两数之和 II - 输入有序数组
  9. 著名Youtuber “NELK “发布有关比特币购买游艇的视频
  10. Mac上使用中文Beamer添加各种格式的图片
  11. 13. 星际争霸之php设计模式--正面模式
  12. 腾讯宣布捐赠1亿元驰援河南;苹果回应iPhone 安全隐患;贝索斯完成10分钟太空之旅|极客头条...
  13. Promise的10大知识点!
  14. 高频交易主要模式解析
  15. johnson算法 java_Johnson-trotter 算法,一种高效的全排序算法的java实现
  16. 列宽一字符等于多少厘米_excel表格行高和列宽各是多少毫米或厘米啊?
  17. bindiff 太慢,两小时没结果
  18. 和 谐 文 化 简 介
  19. 制作手绘地图并准确覆盖到地图的超简单流程
  20. HC-SR04超声波测距模块

热门文章

  1. Tegra X2 系统上安装 openpose
  2. C++扫雷小游戏(附赠源代码)
  3. 游戏测试基础:缺陷等级
  4. 使用VirtualDub增加视频的音量
  5. 服务器IIS6/IIS7、Nginx、Apache屏蔽垃圾爬虫UA禁止垃圾爬虫,屏蔽指定UA
  6. 无意间看到这样一首歌 Take me to your heart
  7. 命令行窗口-隐藏黑窗口
  8. 古人为什么不发明计算机,成语是汉语言文学中的经典,为何古人能够发明,现代却很少发明?...
  9. (附源码)springboot菠萝大学课室预约系统分析与设 毕业设计 641656
  10. Redis集群的部署