关闭

史上最简单的 MySQL 教程(四十)「数据库变量」

标签: 数据库MySQL系统变量自定义变量SQL编程
3714人阅读 评论(7) 收藏 举报
分类:

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

变量

在 MySQL 数据库中,变量有两种,分别为:系统变量自定义变量

根据变量的作用范围,又分为:

  • 会话级别变量:仅对当前客户端当次连接有效;
  • 全局级别变量:对所有客户端的任一次连接都有效。

系统变量

系统变量,顾名思义,是系统设置好的变量(皆为全局级别变量),也是用来控制服务器表现的,如autocommitwait_timeout等。

大多数的时候,我们并不需要使用系统变量,但我们仍然需要了解有这么回事,在必须要的时候,它可以帮助我们完成特殊的需求。

首先,查看系统变量,语法为:

  • 基本语法show variables;

执行如下 SQL 语句,进行测试:

-- 查看系统变量
show variables;

systemvariable

如上图所示,显示了 MySQL 在本服务器上共含有 506 个系统变量。更近一步,我们可以查看具体的系统变量的值,语法为:

  • 基本语法select + @@变量名 + [, @@变量名, ... , @@变量名];

执行如下 SQL 语句,进行测试:

-- 查看具体的系统变量的值
select @@autocommit,@@version,@@version_compile_os,@@wait_timeout;

variablevalus

如上图所示,我们查到了具体的变量的值。此外,任何一个有内容返回的查询操作都是用select来完成的

接下来,我们尝试修改系统变量,先修改会话级别变量,再修改全局级别变量。

对于修改会话级别变量,有两种方法,语法分别为:

  • 基本语法 1set 变量名 = 值;
  • 基本语法 2set @@变量名 = 值;

执行如下 SQL 语句,进行测试:

-- 设置会话级别变量
set autocommit = 0;
set @@wait_timeout = 20000;

-- 查看系统变量
select @@autocommit, @@wait_timeout;

modify

如上图所示,我们修改了autocommitwait_timeout的值,但仅作用于会话级别,即只有当前当次连接有效,当再次打开一个新窗口的时候,我们会发现所有的变量值都恢复如初。

对于修改全局级别变量,语法为:

  • 基本语法set global 变量名 = 值;

执行如下 SQL 语句,进行测试:

-- 设置全局级别变量
set global autocommit = 0;

-- 查看系统变量
select @@autocommit;

global

如上图所示,当我们修改全局变量的时候,其效果对所有客户端的任一次连接都有效。But,如果某一个客户端在我们修改全局变量之前已经连上了服务器并且没有退出的话,那么我们的修改对其当前当次连接无效,需要重新登录才能生效。

自定义变量

自定义变量,顾名思义,是用户自己定义的变量,并且都是会话级别的变量。

系统为了区别系统变量与自定义变量,规定用户自定义的变量必须使用一个@符号。设置自定义变量的语法为:

  • 基本语法set @变量名 = 值;

执行如下 SQL 语句,进行测试:

-- 设置自定义变量
set @name = 'binguo';

-- 查看自定义变量
select @name;

selfvariable

观察上图,我们会发现查看自定义变量和系统变量有些细微的区别,那就是:查看系统变量时,select后面是跟着@@的,而查看自定义变量时,select后面是跟着@的。在这里,我们需要注意:在 MySQL 中,很多地方会默认将=处理为比较符号,因此 MySQL 还提供了另外一种赋值符号:=,即冒号与等号拼接而成的符号

此外,MySQL 允许我们从数据表中获取数据,然后直接赋值给变量,共有两种方式,分别为:

第 1 种:边赋值,边查看结果。语法为

  • 基本语法select @变量名 := 字段名 from 表名;

执行如下 SQL 语句,进行测试:

-- 从数据表中获取数据,然后直接为自定义变量赋值
select @name = name from student;

-- 查看自定义变量
select @name;

name

如上图所示,呃,这是什么鬼?好吧,细心的同学估计已经发现了,在上面的select语句中,我们误将:=写为=啦,然后 MySQL 将=处理为比较符号,并且在student表中没有发现与binguo匹配的名字,因此显示的结果皆为0,如果匹配成功,则会显示1。下面,我们修改赋值符号,重新进行测试:

-- 从数据表中获取数据,然后直接为自定义变量赋值
select @name := name from student;

-- 查看自定义变量
select @name;

fuzhifuhao

如上图所示,我们会发现上述select语句的作用为:从student表读取数据,然后依次赋值给自定义变量@name,并且先赋的值会被覆盖,仅保留最后一个赋值结果。

第 2 种:只赋值,不查看结果。语法为

  • 基本语法select + 字段列表 + from + 表名 + into + 变量列表;

执行如下 SQL 语句,进行测试:

-- 从数据表中获取数据,然后直接为自定义变量赋值
select name from student into @name;

