第6步---MySQL的控制流语句和窗口函数

第6步---MySQL的控制流语句和窗口函数

 1.IF关键字

-- ==================控制流语句=================
SELECT IF('5>3','大于','小于');

-- 会单独生成一列的
SELECT *,IF(score >90 , '优秀', '一般') '等级' FROM stu_score;

-- IFNULL(expr1,expr2)
SELECT  id,name ,IFNULL(salary,0),dept_id FROM emp4;

-- ISNULL() 判断某个值是不是null
-- 0 表示不是null
SELECT ISNULL(11);
SELECT ISNULL(NULL);

-- NULLIF(expr1,expr2)

-- 一样的返回null
SELECT NULLIF(12,12);

-- 不一样返回第一个的值
SELECT NULLIF(12,1)

2.CASE关键字

语法格式:

会依次判断下面的值要是相等的话就会进行输出的

SELECT
CASE
		5 
		WHEN 5 THEN	 '你好5' 
		WHEN 4 THEN	 '你好4' 
		ELSE 'hi' 
END ;

 

-- 设置显示的别名
SELECT
CASE
		5 
		WHEN 5 THEN	 '你好5' 
		WHEN 4 THEN	 '你好4' 
		ELSE 'hi' 
END as info;

 

-- 创建一个新的数据库orders
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `price` double DEFAULT NULL,
  `pay_type` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


插入下面的语句
INSERT INTO `sys_test`.`orders` (`id`, `price`, `pay_type`) VALUES (1, 1200, 1);
INSERT INTO `sys_test`.`orders` (`id`, `price`, `pay_type`) VALUES (2, 1000, 2);
INSERT INTO `sys_test`.`orders` (`id`, `price`, `pay_type`) VALUES (3, 200, 3);
INSERT INTO `sys_test`.`orders` (`id`, `price`, `pay_type`) VALUES (4, 3000, 1);
INSERT INTO `sys_test`.`orders` (`id`, `price`, `pay_type`) VALUES (5, 1500, 2);

 

后面的支付方式采用的都是不同的编号进行设置的支付的方式

1:微信支付2:支付宝支付3:银行卡支付4:其他

 


-- 查看订单的支付的方式
SELECT id,price, pay_type,
CASE pay_type
	WHEN 1 THEN '支付宝'
	WHEN 2 THEN '微信'
	WHEN 3 THEN '银联'
	ELSE
		'未知支付方式'
END as '支付方式'


 FROM orders;

 

 

3.窗口函数

 

比原先的聚合函数更加强大不仅可以看见原始的数据还可以看见转换之后的数据。

具有开窗聚合函数的作用。

window FUNCTION (expr ) over(

PRIMARY KEY 
ORDER BY 
...
)

-- 序号函数
SELECT * FROM emp4;

-- 对每个部门员工按照薪资进行排序
SELECT id,name ,salary,dept_id ,

ROW_NUMBER() over(PARTITION by dept_id ORDER BY salary DESC ) AS rn1,
RANK() over(PARTITION by dept_id ORDER BY salary DESC ) AS rn2,
DENSE_RANK() over(PARTITION by dept_id ORDER BY salary DESC ) AS rn3
FROM emp4;

 

都能实现相同的效果,区别在于后面的参数的值设置的时候是不是相同的值。



-- 分组求topN
SELECT * FROM (
SELECT id,name ,salary,dept_id ,
DENSE_RANK() over(PARTITION by dept_id ORDER BY salary DESC ) AS rn3
FROM emp4) t
WHERE t.rn3<=3 ;

 

4.分布函数

cume_dist和percent_rank

用途:分组内小于 等于当前rank值得行数/分组内得总行数。

场景:查询小于当前薪资得比例


-- 薪资比例
SELECT dept_id,name ,salary,time ,
CUME_DIST() over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4;

 

计算的是小于自己得薪资得人数得比例的关系。

PERCENT_RANK函数

这个函数的用处不是很大


SELECT dept_id,name ,salary,time ,
rank() over(PARTITION by dept_id ORDER BY time) AS rn2,
PERCENT_RANK() over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4;

 

5.前后函数

-- 前后函数
SELECT dept_id,name ,salary,time ,
LAG(time ,1,'2023-08-18') over(PARTITION by dept_id ORDER BY time) AS rn2,
LAG(time ,2) over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4;

-- 前后函数
SELECT dept_id,name ,salary,time ,
lead(time ,1,'2023-08-18') over(PARTITION by dept_id ORDER BY time) AS rn2,
lead(time ,2) over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4;

6.头尾函数

-- 到目前为止 按照日期进行排序找到第一个入职的和最后一个入职的员工的薪资
-- 到目前为止 按照日期进行排序找到第一个入职的和最后一个入职的员工的薪资
SELECT dept_id,name ,salary,time ,
FIRST_VALUE(salary)over(PARTITION by dept_id ORDER BY time) AS rn2,
LAST_VALUE(salary) over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4;

 

7.开窗聚合函数


-- 按照入职时间排序并求工资的和
SELECT dept_id,name ,salary,time ,
sum(salary) over(PARTITION by dept_id ORDER BY time  ) AS rn3
FROM emp4;

 


-- 按照入职时间排序并求工资的和
-- 从开始加到当前行 rows BETWEEN unbounded preceding and current row 
SELECT dept_id,name ,salary,time ,
sum(salary) over(PARTITION by dept_id ORDER BY time rows BETWEEN unbounded preceding and current row ) AS rn3
FROM emp4;

-- 往上3行加到当前行
SELECT dept_id,name ,salary,time ,
sum(salary) over(PARTITION by dept_id ORDER BY time rows BETWEEN 3 preceding and current row ) AS rn3
FROM emp4;


-- 往上3行往后加一行
SELECT dept_id,name ,salary,time ,
sum(salary) over(PARTITION by dept_id ORDER BY time rows BETWEEN 3 preceding and 1 following ) AS rn3
FROM emp4;

上面的开窗聚合函数可以实现复杂的聚合的操作。

8.NTH_VALUE窗口函数

-- 截至到当前排名是多少的
SELECT dept_id,name ,salary,time ,
NTH_VALUE(salary,2) over(PARTITION by dept_id ORDER BY time) AS rn2,
NTH_VALUE(salary,1)over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4;

-- 按照入职时间分成3组
SELECT dept_id,name ,salary,time ,
ntile(3)over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4;


-- 按照入职时间分成3组 取出第一组员工
SELECT * FROM(
SELECT dept_id,name ,salary,time ,
ntile(3)over(PARTITION by dept_id ORDER BY time) AS rn3
FROM emp4
) t WHERE t.rn3=1;

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

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

相关文章

设计模式-观察者模式(观察者模式的需求衍变过程详解,关于监听的理解)

目录 前言概念你有过这样的问题吗&#xff1f; 详细介绍原理&#xff1a;应用场景&#xff1a; 实现方式&#xff1a;类图代码 问题回答监听&#xff0c;为什么叫监听&#xff0c;具体代码是哪观察者模式的需求衍变过程观察者是为什么是行为型 总结&#xff1a; 前言 在软件设计…

Jenkins-发送邮件配置

在Jenkins构建执行完毕后&#xff0c;需要及时通知相关人员。因此在jenkins中是可以通过邮件通知的。 一、Jenkins自带的邮件通知功能 找到manage Jenkins->Configure System&#xff0c;进行邮件配置&#xff1a; 2. 配置Jenkins自带的邮箱信息 完成上面的配置后&#xf…

2023年如何运营TikTok账号?这些技巧你一定要知道

Tik Tok目前的全球月活已经突破7亿。作为全球最受欢迎的应用程序之一&#xff0c;它不仅为用户提供了记录分享生活中美好时刻、交流全球创意的阵地&#xff0c;也给全球的企业提供了一个直接触达用户的平台。 一、保持视频内容的真实性 当我们站在用户的角度去考虑时&#xf…

Android3:布局

一。线性布局 创建项目Linear Layout Example activity_main.xml <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"an…

PHP 房产网站系统Dreamweaver开发mysql数据库web结构php编程计算机网页项目

一、源码特点 PHP 房产网站系统是一套完善的WEB设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码 https://download.csdn.net/download/qq_41221322/88233553 论文 https://download…

【数据结构入门指南】二叉树

【数据结构入门指南】二叉树 一、二叉树的概念二、现实中的二叉树三、特殊的二叉树四、二叉树的性质五、二叉树的存储结构5.1 顺序结构5.2 链式结构 一、二叉树的概念 二叉树是一棵特殊的树。一棵二叉树是结点的一个有限集合&#xff0c;该节点&#xff1a; ①&#xff1a;或者…

Eslint error, configuration for rule “import/no-cycle“ is invalid

可以参考stackoverflow.comEslint error, configuration for rule "import/no-cycle" is invalid他的意思是有个∞符号不支持&#xff0c;解决方案&#xff0c;把 eslint-plugin-import 的版本增加到 ^2.22.1&#xff0c;重新下载依赖包如&#xff1a;

