MySQL中使用@符号定义用户变量

摘要

本文介绍如何在MySQL中使用@定义用户变量,并展示用户变量如何用于一般sql查询、函数定义。

一般SQL查询

模拟一张数据表table1

go 复制代码
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('1', '1', 'a');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('2', '2', 'b');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('3', '3', 'c');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('4', '5', 'd');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('5', '5', 'e');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('7', '8', 'f');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('7', '8', 'g');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('8', '9', 'h');
INSERT INTO `test1`.`table1` (`a`, `b`, `c`) VALUES ('8', '9', 'i');

1)普通查询

sql 复制代码
-- 声明并初始化变量 @num 为 0
-- @表示用户变量
-- := 是MySQL的赋值运算符
-- 返回一个匿名结果集,仅包含一行一列,值为 0
SELECT @num := 0

-- 用户变量在当前会话中有效(不同客户端连接独立)
-- 可以在当前会话的后续查询中引用@num
-- 变量赋值是按顺序逐列执行的
-- 输出 0 1 2
SELECT @num := 0, @num := @num+1, @num := @num+1;


SELECT a, b, @r := @r+1 as '行号'
FROM table1, 
(SELECT @r := 0) tmp; -- 初始化变量。别名tmp必须存在,因为 MySQL要求所有表或子查询都必须有别名   
  • 输出

2)排序去重

less 复制代码
-- MySQL 5.x 中常用
-- variables 在查询开始前初始化用户变量
-- 如果当前行的a和b与上一行的@current_column1和@current_column2 相同(即属于同一分组),则行号@row_number自增 1
-- ab成组情况下再按照c降序排列
-- 这里取rn=1的列实现去重功能
SELECT * FROM (
SELECT
      t.*,
      @row_number := IF(@current_column1 = a AND @current_column2 = b, @row_number+1, 1) AS rn,
      @current_column1 := a,
      @current_column2 := b
FROM
      table1 t ,
      (
          SELECT
          @row_number := 0,
          @current_column1 := '', -- 字符串初始化
          @current_column2 := ''  -- 字符串初始化
      ) AS variables
ORDERBY a,b,c DESC
) z WHERE rn =1
    
-- MySQL 8.0+ 中常用
-- ROW_NUMBER()窗口函数为结果集中的每一行分配一个唯一的连续序号(rn)
-- 序号的生成规则由 OVER() 子句定义
-- PARTITION BY a, b 将数据按a和b列的组合值进行分组分区。切每个分区内的行号会独立计算,从1开始。
-- ORDER BY c DESC在每个分区内,按c列的降序排列数据,排序后的每一行会依次获得递增的序号
-- 这里取rn=1的列实现去重功能
SELECT * FROM (
SELECT
      t.*, ROW_NUMBER() OVER (PARTITIONBY a, b ORDERBY c DESC) AS rn
FROM
      table1 t
) z WHERE rn = 1
  • 输出

函数中使用

3)函数定义

sql 复制代码
-- 定义函数
CREATE PROCEDURE prc_variables_test(IN testIn varchar(50))
BEGIN
    SET @num = 0;  -- 声明变量并初始化
    SET @str = '';
    SELECT a into @str FROM table1 WHERE c = 'g';  -- 查询赋值
    if(@str = '7') THEN
        SET @num = 1;
    else
        SET @num = 2;
    end if ;
    SELECT @str, @num;
END

-- 调用示例
CALL prc_variables_test('1') -- 假的入参可忽略
  • 输出

总结

以上我们了解了MySQL中@符号定义的用户变量如何用于一般sql查询、函数定义。

关注公众号:咖啡Beans

在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
yolo_Yang34 分钟前
【MySQL】mysqldump使用方法
数据库·mysql·oracle
玩转测试开发43 分钟前
xshell设置跳板机登录内网服务器
运维·服务器·数据库
你不是我我1 小时前
【Java 开发日记】运行时有出现过什么异常?
数据库·oracle
夏玉林的学习之路2 小时前
正则表达式
数据库·c++·qt·mysql·正则表达式
JIngJaneIL2 小时前
财务管理|基于SprinBoot+vue的个人财务管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·财务管理系统
JIngJaneIL3 小时前
口腔健康系统|口腔医疗|基于java和小程序的口腔健康系统小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·口腔医疗小程序
白帽子黑客罗哥3 小时前
常见Web安全漏洞全解析:从原理到防御的实战指南
数据库·web安全·渗透测试·漏洞利用·权限提升
寒山李白5 小时前
IDEA连接MySQL服务器数据库指南
java·数据库·mysql·intellij-idea·idea·database
计算机学姐6 小时前
基于SpringBoot的动漫推荐系统【协同过滤推荐算法+词云图+排行榜】
java·vue.js·spring boot·后端·mysql·intellij-idea·推荐算法
亿坊电商8 小时前
PHP后端项目中多环境配置管理:开发、测试、生产的优雅解决方案!
服务器·数据库·php