当前位置: 56net亚洲必嬴 > 数据库 > 正文

必嬴56netMySQL 变量和准星,MySQL变量条件

时间:2019-11-01 11:50来源:数据库
早晨同事要作者写个MySQL去除重复数据的SQL,想起来上次写过生机勃勃篇MySQL去除重复数据的博客,使用导入导出加唯一索引完毕的,可是这种办法对事情影响不小,所以重复写三个积攒

早晨同事要作者写个MySQL去除重复数据的SQL,想起来上次写过生机勃勃篇MySQL去除重复数据的博客,使用导入导出加唯一索引完毕的,可是这种办法对事情影响不小,所以重复写三个积攒进程来删重复数据,那后生可畏写就写了三个深夜,这种BUG确实是很令人颓唐和浪费时间的。

MySQL心得7-1-存款和储蓄进程

MySQL 变量和条件,MySQL变量条件

这里把流程简便的叙述一下,删重复数据的逻辑很粗大略:

 

概述  

 变量在存款和储蓄进度中会平日被接纳,变量的选拔方法是三个至关心注重要的知识点,非常是在定义准绳那块比较重大。

 mysql版本:5.6

1.依据重复推断标准找寻重复记录的微小主键(平常是ID列)。

  1. 选取存款和储蓄进度的亮点有:

变量定义和赋值  

#创建数据库
DROP DATABASE IF EXISTS Dpro;
CREATE  DATABASE Dpro
CHARACTER SET utf8
;

USE Dpro;

#创建部门表
DROP TABLE IF EXISTS Employee;
CREATE TABLE Employee
(id INT NOT NULL PRIMARY KEY COMMENT '主键',
 name VARCHAR(20) NOT NULL COMMENT '人名',
 depid INT NOT NULL COMMENT '部门id'
);

INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100),(2,'王',101),(3,'张',101),(4,'李',102),(5,'郭',103);

declare定义变量

在存款和储蓄进度和函数中通过declare定义变量在BEGIN...END中,且在讲话此前。并且能够通过重新定义多个变量

注意:declare定义的变量名不能够带‘@’符号,mysql在这里点做的着实非常不够直观,往往变量名会被错成参数或然字段名。

DECLARE var_name[,...] type [DEFAULT value]

例如:

DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid;

END$$
DELIMITER ;

SET变量赋值 

SET除了能够给业已定义好的变量赋值外,还足以钦点赋值并定义新变量,且SET定义的变量名能够带‘@’符号,SET语句的岗位也是在BEGIN ....END之间的言辞在此之前。

1.变量赋值

SET var_name = expr [, var_name = expr] ...

DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
SET pname='王';
SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid AND name=pname;

END$$
DELIMITER ;

CALL Pro_Employee(101,@pcount);

  SELECT @pcount;

必嬴56net 1

 2.因而赋值定义变量

DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
SET pname='王';
SET @ID=1;
SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid AND name=pname;
SELECT @ID;

END$$
DELIMITER ;

CALL Pro_Employee(101,@pcount);

必嬴56net 2

2.在相符重新条件的笔录中,把主键大于最小主键的笔录整个删掉就可以。

 

SELECT ... INTO语句赋值

 通过select into语句能够将值付与变量,也得以之间将该值赋值存款和储蓄进度的out参数,下面的积累进程select into正是里面将值给与out参数。

DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
DECLARE Pid INT;
SELECT COUNT(id) INTO Pid FROM Employee WHERE depid=pdepid AND name=pname;
SELECT Pid;

END$$
DELIMITER ;

CALL Pro_Employee(101,@pcount);

以此蕴藏进度就是select into将值给与变量;

 必嬴56net 3

表中并未depid=101 and name='陈'的笔录。 

只要我好似下表,供给删除start_time和end_time都朝气蓬勃律的重复记录。

(1)存款和储蓄进度在劳务器端运转,推行进程快。

条件  

条件的职能经常用在对点名条件的管理,举例大家相遇主键重复报错后该怎么管理。 

