[关闭]
@a5635268 2017-08-29T09:59:44.000000Z 字数 5180 阅读 1134

【mysql的编程专题①】流程控制与其他语法

Mysql


流程控制与内置函数,一般用在select的field字段上,或者用在函数,存储过程,触发器中;
如果用在select上就会随着query出来的row来隐式迭代;

注释与语句结束符

语句结束符

默认有两个:;\g(只能在命令行中使用)
可以使用delimiter 命令来修改语句结束符,例如: delimiter $$(注意,一般手工修改结束符后再手工改回原来默认值 ;)

注释

行注释: #--[空格]
块注释: /* */

变量的定义与输出

定义变量

MySQL中可以使用DECLARE关键字来定义变量。定义变量的基本语法如下:

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

在过程中定义的变量并不是真正的定义,你只是在BEGIN/END(即复合语句)块内定义了而已。注意这些变量和会话变量不一样,不能使用修饰符@你必须清楚的在BEGIN/END块中声明变量和它们的类型。变量一旦声明,你就能在任何能使用会话变量、文字、列名的地方使用。还需要注意的一点是,在一个块内,我们需要把所有要使用的变量先声明,才能在后面使用,并且不能在声明变量的语句间夹杂其他使用变量的语句,否会报语法错误。

  1. CREATE PROCEDURE P5()
  2. BEGIN
  3. DECLARE a INT;
  4. DECLARE b INT;
  5. SET a = 5;
  6. SET b = 5;
  7. INSERT INTO t VALUES(a);
  8. SELECT s1 FROM t WHERE s1>= b;
  9. END;
  10. -------------------------------------------------
  11. mysql> CALL p5();
  12. +----+
  13. | s1 |
  14. +----+
  15. | 5 |
  16. | 5 |
  17. +----+
  18. 2 rows in set
  19. Query OK, 0 rows affected

MySQL中可以使用SET关键字来为变量赋值。SET语句的基本语法如下:

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

MySQL中还可以使用SELECT…INTO语句为变量赋值。其基本语法如下:

  1. SELECT col_name[,…] INTO var_name[,…]
  2. FROM table_name WEHRE condition

其中,col_name参数表示查询的字段名称;var_name参数是变量的名称;table_name参数指表的名称;condition参数指查询条件。

  1. -- 查看系统变量 show variables [like pattern]
  2. show variables like "innodb%";
  3. -- set 变量名=变量值; 注意:为了区分用户自定义变量和系统变量,需要在用户自定义变量名称前加@符号。例如 set @name=’John’;
  4. -- 如果在存储过程或者函数中用DECLARE来预先定义了某个变量,后面的set可以不用加@,详见后文例子;
  5. set @userTotel = (select count(*) from users); -- Set赋值用法的变量值也可是标量查询的结果
  6. -- select 字段 from 表名 into @变量名
  7. select nickname from users ORDER BY user_money desc limit 1 into @richName;
  8. SELECT id,data INTO x,y FROM test.t1 LIMIT 1; -- 这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回
  9. -- select @变量名:=变量值 select @变量名=变量值
  10. set @who = 'zhouzhou';
  11. select @who='小李'; -- 注意:此处不是赋值操作,而是变量的判断,如果@who变量是已经存在了,那就判断@who中的值是否等于'小李',返回01;如果@who的变量不存在就返回NULL;

注意

输出变量

  1. select @who;

分支语句

IF

语法

  1. IF search_condition THEN statement_list
  2. [ELSEIF search_condition THEN statement_list] ...
  3. [ELSE statement_list]
  4. END IF;

statement_list: 多条语句由;号隔开

实例

  1. delimiter $
  2. CREATE PROCEDURE `hd`(IN `arg` TINYINT)
  3. BEGIN
  4. DECLARE `age` TINYINT DEFAULT 0;
  5. SET `age` = `arg`;
  6. IF `age`<20 THEN
  7. SELECT "年轻人";
  8. ELSEIF `age`<40 THEN
  9. SELECT "青年人";
  10. ELSELF
  11. SELECT "OLD MAN";
  12. END IF;
  13. END$
  1. create procedure proc_getGrade
  2. (stu_no varchar(20),cour_no varchar(10))
  3. begin
  4. declare stu_grade float;
  5. select grade into stu_grade from grade where student_no=stu_no and course_no=cour_no;
  6. if stu_grade>=90 then
  7. select stu_grade,'a';
  8. elseif stu_grade<90 and stu_grade>=80 then
  9. select stu_grade,'b';
  10. elseif stu_grade<80 and stu_grade>=70 then
  11. select stu_grade,'c';
  12. elseif stu_grade<70 and stu_grade>=60 then
  13. select stu_grade,'d';
  14. else
  15. select stu_grade,'e';
  16. end if;
  17. end

三元表达式

  1. SELECT IF(@a=1,'真','失败');

IFNULL(字段,值)

  1. select age,ifnull(age,"空") from c; -- 如果age的值为null就返回空;

NULLIF(expr1,expr2)

  1. -- 如果表达式1=表达式2,则返回null,否则返回第1个表达式
  2. SELECT NULLIF(5,5); -- null
  3. SELECT NULLIF(10,4); -- 10

case

case有两种语法,下面这种语法的case_value必须是整数值

  1. CASE case_value
  2. WHEN when_value THEN statement_list
  3. [WHEN when_value THEN statement_list] ...
  4. [ELSE statement_list]
  5. END CASE
  6. 或者
  7. CASE
  8. WHEN search_condition THEN statement_list
  9. [WHEN search_condition THEN statement_list] ...
  10. [ELSE statement_list]
  11. END CASE

Example1

  1. delimiter $
  2. CREATE PROCEDURE `pro2`(INOUT `arg` INT)
  3. BEGIN
  4. DECLARE `i` INT DEFAULT 0;
  5. SET `i` = `arg`;
  6. CASE `i`
  7. WHEN 1 THEN
  8. SELECT "sina";
  9. WHEN 2 THEN
  10. SELECT "baidu";
  11. ELSE
  12. SELECT "163";
  13. END CASE;
  14. END;
  15. $
  16. delimiter ;

Example2

  1. delimiter $
  2. CREATE PROCEDURE `pro3`(INOUT `arg` INT)
  3. BEGIN
  4. DECLARE `i` INT DEFAULT 0;
  5. SET `i` = `arg`;
  6. CASE
  7. WHEN i = 1 THEN
  8. SELECT "sina";
  9. WHEN i = 2 THEN
  10. SELECT "baidu";
  11. ELSE
  12. SELECT "163";
  13. END CASE;
  14. END;
  15. $
  16. delimiter ;

循环

leave

退出循环

  1. LEAVE label -- 退出循环,注意如果要使用leave的话,循环就必须得带上leave;

while

  1. [begin_label:] WHILE search_condition DO
  2. statement_list
  3. END WHILE [end_label]

Example1

  1. delimiter $
  2. CREATE PROCEDURE `createstu`(IN `num` INT)
  3. BEGIN
  4. DECLARE `i` INT DEFAULT 0;
  5. DECLARE `yeard` DATE;
  6. WHILE `num`>0 DO
  7. SET `yeard` = DATE_SUB("2000-1-1",INTERVAL `i` DAY);
  8. INSERT INTO `test` (`sname`,`birthday`) VALUES(MD5(`i`),`yeard`);
  9. SET `i`=`i`+1;
  10. SET `num`=`num`-1;
  11. END WHILE;
  12. END$

loop

  1. [begin_label:] LOOP
  2. statement_list
  3. END LOOP [end_label]

Example1

  1. delimiter $
  2. create procedure t_loop()
  3. begin
  4. declare i int;
  5. set i = 0;
  6. loop_label:loop
  7. insert into test(sname,birthday) values(md5(i),2005);
  8. set i = i + 1;
  9. if i > 100 then
  10. leave loop_label; -- 注意这里的label是必须的哦;
  11. end if;
  12. end loop;
  13. end$
  14. delimiter ;

loop是在执行后检查结果,while是在执行前检查结果

repeat

  1. [begin_label:] REPEAT
  2. statement_list
  3. UNTIL search_condition -- REPEAT语句内的语句或语句群被重复,直至search_condition 为真。
  4. END REPEAT [end_label]

Example1

  1. delimiter $
  2. create procedure t_repeat()
  3. begin
  4. declare i int;
  5. set i = 100;
  6. repeat
  7. insert into test(sname,birthday) values(md5(i),1988);
  8. set i = i + 5;
  9. until i > 10000 -- 注意until此处没有分号,是为和下面的end链接一起的;
  10. end repeat;
  11. end;$

其他

INSERT INTO SELECT

语法

  1. Insert into Table2(field1,field2,...) select value1,value2,... from Table1

要求目标表Table2**必须存在**,如果目标table2已经存在了,并且和table1的结构一样的话,可以直接 Insert into Table2 select * from Table1,如果结构不一样,就要Table2的字段对应Table1的字段

SELECT INTO FROM

语法

  1. SELECT vale1, value2 into Table2 from Table1
  1. 要求目标表Table2**不存在**,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。
  2. 注意: MySQL不支持Sybase SQL扩展:SELECT ... INTO TABLE ....。只支持select 字段 from 表名 into @变量名

replace into

  1. replace into table (id,name) values('1','aa'),('2','bb') -- 此语句的作用是向表table中插入两条记录。如果主键id12不存在就相当于insert into table (id,name) values('1','aa'),('2','bb') ,如果存在相同的值则不会插入数据

create...select

  1. -- 创建表并插入它表的数据进来;
  2. CREATE TABLE tdb_goods_brands (
  3. brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  4. brand_name VARCHAR (40) NOT NULL
  5. ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT = '用户信息表' SELECT
  6. brand_name
  7. FROM
  8. tdb_goods
  9. GROUP BY
  10. brand_name;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注