Spring Boot+ redis执行lua脚本的5种方式

Spring Boot redis执行lua脚本示例 文章目录 Spring Boot redis执行lua脚本示例Redis从入门到精通系列文章0.前言1.基础介绍2.步骤2.1. 引入依赖1. 使用Jedis作为Redis客户端&#xff1a;2. 使用Lettuce作为Redis客户端&#xff1a; 2.2. 配置文件使用Jedis作为Redis客户端的配…

登陆接口的的Filter过滤

目录 一、概述 二、基本操作 三、登陆检查接口 一、概述 什么是Filter&#xff1f; Filter表示过滤器&#xff0c;是 JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能 使用了过滤器之后&#xff0…

工业生产全面感知!工业感知云来了

面向工业企业数字化转型需求&#xff0c;天翼物联基于感知云平台创新能力和5G工业物联数采能力&#xff0c;为客户提供工业感知云服务&#xff0c;包括工业泛协议接入、感知云工业超轻数采平台、工业感知数据治理、工业数据看板四大服务&#xff0c;构建工业感知神经系统新型数…

高性能服务器Nodejs快速入门

目录 1 初识 Nodejs2 Buffer 缓冲区3 fs 文件系统模块3.1 读取文件3.2 写入文件3.3 路径动态拼接问题 __dirname3.4 其它操作 4 path 路径模块4.1 路径拼接 path.join()4.2 获取路径中文件名 path.basename()4.3 获取路径中文件扩展名 path.extname() 5 http 模块5.1 创建基本 …

PHP自己的框架实现debug调试模式和时区(完善篇三)

1、实现效果通过config设置开关debug调试模式 2、debug调试模式设置和时区设置 error_reporting和display_errors点击查看详细讲解 public static function run(){//定义常量self::_set_const();//创建模块目录self::_mk_module();//加载文件self::_import_file();self::_set_…

IPEmotion交流电功率分析计算

一 应用背景 随着国内电动汽车行业的快速发展&#xff0c;在相同的道路环境和行驶状态下&#xff0c;增加电动车的整体续航里程和提升乘员对于行驶途中用电需求的满意度尤为重要。对此&#xff0c;需要采集试验过程中交直流电压电流信号&#xff0c;以计算出车辆各种部件输出和…

数据库知识

怎么做 常见的数据库 Oracle Mysql SOLSever Navicat &#xff08;新版可以链接mysql oracle&#xff09; http://sqlfiddle.com/ 数据库操作在线练习 mysql自带四个数据库 数据库语言的使用 显示数据库&#xff1a;show databases&#xff1b; 创建数据库&#xff1a;…

opencv-python使用鼠标点击图片显示该点坐标和像素值IPM逆透视变换车道线二值化处理

OpenCV的鼠标操作 实现获取像素点的功能主要基于OpenCV的内置函数cv2.setMouseCallback()&#xff0c;即鼠标事件回调 setMouseCallback(winname, onMouse,userdata0) winname: 接收鼠标事件的窗口名称 onMouse: 处理鼠标事件的回调函数指针 userdata: 传给回调函数的用户数据…

html动态爱心代码【二】(附源码)

目录 前言 效果演示 内容修改 完整代码 总结 前言 七夕马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;表白等场景&#xff0c…

Qt与电脑管家4

折线图&#xff1a; #ifndef LINE_CHART_H #define LINE_CHART_H#include <QWidget> #include <QPainter> #include "circle.h" class line_chart : public QWidget {Q_OBJECT public:explicit line_chart(QWidget *parent nullptr); protected:void pa…

搭建开发环境-操作系统篇(一键搭建开发环境)

概述 所谓工欲善其事必先利其器&#xff0c;搭环境往往是开发过程中卡出很多初学者的拦路虎。 对于很多老鸟来说&#xff0c;很多东西都已经习惯成自然&#xff0c;也就没有刻意和初学者说。但对于很多初学者&#xff0c;却是受益良多。 这个系列&#xff0c;先从操作系统开始…

两个字符串的删除操作——力扣583

class Solution {public:int minDistance(string word1, string word2) {int m = word1.length(), n=word2

线程面试题-2

1、一般用什么作为HashMap的key? 一般用Integer、String 这种不可变类当 HashMap 当 key&#xff0c;而且 String 最为常用。 因为字符串是不可变的&#xff0c;所以在它创建的时候 hashcode 就被缓存了&#xff0c;不需要重新计算。这就是HashMap 中的键往往都使用字符串的原…