概念法则

 定义条件就是事先定义某种错误状态可能sql状态的称谓,然后就足以援用该原则名称开做标准管理,定义准则相符用的可比少,通常会一向放在标准管理之中。

DECLARE condition_name CONDITION FOR condition_value

condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | mysql_error_code

1.尚无概念法规:

DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;

END$$
DELIMITER ;

#执行存储过程
CALL Pro_Employee_insert();

#查询变量值
SELECT @ID,@X;

必嬴56net 4

 报主键重复的不当,个中1062是主键重复的错误代码,23000是sql错误状态

必嬴56net 5

2.定义管理原则

DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
#定义条件名称,
DECLARE reprimary CONDITION FOR 1062;
#引用前面定义的条件名称并做赋值处理
DECLARE EXIT HANDLER FOR reprimary SET @x=1;
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;

END$$
DELIMITER ;

CALL Pro_Employee_insert();

SELECT @ID,@X;

在实行存款和储蓄进度的步骤中并从未报错,可是由于自家定义的是exit,所以在境遇报错sql就终止往下试行了。

必嬴56net 6

接下去看看continue的例外

DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
#定义条件名称,
DECLARE reprimary CONDITION FOR SQLSTATE '23000';
#引用前面定义的条件名称并做赋值处理
DECLARE CONTINUE HANDLER FOR reprimary SET @x=1;
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;

END$$
DELIMITER ;

CALL Pro_Employee_insert();

SELECT @ID,@X;

里头浅灰褐标志的是和地方不一样之处,这里定义准则使用的是SQL状态,也是主键重复的景色;何况这里运用的是CONTINUE正是境遇错误继续往下奉行。

必嬴56net 7

必嬴56net 8

法则管理

条件管理正是里面定义语句的怪诞的拍卖,省去了前方定义准绳名称的手续。

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

handler_type:
    CONTINUE| EXIT| UNDO

condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | mysql_error_code

handler_type:遭遇错误是继续往下进行或然终止,方今UNDO还未有用到。

CONTINUE:继续往下进行

EXIT:终止实施

condition_values:错误状态

SQLSTATE [VALUE] sqlstate_value:正是前边讲到的SQL错误状态,举例主键重复状态SQLSTATE '23000'

condition_name:上面讲到的概念准绳名称;

SQLWA帕杰罗NING:是对具有以01发轫的SQLSTATE代码的笔记,例如:DECLARE CONTINUE HANDLE昂Cora FOMurano SQLWA福特ExplorerNING。

NOT FOUND:是对具有以02伊始的SQLSTATE代码的笔记。

SQLEXCEPTION:是对具有没有被SQLWA奥迪Q5NING或NOT FOUND捕获的SQLSTATE代码的笔记。

mysql_error_code:是错误代码,举个例子主键重复的错误代码是1062,DECLARE CONTINUE HANDLE智跑 FO福睿斯 1062

 

语句:

DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN

#引用前面定义的条件名称并做赋值处理
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @x=2;
#开始事务必须在DECLARE之后
START TRANSACTION ;
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(7,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;

IF @x=2 THEN
  ROLLBACK;
ELSE
  COMMIT;
END IF;  

END$$
DELIMITER ;

#执行存储过程
CALL Pro_Employee_insert();
#查询
SELECT @ID,@X;

必嬴56net 9

经过SELECT @ID,@X能够知晓存款和储蓄进度已经试行到了末了,然而因为存款和储蓄进度前面有做回滚操作整个讲话进行了回滚,所以ID=7的相符条件的记录也被回滚了。

必嬴56net 10

 

总结  

变量的施用不止唯有这一个,在光标中标准也是二个很好的法力,刚才测量试验的是continue借使使用EXIT的语句句施行完“SET @ID=2;”就不往下实行了,后边的IF也不被施行总体语句不会被回滚,可是接收CONTINE当现身谬误后要么会往下进行要是后边的说话还应该有超多的话整个回滚的进程将会非常短,在此能够运用循环,当现身错误立时退出循环试行后边的if回滚操作,在下生龙活虎篇讲循环语句会写到,招待关切。

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

变量和原则,MySQL变量条件 概述 变量在仓库储存进程中会平日被采用,变量的行使方法是多个主要的知识点,非常是在定义准则这块非常重...

那么存款和储蓄进度如下:

(2)存款和储蓄进程进行一遍后,其施行安插就驻留在高速缓冲存款和储蓄器,在未来的操作中,只需从高速缓冲存款和储蓄器中调用已编写翻译好的二进制代码执行,进步了系统品质。

DELIMITER //
DROP PROCEDURE IF EXISTS Del_Dup_FOR_TEST;
CREATE PROCEDURE Del_Dup_FOR_TEST()
BEGIN
DECLARE min_id INT;
DECLARE v_start_time,v_end_time DATETIME;
DECLARE v_count INT;
DECLARE done INT DEFAULT 0;
DECLARE my_cur CURSOR FOR SELECT start_time,end_time,min(id),count(1) AS count FROM leo.test GROUP BY start_time,end_time HAVING count>1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN my_cur;
  myloop: LOOP
  FETCH my_cur INTO v_start_time,v_end_time,min_id,v_count;
  IF done=1 THEN
  LEAVE myloop;
  END IF;
  DELETE FROM leo.test WHERE start_time=v_start_time AND end_time=v_end_time AND id>min_id;
  COMMIT;
  END LOOP myloop;
CLOSE my_cur;
END;
//
DELIMITER ;

 

逻辑很清晰,正是依照重复评定尺度依次删掉重复组中主键大于最小主键的笔录们。

(3)确认保障数据库的安全。使用存款和储蓄进程能够完结具备数据库操作,并可通过编制程序格局调控上述操作对数据库音讯访谈的权力。  www.2cto.com  

而是在编写进度中却遇上八个很恶心的BUG,小编开始的生机勃勃段时代的从头到尾的经过是那般写的:

 

DELIMITER //
DROP PROCEDURE IF EXISTS Del_Dup_FOR_TEST;
CREATE PROCEDURE Del_Dup_FOR_TEST()
BEGIN
DECLARE min_id INT;
DECLARE start_time,end_time DATETIME;
DECLARE count INT;
DECLARE done INT DEFAULT 0;
DECLARE my_cur CURSOR FOR SELECT start_time,end_time,min(id),count(1) AS count FROM leo.test GROUP BY start_time,end_time HAVING count>1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN my_cur;
  myloop: LOOP
  FETCH my_cur INTO start_time,end_time,min_id,count;
  IF done=1 THEN
  LEAVE myloop;
  END IF;
  DELETE FROM leo.test WHERE start_time=start_time AND end_time=end_time AND id>min_id;
  COMMIT;
  END LOOP myloop;
CLOSE my_cur;
END;
//
DELIMITER ;

2.创造存储进程能够动用create procedure语句。

不等的有个别在于变量定义的称谓,即:

 

FETCH INTO的变量名绝不不过您定义CU索罗德SOR时SQL语句查出来的列名大概列别称,也就说你定义的变量名既不可能是表中已经存在的列名,也不可能是你定义游标时用过的外号(如本例中的count),只要多少个规范不相符,FETCH INTO就把全部的变量赋NULL值,这一点你能够品味在FETCH INTO后加一句Select打字与印刷变量名验证。

要在MySQL 5.第11中学成立存款和储蓄进度,必得具有CREATE routine权限。要想查看数据库中有怎么着存储进程,能够行使SHOW PROCEDURE STATUS命令。要翻开有个别存款和储蓄进度的切实音信,可选取SHOWCREATE PROCEDURE sp_name命令,其中sp_name是储存进度的名目。

在询问到这些BUG早前去官方网址页面特意看了一下是还是不是是作者的语法有荒唐: ,确信语法没难题,但尾数第二条商酌呈现恐怕是列名的隐讳BUG,最终一条争辩理论了BUG说法,但不曾章程自身也许基于BUG REPORT做了上述改善,然后效用就管见所及了。

 

有关此BUG的BUG报告页面详见MySQL BUG:#28227 和 BUG:#5967

CREATE PROCEDURE的语法格式:

那么再回头看一下官网文书档案下的最终一条议论,开端自己认为最后一条反驳BUG的评论和介绍完全部是聊天,是哪些傻X说那不是个BUG的?后来留心想了想,他俩都对,这着实也算个BUG,傻X的也是自己。

 

贴一下页面下最后两条商酌(截至2018.08.01):

CREATE PROCEDURE sp_name ([proc_parameter[,...]])

Posted by Brent Roady on May 9, 2012
It should be noted that the local variable names used in FETCH [cursor] INTO must be different than the variable names used in the SELECT statement 
defining the CURSOR. Otherwise the values will be NULL. 
In this example, 
DECLARE a VARCHAR(255);
DECLARE cur1 CURSOR FOR SELECT a FROM table1;
FETCH cur1 INTO a;
the value of a after the FETCH will be NULL.
This is also described here: http://bugs.mysql.com/bug.php?id=28227

Posted by Jérémi Lassausaie on February 3, 2015
Answer for Brent Roady :
I don't see any bug in the bahaviour described.
DECLARE a VARCHAR(255);
/* you declare a variable "a" without a specified default value, a=NULL */
DECLARE cur1 CURSOR FOR 
SELECT a FROM table1;
/* You declare a cursor that selects "a" FROM a table */
OPEN cur1;
/* You execute your cursor query, a warning is raised because a is ambiguously defined but you don't see it */
FETCH cur1 INTO a;
/* you put your unique field in your unique row into a (basically you do "SET a=a;") so a is still NULL */
There is no bug report, just a misunderstanding.

 

Brent蒙受的景观与自己相像,并列出了BUG Report的链接。

   [characteristic ...] routine_body

Jeremi(推测可能是个技师)回答,那是三个眼看的误解,当您注解了变量a(早先值为NULL),然后FETCH INTO a就相当于set a=a,在其他程序语言中那都以无解的。

 

之所以在编写存款和储蓄进度中为定义的变量加个前缀标志是很好的习贯,想起以前Oracle写存款和储蓄进度真的都加v_前缀,SQL Server 都用@前缀,以往轮到mysql却忽视了,确实要求深深记住下。

其中,proc_parameter的参数如下:

 

[ IN | OUT | INOUT ] param_name type

 

characteristic特征如下:

 

  language SQL

 

 | [NOT] DETERMINISTIC

 

 | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

 

 | SQL SECURITY { DEFINER | INVOKER }

 

 | COMMENT 'string'

 

说明:

 

●   sp_name:存款和储蓄进度的称谓,默许在当下数据库中开创。要求在特定数据库中开创存款和储蓄进程时,则要在称呼前边加上数据库的名号,格式为:db_name.sp_name。值得注意的是,那一个称呼应当尽量制止取与MySQL的放置函数雷同的名目,不然会时有爆发错误。

 

 ●   proc_parameter:存款和储蓄进度的参数,param_name为参数名,type为参数的体系,当有七个参数的时候中间用逗号隔开分离。存款和储蓄进度能够有0个、1个或多少个参数。MySQL存款和储蓄过程援救三种档案的次序的参数:输入参数、输出参数和输入/输出参数,关键字分别是IN、OUT和INOUT。输入参数使数据足以传递给叁个积攒进程。当必要重回二个答案或结果的时候,存款和储蓄进度采取输出参数。输入/输出参数既可以够当做输入参数也能够担任输出参数。存款和储蓄进度也得以不加参数,不过名称后边的括号是不可省略的。

 

专一:参数的名字绝不等于列的名字,不然就算不会重回出错新闻,不过存款和储蓄进程中的SQL语句会将参数名看做列名,从而抓住不可预言的结果。

 

characteristic:存款和储蓄进程的一点特点设定,下边豆蔻年华一介绍:

 

language sql:阐明编写那个蕴藏进度的语言为SQL语言,最近来说,MySQL存款和储蓄进程还不可能用外界编制程序语言来编排,也正是说,这几个选项能够不点名。未来将会对其扩张,最有极大概率先个被帮衬的语言是PHP。  www.2cto.com  

deterministic:设置为DETERMINISTIC表示存款和储蓄进度对肖似的输入参数产生相像的结果,设置为NOT DETERMINISTIC则表示会产生不分明的结果。私下认可为NOTDETERMINISTIC。

 

contains SQL:表示存款和储蓄进度不带有读或写多少的讲话。NO SQL表示存款和储蓄进程不含有SQL语句。reads SQL DATA表示存款和储蓄进程富含读数据的话语,但不包涵写多少的语句。modifies SQL DATA表示存款和储蓄进程满含写多少的口舌。假如那么些特点未有显明给定,暗中同意的是CONTAINS SQL。

 

SQL SECU昂科拉ITY:SQL SECUTiguanITY特征能够用来钦命期存款款和储蓄进程使用创设该存款和储蓄进程的客商(DEFINERubicon)的许可来执行,依旧采取调用者(INVOKEENCORE)的许可来实行。默许值是DEFINERAV4。

 

COMMENT 'string':对存储进度的陈诉,string为描述内容。那么些音信方可用SHOWCREATE PROCEDURE语句来展现。

 

●   routine_body:这是储存进度的着器重部分,也称为存款和储蓄进度体。里面包括了在进度调用的时候必需实行的言语,这几个片段总是以begin早前,以end结束。当然,当存款和储蓄进程体中独有四个SQL语句时能够简单BEGIN-END标记。

 

  1.   在初始创造存款和储蓄进程从前,先介绍三个很实用的授命,即delimiter命令。在MySQL中,服务器管理语句的时候是以分部为终结标记的。可是在开创存款和储蓄进程的时候,存款和储蓄进程体中恐怕包括多少个SQL语句,每一种SQL语句都以以分行为终极的,此时服务器管理程序的时候蒙受第三个支行就能够认为程序截止,那必然是特别的。所以那边运用DELIMITE福特Explorer命令将MySQL语句的终止标记更改为其余标记。

 

DELIMITE奇骏语法格式为:DELIMITER $$

 

申明:$$是客商定义的了断符,经常那么些符号能够是少年老成对特别的符号,如四个“#”,三个“¥”、数字、字母等都能够。当使用DELIMITE奥德赛命令时,应该幸免采取反斜杠(“”)字符,因为那是MySQL的转义字符。

 

例:成立存款和储蓄进程,达成的魔法是剔除三个特定学子的新闻。

 

DELIMITER $$

 

CREATE PROCEDURE DELETE_STUDENT(IN XH CHAR(6))

 

BEGIN

 

DELETE FROM XS WHERE 学号=XH;

 

END $$

 

DELIMITER ;

 

表达:当调用这么些蕴藏进度时,MySQL依据提供的参数XH的值,删除对应在XS表中的数据。

 

在根本字BEGIN和END之间钦定了仓库储存进程体,当然,BEGIN-END复合语句仍然为能够嵌套使用。

 

  1.  局地变量

 

在仓库储存进度中可以证明局部变量,它们能够用来储存有的时候结果。要注解局地变量必需使用declare语句。在证明局地变量的还要也可以对其赋一个带头值。

 

DECLARE语法格式:DECLARE var_name[,...] type [DEFAULT value]

 

说明:var_name为变量名;type为变量类型;default子句给变量钦赐一个默许值,如果不内定暗中认可为NULL的话。能够同有的时候候证明多少个类型相像的片段变量,中间用逗号隔断。

 

例: 声圣元个整型变量和多少个字符变量。

 

DECLARE num INT(4);

 

DECLARE str1, str2 VARCHAR(6);

 

declare n char(10) default ‘abcdefg’;

 

证实:局地变量只能在BEGIN…END语句块中表明。

 

局部变量必得在蕴藏进程的开端就宣称,注脚完后,能够在宣称它的BEGIN…END语句块中应用该变量,其余语句块中无法利用它。  www.2cto.com  

 

在蕴藏进度中也足以证明客户变量,不过千万不要将那四个混淆。局地变量和顾客变量的不一样在于:局地变量前边未有利用@符号,局地变量在其所在的BEGIN…END语句块管理完后就销声敛迹了,而顾客变量存在于全体会话在那之中。

 

  1.  使用SET语句赋值

 

要给一些变量赋值能够采纳SET语句,SET语句也是SQL本身的一片段。语法格式为:SET  var_name = expr [,var_name = expr] ...

 

例: 在积攒进度中给一些变量赋值。

 

SET num=1, str1= 'hello';

 

表明:与证明顾客变量时差异,这里的变量名前边未有@符号。注意,例中的那条语句不可能单独施行,只好在蕴藏进程和存储函数中选拔。

 

  1. SELECT...INTO语句(重点)

 

采取这一个SELECT…INTO语法可以把选定的列值直接存款和储蓄到变量中。因而,再次来到的结果不能不有意气风发行。语法格式为:

 

SELECT col_name[,...] INTO var_name[,...]  table_expr

 

说明:col_name是列名,var_name是要赋值的变量名。table_expr是SELECT语句中的FROM子句及末端的局地,这里不再陈说。

 

例: 在蕴藏进度体育高师长XS表中的学号为081101的学子姓名和职业名的值分别赋给变量name和project。

 

SELECT 姓名,专业名 INTO name, project

 

   FROMXS;  WHERE 学号= '081101';

 

  1.  流程序调节制语句

 

在MySQL中,视若无睹的进程式SQL语句能够用在多个存款和储蓄进程体中。举例:IF语句、CASE语句、LOOP语句、WHILE语句、iterate语句和LEAVE语句。

 

(1)IF语句

 

IF-THEN-ELSE语句可依赖不一致的标准实行不一致的操作。

 

语法格式为:

 

IF 推断的规范THEN 一个或八个SQL语句

 

[ELSEIF判定的尺度THEN贰个或多少个SQL语句] ...

 

[ELSE三个或多少个SQL语句]

 

END IF

 

证实:当判断标准为真时,就施行相应的SQL语句。

 

IF语句不一致于系统的松开函数IF()函数,IF()函数只好判定两种景况,所以请不要混淆。

 

例: 创造XSCJ数据库的贮存进程,推断多少个输入的参数哪二个更加大。

 

DELIMITER $$  www.2cto.com  

 

CREATE PROCEDURE XSCJ.COMPAR

 

(IN K1INTEGER, IN K2 INTEGER, OUT K3 CHAR(6) )

 

BEGIN

 

IFK1>K2 THEN

 

    SET K3= '大于';

 

ELSEIFK1=K2 THEN

 

    SET K3= '等于';

 

ELSE

 

    SET K3= '小于';

 

ENDIF;

 

END$$

 

DELIMITER ;

 

证实:存储进程中K1和K2是输入参数,K3是出口参数。

 

(2)CASE语句

 

前边早已介绍过了,这里介绍CASE语句在仓库储存进度中的用法,与事先略有区别。语法格式为:

 

CASE case_value

 

   WHEN when_value THEN statement_list

 

   [WHEN when_value THEN statement_list] ...

 

   [ELSE statement_list]

 

END CASE

 

或者:

 

CASE

 

   WHEN search_condition THEN statement_list

 

   [WHEN search_condition THEN statement_list] ...

 

   [ELSE statement_list]  www.2cto.com  

 

END CASE

 

证实:三个CASE语句日常可以充作三个IF-THEN-ELSE语句。

 

首先种格式中case_value是要被判别的值或表明式,接下去是生龙活虎连串的WHEN-THEN块,每一块的when_value参数钦定要与case_value比较的值,假若为真,就实行statement_list中的SQL语句。假设前方的每贰个块都不相称就能够实施ELSE块钦赐的言辞。CASE语句最终以END CASE甘休。

 

其次种格式中CASE关键字背后没有参数,在WHEN-THEN块中,search_condition内定了四个比较表达式,表明式为真时实行THEN前面包车型地铁讲话。与第风华正茂种格式比较,这种格式能够完毕特别复杂的尺码剖断,使用起来更实惠。

 

例: 创立一个积存进程,针对参数的例外,再次回到不相同的结果。

 

编辑:数据库 本文来源:必嬴56netMySQL 变量和准星,MySQL变量条件

关键词: