SQL编程语法

声明变量:

语法:declare var_name[,…] type [default value]
说明:这个语句被用来声明局部变量。要给变量提供一个默认值,需要包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null。局部变量的作用范围在它被声明的begin … end块内。它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。
ex:

declare a int default 0;
declare b int default 1;
declare c,d int;
变量赋值
  • set语句:
    语法:set var_name = expr [, var_name = expr] …
    说明:也可以用语句代替set来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非set语句中=被视为一个比较 操作符
    ex:
set @a=0,@b=0,@c=0;
或
select @a:=1,@b:=2,@c:=3; 

ps:对于使用select语句为变量赋值的情况,若返回结果为空,即没有记录,此时变量的值为上一次变量赋值时的值,如果没有对变量赋过值,则为null。

  • select… into语句
    语法:select col_name[,…] into var_name[,…] table_expr
    说明:这个select语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。
    ex:
select id,name into x,y from user limit 1;
begin…end复合语句

语法:
[begin_label:] begin
[statement_list]
end [end_label]
说明:存储子程序可以使用begin… end复合语句来包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。 复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的
ex:

\\ begin
    declare a int default 1;
    declare b int default 4;
    declare c int;
    if a+b == 5 then
        c = a+b;
    end if;
  end//
流程控制结构
  • if语句
    语法:
    if search_condition then
    statement_list
    [else if search_condition then
    statement_list] …
    [else statement_list]
    end if
    说明:statement_list可以包括一个或多个语句。
    ex:
delimiter //
create procedure test(in inparameter int)
begin
      declare a int;
      set a = inparameter + 1;
      if a = 0 then
         .......;
      end if;
      if inparameter = 0 then
          .......;
      else
          .......;
     end if;
end; //
delimiter ;
  • 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]
    end case
    ex:
create procedure test2 (in parameter1 int)
begin
     declare a int;
     set a = parameter1 + 1;
     case a
          when 0 then insert into  t values(166);
          when 1 then insert into t values(158);
          else insert into t values(198);
     end case;
end; 
  • 循环语句
    语法:
    while… end while
    loop… end loop
    repeat… end repeat
    说明:在循环中还穿插一些循环控制语句,如leave(类似Java语言的break)、iterate(类似java语言的continue)等。
    leave语句
    leave label 这个语句被用来退出任何被标注的流程控制构造。它和begin… end或循环一起被使用。
    iterate语句
    iterate label iterate只可以出现在loop, repeat, 和while语句内。iterate意思为:再次循环。
    ps:iterate 跟Java语言中的迭代器不同含义
    while… end while ex:
create procedure test3 ()
begin
     declare a int;
     set a = 0;
     while a < 5 do
           set a = a + 1;
      end while;
end; 

loop … end loop ex:

create procedure test4 ()
begin
     declare a int;
     set a = 0;
     loop_label: loop
         set a = a + 1;
         if a >= 5 then
             leave loop_label;
         end if;
    end loop;
end; 

ps:loop允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直到循环被退出,退出通常伴随着一个leave 语句。
repeat … end repeat ex:

create procedure test5 ()
begin
     declare a int;
     set a = 0;
     repeat
          set a = a + 1;
     until a >= 5 end repeat;
end; 

迭代(ITERATE)语句ex:

create procedure test6 ()
begin
     declare a int;
     set a = 0;
     loop_label: loop
         if a = 3 then
             set a = a + 1;
             iterate loop_label;
         end if;
         set a = a + 1;
         if a >= 5 then
             leave loop_label;
         end if;
     end loop;
end; 
条件和异常处理程序:

语法:
declare handler_type handle for condition_value[,…] sp_statement
handler_type:
continue | exit | undo
condition_value:
SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION

说明:这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。
对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN…END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。
SQLWARNING是对所有以01开头的SQLSTATE代码的速记。
NOT FOUND是对所有以02开头的SQLSTATE代码的速记。
SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。

声明自定义条件:

语法:declare condition_name condition for condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
ex:

create table test (s1 int,primary key (s1));
delimiter //
create procedure handlerdemo ()
begin
     declare continue handle for SQLSTATE '23000' SET @x = 3; 
     set @x = 1;
     insert into test values(1);
     set @x = 2;
     insert into test values(2);
     set @x = 3;
end;//
delimiter ;
    原文作者:StrongZhao
    原文地址: https://www.jianshu.com/p/fef95a345731
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