当前位置: 首页
数据库
MySQL用户变量定义:set和select用法详解,一看就懂

MySQL用户变量定义:set和select用法详解,一看就懂

热心网友 时间:2026-07-24
转载

MySQL用户变量用于跨SQL语句传递值,定义方式有SET和SELECT两种。SET可使用=或:=赋值,但同一语句中多个变量赋值时右侧值取旧值;SELECT只能用:=,返回一行结果,多行时取最后一行。变量在WHERE中使用前需先赋值,生命周期限于当前会话。

用户变量

在实际开发中,经常会遇到需要在不同SQL语句之间传递某个值的情况。这时候,用户变量就是最直接的解决方案——它相当于一个临时存储的“便签”,你可以在一个地方把值写进去,然后在另一个地方读出来。

定义用户变量有两种方式:SETSELECT。它们各有各的脾气,用不对就容易踩坑,下面一个一个说。

SET 的使用方法:

SET @变量名 {= | := } value [,@变量名 {= | := } value,…] ;

SET 的变量值可以是以下几种:

  • 字面量,比如数字、字符串
  • 系统表达式,比如 NOW()
  • 来自一个 SQL 语句的结果(子查询)
  • 系统函数,比如 RAND()

例1

定义用户变量 PI,初值为 3.1415926

SET @PI := 3.1415926;

注意一点:用户变量的数据类型完全由赋给它的值决定,你不需要提前声明类型,MySQL 会自动推断。

例2

定义一个变量,存放 1 号球队的队长号码

SET @anr := (SELECT playerno FROM teams WHERE teamno=1);

要获取变量的值,直接 select 它就行:

SELECT @变量名;

这里有个容易翻车的细节:

mysql> set @a=1;
Query OK, 0 rows affected (0.00 sec)

mysql> set @a=5,@b=@a;
Query OK, 0 rows affected (0.00 sec)

mysql> select @b;
+-----+
| @b  |
+-----+
| 1   |
+-----+
1 row in set (0.00 sec)

看到没?@b 的值是 1,而不是 5。原因在于,当你在一条 SET 语句中同时给多个变量赋值时,MySQL 会先计算所有等号右边的值,然后再统一赋值。所以 @b=@a 时,右边的 @a 还是旧值 1,而不是刚赋上去的 5。这一点特别容易忽略,实战中要小心。

SELECT 设置用户变量:

在 SELECT 中给变量赋值,只能用 :=,不能用 =——因为在 SELECT 里 = 被当作比较操作符,而不是赋值符。这个写法和普通 SELECT 的区别在于:

  • 一定会返回一行结果(即使你只是赋值)
  • 只能用 :=

例3

创建用户变量 playerno 并赋值为 7

SELECT @playerno := 7;

例4

一次定义 3 个用户变量

SELECT @name := 'tom', @town := 'Inglewood', @postcode := '1234ab';

例5

查询 6 号球员的姓名、城市和邮编,并保存到 3 个变量中

SELECT @name := name, @town := town, @postcode := postcode
FROM players
WHERE playerno = 6;

注意:如果 SELECT 查询返回了多行,MySQL 会把最后一行的值赋给变量,而不会报错。这一点既是特性也是陷阱——如果查询结果不是你期望的,变量值可能跟你预想的不一样。

例6

定义变量 @playerno,将 players 表中最小的球员编号赋给它:6

SELECT @playerno := playerno
FROM players
ORDER BY playerno DESC;
SELECT @playerno;

重要提醒:当用户变量用在 WHERE 或 HA VING 子句中时,必须先用单独的语句定义好变量,否则会得到意外结果——因为 WHERE 子句的执行顺序在 SELECT 赋值之前。

例7

SELECT @pnr7 := 7
FROM players
WHERE playerno < @pnr7;

这条语句不会返回任何球员编号小于 7 的记录。为什么?因为 WHERE 子句在 SELECT 的赋值之前执行,此时 @pnr7 还没有被赋值,它的值是 NULL,所以 playerno < NULL 永远为假,自然查不出结果。正确的做法是:先单独用 SET 或 SELECT 给 @pnr7 赋好值,再执行带 WHERE 的查询。

用户变量的生命周期:

用户变量只在当前会话中有效。只要会话没有断开,你随时可以读写这个变量。但如果想跨会话共享变量,就得把它存到数据表里,用持久化方式传递。

来源:https://www.jb51.net/database/367958cle.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
自增主键值从何而来?深入理解原理,告别只会auto_increment

自增主键值从何而来?深入理解原理,告别只会auto_increment

KingbaseES推荐使用serial、bigserial、显式sequence或identity列实现自增主键。serial创建integer并关联序列,bigserial对应bigint;显式sequence可自定义起始值等参数;identity有generatedbydefault(允许指定值)与always(禁止)两种模式。

时间:2026-07-25 22:22
Linux下瀚高数据库授权文件过期及替换解决方案

Linux下瀚高数据库授权文件过期及替换解决方案

在银河麒麟系统下,瀚高数据库hgdb-4 5试用授权20天到期后需替换正式授权文件。正确操作:停止服务,备份旧文件,将授权文件复制到 opt highgo hgdb-4 5 etc lic 并命名为hgdb lic,设置权限600和属主highgo:highgo,再启动服务。禁止直接修改data目录下的license info文件。

时间:2026-07-25 22:22
Oracle BLOB实时同步的5大技术挑战与难点解析

Oracle BLOB实时同步的5大技术挑战与难点解析

OracleBLOB实时同步面临分片组装、多列隔离、长事务跨窗口、事务回滚及大对象资源控制等技术挑战,必须在日志中精确还原完整字段值,才能保证源端与目标端数据完全一致,这对同步系统的稳健性提出了高要求。

时间:2026-07-25 22:22
MySQL禁用redo日志导致全备失败

MySQL禁用redo日志导致全备失败

MySQL全量备份失败是由于数据定义语言操作触发排序索引构建,禁用重做日志导致XtraBackup无法获取一致性备份。测试验证表明,优化表语句即使无数据也会触发该问题。根本原因在于排序索引构建过程跳过了重做日志记录,破坏了备份的一致性。

时间:2026-07-25 20:35
Kafka架构图优化与改进的全面详细步骤与实践指南

Kafka架构图优化与改进的全面详细步骤与实践指南

Kafka作为实时数据流处理的核心中间件,其底层架构虽已相当成熟,但在实际生产环境中,要充分发挥其性能潜力,仍需落实到具体的调优与架构改造上。核心目标可归纳为三点:如何承载更高的吞吐量、如何保障数据不丢失、以及故障发生时如何快速恢复。本文将从这几个关键方向出发,深入探讨如何真正榨干Kafka集群的性

时间:2026-07-25 20:35
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