mysql的sql编程
                        
                            时间:2021-07-01 10:21:17
                            帮助过:7人阅读
							                        
                     
                    
                    
                     trigger after_order 
  after insert 
  on my_order
  for each row
begin
  update my_goods 
  set 
    inv = (inv 
- new.g_number) 
  where 
    id = new.g_id; 
end;
insert into my_order 
values(
null , 
1 , 
2);
select * from my_goods;
select * from my_order;
-- 这个时候会发现另一个问题,就是触发器如果删除得成负数,那是有问题的。
-- 触发器结合if分支,判断商品库存是否足够,不够不能生成订单
create trigger before_order
  before insert 
  on my_order
  for each row
begin
  select inv 
from my_goods 
where id 
= new.g_id 
into @inv;
  if 
    @inv < new.g_number 
  then
    -- 库存不够,触发器没有提供一个阻止语句执行的方法,所以报错暴力终止
    insert into xxx 
values(xxx);
  end if;
end;
insert into my_order 
values(
null , 
1 , 
3);
-- 系统函数
-- 定义两个变量
set @cn = ‘世界你好‘;
set @en = ‘hello world‘;
select substring(
@cn,
1,
1),
substring(
@en,
1,
1); 
-- 世 h ,字符串下表从1开始,以字节为单位
select char_length(
@cn),char_length(
@en),length(
@cn),length(
@en); 
-- 4 ,11 , 12 ,11 我的是utf-8编码
select instr(
‘hello‘,
‘he‘),instr(
‘hello‘,
‘s‘); 
-- 1 , 0
select lpad(
@cn , 
20, 
‘欢迎‘),lpad(
@en , 
20 , 
‘hello‘);
select insert(
‘hello world‘ , 
3 , 
3 ,
‘y‘); 
-- key world
set @fi = ‘hello‘;
set @se = ‘key‘;
set @th = ‘KEY‘;
SELECT strcmp(
@fi , 
@se), strcmp(
@se , 
@th), strcmp(
@th , 
@fi); 
-- -1, 0 , 1 字符串不区分大小写在SQL中
-- 自定义函数
create function cs() 
returns varchar(
50)
begin
  return "hello world";
end;
-- 调用函数
select cs();
-- 查看函数 【like pattern】  -- 函数从属于数据库
show 
function status 
like ‘cs‘;
-- 查看函数的创建语句
show 
create function cs;
-- 修改函数 & 删除函数
 -- 函数只能先删除后新增,不能修改
 drop function cs;
-- 做函数,计算1~n的累加
create function add1(n 
int) 
returns int
begin
  set @i = 1;
  set @res = 0;
  while @i <= n do
    set @res = @res + @i;
    set @i = @i + 1;
  end while;
  return @res;
end;
select add1(
3);
-- 在函数内部定义的变量在函数外部也可以访问
select @res;
-- 求和,1~n之间的数之和,5的倍数不加
create function add2(n 
int) 
returns int
begin
  declare i 
int default 1;
  declare res 
int default 0;
  w1: while i 
<= n do
    if i
%5 = 0 then
      set i 
= i 
+ 1;
      iterate w1;
    else
      set res 
= res 
+ i ;
      set i 
= i 
+ 1;
    end if;
  end while;
  return res;
end;
select add2(
5);
-- 创建存储过程
create procedure p1()
begin
  select * from my_goods; 
-- 假设过程中需要显示数据,使用select
end;
-- 调用过程
call p1();
-- 查看过程
show 
procedure status 
like ‘p1‘;
-- 查看过程创建语句
show 
create procedure p1;
-- 过程参数
create procedure p2(
in var1 
int , out var2 
int , inout var3 
int)
begin
  select var1,var2,var3; 
-- var2的值一定是null,进入过程前会清除值
end;
-- call p2(1,2,3); in和inout参数只能传递变量而不能是值
set @int_1 = 1;
set @int_2 = 2;
set @int_3 = 3;
select @int_1,
@int_2,
@int_3; 
-- 1,2,3
call p2(
@int_1,
@int_2,
@int_3); 
-- 1, null, 3
select @int_1,
@int_2,
@int_3; 
-- 1, null , 3  
-- out 和inout属于引用数据类型:内部修改会影响外部
-- 存储过程执行结束后,mysql将传入的引用变量修改后的值返回给实参。
 
mysql的sql编程
标签:模糊匹配   语句   ble   存在   bst   字符   variable   triggers   事务