mysql里面show variable作用是什么?

记录MYSQL存储过程中的关键语法:


什么是mysql存储例程?
存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令.


为什么要使用mysql存储过程?
我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两 种,现在要修改其中的一个查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现这,不易维 护!另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。
Mysql存储例程实际包含了存储过程和存储函数,它们被统称为存储例程。
其中存储过程主要完成在获取记录或插入记录或更新记录或删除记录,即完成select insert delete update等的工作。而存储函数只完成查询的工作,可接受输入参数并返回一个结果。


下面是存储过程的例子:

(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用”,”分割开。
(3)过程体的开始与结束使用BEGIN与END进行标识。
这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。


MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回

以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值

在MySQL客户端使用用户变量

在存储过程中使用用户变量

在存储过程间传递全局范围的用户变量

①用户变量名一般以@开头
②滥用用户变量会导致程序难以理解及管理

MySQL存储过程可使用两种风格的注释
该风格一般用于单行注释
c风格: 一般用于多行注释

MySQL存储过程的调用

用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。

MySQL存储过程的查询

我们像知道一个数据库下面有那些表,我们一般采用showtables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。
如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?
答案是:我们可以查看存储过程的详细,但是需要用另一种方法:
就可以查看当前存储过程的详细。

MySQL存储过程的修改

更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

MySQL存储过程的删除

删除一个存储过程比较简单,和删除表一样:
从MySQL的表格中删除一个或多个存储过程。

MySQL存储过程的控制语句

内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。

它在执行操作后检查结果,而while则是执行前进行检查。

loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

1. 通过引用复合语句的标号,来从新开始复合语句
 

MySQL存储过程的基本函数

注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1

也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19 注:返回类型并非均为整数,如: (2)可以设定小数位数,返回浮点型数据

MySql分页存储过程

变量是一个拥有名字的对象,可以用于存储和共享数据。根据变量的创建方式和作用域可以将其分为以下几种类型:

  • 系统变量(System Variable),由 MySQL 系统定义和维护的变量。系统变量可能包含全局值(全局变量)和会话值(会话变量),全局变量在服务器启动时通过命令行参数或者选项文件进行设置,在服务关闭时销毁;当客户端连接到服务器时,MySQL 会将大部分的全局变量复制一份作为客户端的会话变量,会话变量在连接断开时销毁。
  • 用户变量(User-Defined Variable),由用户自定义的变量,在连接会话期间有效,可以用于在不同 SQL 语句之间传递数据。
  • 局部变量(Local Variable),在存储过程或者函数中定义的变量,通常用于存储中间结果。局部变量的作用域为存储过程/函数内或者某个语句块之内。

本文主要介绍系统变量和用户变量的设置和使用,局部变量将会在后续关于存储过程的文章中进行讨论。

f 配置文件中,MySQL 服务重启时会读取该文件重新设值其中的参数。这种方式比直接修改 f 配置文件,再次重启 MySQL 服务时生效,但是不会影响当前运行中的设置。

如果想要删除持久化配置文件中的参数设置,可以使用 RESET PERSIST 语句。例如:

忽略变量名意味着删除 mysqld-auto.cnf 配置文件中的所有设置。

对于会话变量,设置时可以在变量前加上 SESSION 或者 LOCAL 关键字,@@SESSION、@@LOCAL 或者 @@ 限定符,或者省略关键字和限定符。例如:

修改会话变量只对当前会话有效,不会影响其他连接会话的设置。

如果想要将全局变量设置为编译时的默认值,或者将会话变量设置为对应全局变量的当前值,可以使用 DEFAULT 值。例如:

当我们需要在不同的 SQL 语句之间传递数据时,可以定义一个变量,然后在某个语句中进行赋值并且在其他语句中进行引用。用户变量的作用范围在当前会话之内,关闭连接时自动销毁;一个会话创建的用户变量不会被其他会话看到或者使用(性能数据库 performance_schema 中的 user_variables_by_thread 表中列出了所有会话定义的用户变量)。

用户变量使用 @var_name 格式进行定义,其中变量名 var_name 由字母数字、点号(.)、下划线(_)以及美元符号($)组成,最大长度为 64 个字符。例如,以下都是有效的用户变量:

如果使用引号进行引用,变量名中也可以使用其他字符。例如:

用户变量的名称不区分大小写,@id 和 @ID 是同一个变量。

用户变量的赋值方法有两种:SET 命令或者 SELECT 语句。首先,SET 命令的语法如下:

除了使用等号(=)之外,也可以使用 := 进行变量赋值。

第一个变量的类型是整数,通过一个子查询进行赋值;第二个变量的类型是字符串,通过一个字面值进行赋值。

用户变量的第二种赋值方式如下:

这种设置方式在 MySQL 8.0 中仍然支持,但是将来会被弃用,因此推荐使用 SET 命令进行赋值。另外,这种方式只能使用 := 进行赋值,因为 SELECT 语句中的 = 是一个比较运算符。

如果查询语句返回多行数据,变量只保存最后一行中的数据。例如:

变量 @emp_name 中存储的是编号为 25 的员工姓名。

大多数情况下,用户变量都可以当作表达式用于 SELECT 列表、WHERE 子句、INSERT 或者 UPDATE 等语句中。例如:

不过,用户变量不能用于明确需要字面值的场景,例如 SELECT 语句的 LIMIT 子句或者 LOAD DATA 语句的 IGNORE N LINES 子句不能出现用户变量。

访问一个未初始化的变量将会返回 NULL 值,类型为字符串。

在单个语句中设置并访问相同的变量可能会导致非预期的结果,例如:

结果显示变量 @x 没有初始化。为了避免这种问题,可以在使用变量之前将其设置为 0 或者 ''。

用户变量的一个常见用途是用于存储最新插入数据对应的自增字段值( AUTO_INCREMENT)。例如,当我们插入一条订单记录时,需要获取它对应的自增 id 值,然后用于生成订单明细。此时就可以通过用户变量存储最新的订单编号:

用户变量的作用是存储数据值,不能直接作为 SQL 语句中的标识符(例如表名或者数据库名等)使用,也不能用于替换保留字(例如 SELECT)。例如:

查询返回的是字符串“emp_name”,而不是员工姓名。如果尝试将变量的值作为标识符使用,将会返回错误。例如:

不过,以上限制存在一个例外情况,就是可以使用变量构造预编译的动态 SQL 语句。例如:

首先,变量 @col 存储了字段的名称;然后,通过 concat 函数拼接出动态语句 @sql;prepare 用于预编译一个语句,execute 执行预编译语句,deallocate prepare 释放预编译的语句。我们可以查询使用变量拼接之后的语句内容:

对于预编译语句,用户变量可以替换语句的任何部分。预编译语句的使用将会在后续文章中进行详细介绍。

我要回帖

更多关于 mysql显示表结构show 的文章

 

随机推荐