-- 查看自定义变量
select @name;

-- 查看 student 表数据
select * from student;

errorinto

如上图所示,显然EEROR,内容为:返回结果包含的内容超过一列。实际上,在未加限制条件的情况下,我们直接从表中捞取数据,是捞取全部数据,因此忽略上述 SQL 语句中的into @name,其返回的结果为表中的全部name值,自然是超过一个了。在这种情况下,系统会报错,却将捞取数据的第一个值赋值给了@name,也就是说,在捞取数据超过一条记录的时候,系统会默认将第一个值赋值给自定义变量。

虽然上述 SQL 语句修改了@name的值,但却是一种错误的赋值方式,也是不可控的,其结果往往并不是我们想要的。对于上述的赋值方式,MySQL 的要求比较严格,规定每次只能获取一条记录。因此正确的做法是,加上一个where条件,将查询的结果限制为一条,例如

-- 从数据表中获取数据,然后直接为自定义变量赋值
select name from student where id = 2 into @name;

-- 查看自定义变量
select @name;

rightinto

如上图所示,我们获取数据并赋值成功。

最后,在强调一点:自定义变量都是会话级别,只要是当前用户当次连接,都会受到影响,不区分数据库


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

1
0
查看评论

数据库之局部变量的定义、赋值、以及使用

在SQL我们使用declare定义局部变量,同时可以使用set和select 对变量进行赋值。关于局部变量的操作顺序是,先声明,再赋值、后使用,声明和赋值的过程在不同的语句中 一、变量声明 例如 declare @name nvarchar(10),@id int set @name=&#...
  • changwei07080
  • changwei07080
  • 2012-05-13 09:37
  • 11327

mysql数据库常用的系统变量

一、什么是系统变量      系统变量实际上用于控制数据库的一些行为和方式的参数。比如我们启动数据库的时候设定多大的内存,使用什么样的隔离级别,日志文件的大小,存放位置等等一系列的东东。当然我们数据库系统启动后,有些系统变量(参数)也可以通过动态修改来及时调整数据库。...
  • u010889616
  • u010889616
  • 2015-09-07 21:41
  • 1074

史上最简单的 MyBatis 教程

1 前言  MyBatis 源于 Apache 的一个开源项目 iBatis,而 iBatis 一词则来源于“internet”和“abatis”的组合,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为MyBatis ,2013...
  • qq_35246620
  • qq_35246620
  • 2017-02-01 00:49
  • 6593

史上最简单的SpringCloud教程 | 第一篇: 服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于spri...
  • fend0875
  • fend0875
  • 2017-04-21 08:39
  • 1558

史上最简单的SpringCloud教程

转载请标明出处:  http://blog.csdn.net/forezp/article/details/70148833  本文出自方志朋的博客 错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spr...
  • zhongzh86
  • zhongzh86
  • 2017-11-22 14:15
  • 49

微服务:史上最简单的 SpringCloud 教程 | 终章

http://blog.csdn.net/forezp/article/details/70148833  本文出自方志朋的博客 案例全部采用Spring Boot 1.5.x ,Spring Cloud版本为Dalston.RELEASE  码农下载:https://gi...
  • superdangbo
  • superdangbo
  • 2017-11-01 17:20
  • 284

史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于springboot的。本文主要介绍了服务的注册与发现。
  • forezp
  • forezp
  • 2017-04-08 18:16
  • 309405

史上最直白的logistic regression教程 之 五

史上最直白的logistic regression教程整理稿,将4篇博文整理成一个完整的pdf文档,且修改成学术语境。 链接在这里: http://download.csdn.net/detail/u011539200/9290695 0积分下载,求rp,^_^
  • u011539200
  • u011539200
  • 2015-11-22 15:57
  • 651

史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

这篇文章主要讲述通过feign去消费服务。Feign是一个声明式的web服务客户端,它使得写web服务变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,包括Feign 注解和JAX-RS注解。Feign同时支持可插拔的编码器和解码器。
  • forezp
  • forezp
  • 2017-04-09 11:53
  • 188645

log4j 史上最简单的配置

log4j.properties 文件内容:具体需求课根据自己的意愿选择不同的权限# Log4j properties log4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j....
  • forever_insist
  • forever_insist
  • 2017-11-20 11:26
  • 106
    个人资料
    • 访问:952606次
    • 积分:12851
    • 等级:
    • 排名:第1273名
    • 原创:258篇
    • 转载:85篇
    • 译文:11篇
    • 评论:950条
    博主的 GitHub 账号
    GitHub : Charies Gavin

        鉴于 CSDN 糟糕的用户体验,博主会将一些优质的文章迁移到 Charies Gavin's Blog  欢迎大家在 GitHub 上 Follow 博主,以及 Fork、Star、Watch 博主的项目。


      青春不老 奋斗不止


      好学若饥虚心若愚
    博客专栏