【MySQL】临时变量用法

力扣题

1、题目地址

2388. 将表中的空值更改为前一个值

2、模拟表

表:CoffeeShop

Column Name Type
id int
drink varchar
  • id 是该表的主键(具有唯一值的列)。
  • 该表中的每一行都显示了订单 id 和所点饮料的名称。一些饮料行为 null。

3、要求

编写一个解决方案将 drink 的 null 值替换为前面最近一行不为 null 的 drink。保证表第一行的 drink 不为 null。

返回 与输入顺序相同的 结果表。

查询结果格式示例如下。

示例 1:

输入:

CoffeeShop 表:

id drink
9 Rum and Coke
6 null
7 null
3 St Germain Spritz
1 Orange Margarita
2 null

输出:

id drink
9 Rum and Coke
6 Rum and Coke
7 Rum and Coke
3 St Germain Spritz
1 Orange Margarita
2 Orange Margarita

解释:

对于 ID 6,之前不为空的值来自 ID 9。我们将 null 替换为 "Rum and Coke"。

对于 ID 7,之前不为空的值来自 ID 9。我们将 null 替换为 "Rum and Coke"。

对于 ID 2,之前不为空的值来自 ID 1。我们将 null 替换为 "Orange Margarita"。

请注意,输出中的行与输入中的行相同。

4、代码编写

我的写法

思路:首先要求里面的输出顺序还是和原先一样,原先并没有按什么排序,所以我们得先对数据标上序号,这就可以用到窗口函数 row_numer,然后我们只需要在查询到 null 数据的时候,去查询比这个 null 数据的序号小的不为 null 的数据,然后根据序号倒序,取第一条即可,就能满足要求

里面需要注意的一点就是窗口函数 ROW_NUMBER() over()over 括号里面是不加分组和排序的

sql 复制代码
WITH tmp AS (
    SELECT *, ROW_NUMBER() over() AS rn
    FROM CoffeeShop
)
SELECT id, 
	   IFNULL(
	   	   drink, 
	   	   (SELECT drink FROM tmp WHERE rn < one.rn AND drink IS NOT NULL ORDER BY rn DESC LIMIT 1)
	   ) AS drink
FROM tmp AS one

知识点

临时变量有两种用法:(temp 可以改成其他名)

1、使用 set,定义形式 set @temp=[var]

sql 复制代码
SET @temp=10;
SELECT @temp;

2、使用 select,定义形式 select @temp:=[var],下面两种都可以输出

sql 复制代码
SELECT @temp:=10;
sql 复制代码
SELECT @temp:=10;
SELECT @temp;

参考:mysql 临时变量

网友写法(临时变量用法)

sql 复制代码
SELECT id,
	   @temp := IFNULL(drink, @temp) drink
FROM CoffeeShop

上面网友写法就是用的第二种用法,代码分析如下:

第 1 行:IFNULL 不为 null,将 Rum and Coke 赋值到 @temp 里面,并输出 SELECT @temp:= drink(drink='Rum and Coke')

第 2 行:IFNULLnull,将 @temp 赋值到 @temp 里面,并输出 SELECT @temp:=@temp(@temp='Rum and Coke'

第 3 行:IFNULLnull,将 @temp 赋值到 @temp 里面,并输出 SELECT @temp:=@temp(@temp='Rum and Coke'

第 4 行:IFNULL 不为 null,将 St Germain Spritz 赋值到 @temp 里面,并输出 SELECT @temp:= drink(drink='St Germain Spritz')

第 5 行:IFNULL 不为 null,将 Orange Margarita 赋值到 @temp 里面,并输出 SELECT @temp:= drink(drink='Orange Margarita')

第 6 行:IFNULLnull,将 @temp 赋值到 @temp 里面,并输出 SELECT @temp:=@temp(@temp='Orange Margarita'

id drink
9 Rum and Coke -> @temp
6 null <- @temp
7 null <- @temp
3 St Germain Spritz -> @temp
1 Orange Margarita -> @temp
2 null <- @temp
相关推荐
lvbinemail1 小时前
Grafana模板自动复制图表
数据库·mysql·zabbix·grafana·监控
weixin_448119941 小时前
Datawhale Hello-Agents入门篇202512第1次作业
数据库·sql·mysql
皮皮林5511 小时前
有了开源的 MySQL,为什么还要选择 PostgreSQL?
mysql
廋到被风吹走2 小时前
【数据库】【MySQL】分库分表策略 分类、优势与短板
数据库·mysql·分类
五阿哥永琪4 小时前
MySQL 慢查询定位与 SQL 性能优化实战指南
sql·mysql·性能优化
xiaok7 小时前
GROUP BY进阶用法
mysql
李慕婉学姐7 小时前
【开题答辩过程】以《基于Android的健康助手APP的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
android·java·mysql
qq_12498707538 小时前
基于springboot健康养老APP的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·微信小程序·毕业设计
亚林瓜子8 小时前
mysql命令行手动导入csv数据到指定表
数据库·mysql·gui·csv·cli·db·import
一分半心动9 小时前
lnmp架构 mysql数据库Cannot assign requested address报错解决
linux·mysql·php