1 代码执行结构

  • 代码执行结构有三种:顺序结构、分支结构和循环结构。

1.1 分支结构

  • 分支结构:实现准备多个代码块,按照条件选择性执行某段代码。
  • 在MySQL中只有if分支。
  • 基本语法
if  条件判断  then
 -- 满足条件要执行的代码
else if
-- 不满足条件要执行的代码
else
-- 不满足条件要执行的代码
end if; 
  • 触发器结合if分支:判断商品库存是否足够,不够不能生成订单。
-- 触发器结合if分支,判断商品库存是否足够,不够不能生成订单
DELIMITER $$
CREATE TRIGGER insert_before BEFORE INSERT ON `ORDER` FOR EACH ROW
BEGIN
    -- 判断商品库存是否足够

    -- 获取商品库存:商品库存在表中
    SELECT inv  FROM goods WHERE id = new.g_id INTO @inv;    

    -- 比较kuc

    IF @inv < new.g_number THEN -- 库存不够
        -- 触发器没有提供一个能够阻止事件发生的能力,只能暴力报错
        INSERT INTO xxx VALUES(xxx);

    END IF;

END
$$
DELIMITER ;

1.2 循环结构

  • 循环结构:某段代码在指定条件下执行。
  • while循环
while  条件判断 do
  -- 满足条件要执行的代码
  -- 变更循环条件
end while;
循环控制:在循环内部进行循环判断和控制
MySQL中没有对应的continue和break;
iterate:类似于continue
leave:类似于break
iterate和leave的使用方式: iterate/leave 循环名字;
-- 定义循环名字
循环名字:while  条件  do
    -- 循环体
    -- 循环控制
end while;

2 函数

  • 函数:将一段代码块封装到一个结构中,在需要执行代码块的时候,调用结构执行即可(代码复用)。
  • 函数分为两类:系统函数和自定义函数。

2.1 系统函数

  • 系统定义好的函数,直接调用即可。
  • 任何函数都有返回值,因此函数的调用都是通过select调用。
  • substring(str,offset,len):从offset(MySQL中的自妇产的下标是从1)开始,截取长度是len。
SET @cn = '世界你好';
SET @en = "hello world";

-- 字符串截取
,),,);

  • char_length:字符长度
  • length:字节长度
SET @cn = '世界你好';
SET @en = "hello world";

-- 字符串长度
SELECT CHAR_LENGTH(@cn),CHAR_LENGTH(@en),LENGTH(@cn),LENGTH(@en);

  • instr:判断字符串是否在某个字符串中存在,存在,返回位置;失败,返回0。
SET @cn = '世界你好';
SET @en = "hello world";

SELECT INSTR(@cn,'你');

SELECT INSTR(@cn,'哈哈');

  • Lpad:左填充,将字符串按照某个指定的填充方式,填充到指定长度。
SET @cn = '世界你好';
SET @en = "hello world";

,'呵呵');

  • strcmp:compare,字符串比较,小,就返回-1;相等,就返回0;大,就返回1。
SET @a = 'hello';
SET @b = 'hei';
SET @c = 'HEI';

SELECT STRCMP(@a,@b),STRCMP(@b,@c),STRCMP(@c,@a);

2.2 自定义函数

  • 函数要素:函数名,参数列表,返回值,函数体(作用域)。
  • 创建函数
-- 创建函数

CREATE FUNCTION 函数名([形参列表]) RETURNS 数据类型
BEGIN
    -- 函数体
    -- 返回值
    RETURN 返回值(指定数据类型);
END;
DELIMITER $$
CREATE  FUNCTION dis() RETURNS INT
BEGIN
    ;
END
$$
DELIMITER ;
  • 自定义函数和系统函数调用方式是一样的。
SELECT dis();

2.3 查看函数

  • 查看所有函数:
show function status [like 'pattern'];

  • 查看创建函数语句

2.4 修改函数&删除函数

  • 函数不可以修改,只能先删除,再新增函数。
  • 删除函数的基本语句
drop function 函数名;

2.5 函数参数

  • 函数分为两种:定义的参数叫形参,调用时的参数叫实参。
  • 形参:必须指定数据类型
DELIMITER $$
CREATE FUNCTION 函数名 (形参名字 数据类型) RETURNS 数据类型
BEGIN
   -- 函数体
   -- 返回值

   RETURN 返回值;
END;
$$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION res (num INT) RETURNS INT
BEGIN
    ;
    ;
    WHILE @i <= num DO
    SET @sum = @sum + @i;
    ;
    END WHILE;

    RETURN @sum;

END;
$$
DELIMITER ;
);

  • 在函数内部定义的@变量在函数外部也可以使用。

2.6 函数的作用域

  • MySQL中的作用域与js中的作用域完全一样。

    • 全局变量可以在任何地方使用;局部变量只能在函数内部使用。  
  • 全局变量:使用set关键字定义,使用@符号定义。
  • 局部变量:使用declare关键字声明,没有@符号,所有的局部变量的声明,必须在函数体开始之前。
DELIMITER $$
CREATE FUNCTION res (num INT) RETURNS INT
BEGIN
    ;
    ;
    WHILE i <= num DO
    SET SUM = SUM +i;
    ;
    END WHILE;

    RETURN SUM;

END;
$$
DELIMITER ;

3 存储过程

  • 存储过程:简称过程,procedure,是一种用来处理数据的方式。
  • 存储过程是一个没有返回值的函数。

3.1 创建存储过程

  • 基本语法
DELIMITER $$
CREATE PROCEDURE 过程名字([参数列表])
BEGIN
 -- 过程体

END
$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE proe()
BEGIN
 -- 过程体
  SELECT * FROM my_account;
END
$$
DELIMITER ;

3.2  查看存储过程

  • 函数的查看方式完全使用与存储过程。
  • 查看所有的存储过程。

    • show procedure status [like 'pattern'];  
SHOW PROCEDURE STATUS;

  • 查看创建过程语句

    • show create procedure 存储过程名字;    

3.3 调用过程

  • 因为存储过程是没有返回值的,所以不能使用select关键字。
  • 调用存储过程,使用call关键字。
call 存储过程的名字;
CALL proe();

3.4 修改过程&删除过程

  • 存储过程不可以修改,只能先删除,再新增存储过后才能。
  • 删除存储过程
drop 存储过程的名字;

3.5 存储过程参数类型

  • 函数的参数需要数据类型指定,过程比函数更严格。
  • 过程还有自己的类型限定:三种类型

    • ① in:数据从外部传入给内部使用(值传递):可以是数值也可以是变量
    • ②out:只允许过程内部使用(不用外部数据),给外部使用的(引用传递,外部的数据会被先清空才进入内部),只能是变量。
    • ③inout:外部的可以在内部使用,内部修改也可以给外部使用,典型的引用传递,只能传递变量。  
  • 基本语法
DELIMITER $$
CREATE PROCEDURE 过程名 (IN 形参名称 数据类型,OUT 形参名称 数据类型,INOUT 形参名称 数据类型)
BEGIN
    -- 过程体
END;
$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE pro1 (IN int_1 INT,OUT int_2 INT,INOUT int_3 INT)
BEGIN
    -- 过程体
    SELECT INT_1,INT_2,INT_3;
END;
$$
DELIMITER ;
  • 调用:out和inout类型的参数必须传入变量,而不是是数值。
;
;
 ;
SELECT @int_1,@int_2,@int_3;
CALL pro1(@int_1,@int_2,@int_3);
SELECT @int_1,@int_2,@int_3;

MySQL (九)的更多相关文章

  1. mysql九大类常用函数

    一.数学函数 ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e(自然对数的底)的x次方 ...

  2. MySQL九读书笔记 字符串模式匹配

    当我们使用查询,条件常常会遇到模糊查询.的模糊查询相关的字符串模式匹配. 这里,主要约两:标准SQL模式匹配.扩展正则表达式模式匹配.     一.标准的SQL模式匹配 SQL的模式匹配同意你使用&q ...

  3. Mysql(九):Python连接MySQL数据库之pymysql模块使用

    Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服 ...

  4. 安装MySQL总结

    由于MySQL的版本不同,所以会有不同的安装方式.在下以Linux系统下MySQL5.1.19版本为例,进行安装,初学还望指正. 一.安装编译软件(简单的yum安装) gcc gcc-c++ ncur ...

  5. phpstudy升级mysql数据库

    因为MySQL支持全文索引的只有5.6以上,而我下的phpstudy只有5.5的版本,在导入数据库的时候因为该数据库的表内有使用全文索引,因此必须升级phpstudy的mysql版本,这里就把自己当升 ...

  6. Mysql第一周

    前言:好久不见,我又来写博客拉.上个月只写了几篇django-rest-framework的,而且还是根据官网的英文写的.干货不多,内心还是有点羞耻的…… 简单说下我11月去干嘛了.11月初美图给我发 ...

  7. Linux安装mysql(Redhat6.5+MySQL5.7)(转载+原创补漏)

    一.下载 这里我创建了一目录software用于存放我们待会要下载的mysql包,先去到该目录 命令:cd /software命令:wget http://mirrors.sohu.com/mysql ...

  8. centos7下使用mysql离线安装包安装mysql5.7

    服务器环境: centos7 x64 需要安装mysql5.7+ 一.卸载CentOS7系统自带mariadb # 查看系统自带的Mariadb [root@CDH-141 ~]# rpm -qa|g ...

  9. MySql安装和基本管理

    一.什么是数据库? mysql就是一个基于socket编写的C/S架构的软件 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流 ...

  10. linux安装mysql全纪录[包括yum和rpm安装,编码,远程连接以及大小写问题]

    linux安装mysql全纪录[包括yum和rpm安装,编码,远程连接以及大小写问题] 一.查看mysql是否已经安装 使用“whereis mysql”命令来查看mysql安装路径: [root@h ...

随机推荐

  1. Ambari安装之安装并配置Ambari-server(三)

    前期博客  Ambari安装之部署本地库(镜像服务器)(二) 安装并配置Ambari-server (1)检查仓库是否可用 [hadoop@ambari01 yum.repos.d]$ pwd /et ...

  2. [luogu P3797] 妖梦斩木棒 [线段树]

    题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...

  3. sqlserver的触发器练习实例

    触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发生了,就会做一些工作. 下面直接上干货,创建insert触发器.delete触发器.DDL触发器和如何查看触发器定义 1.创建三个表学 ...

  4. vue2中component父子组件传递数据props的使用

    子组件使用父亲传过来的数据,我们需要通过子组件的 props 选项. 组件实例的作用域是孤立的,不能在子组件的模板内直接引用父组件的数据.修改父亲传过来的props数据的时候 父亲必须传递对象,否则不 ...

  5. Android源码博文集锦4

    Android精选源码 一款常见的自定义加载动画 android开源记账项目CoCoin Android自定义view:拖拽选择按钮 Android指纹识别 一个折线图,它提供了几个非常实用的功能 一 ...

  6. tensorflow官方文档中的sub 和mul中的函数已经在API中改名了

    在照着tensorflow 官方文档和极客学院中tensorflow中文文档学习tensorflow时,遇到下面的两个问题: 1)AttributeError: module 'tensorflow' ...

  7. C#中的数据类型转换

    数据类型在一定的条件下是可以相互转换的,如将int型数据转换成double型数据.C#允许使用两种转换方式:隐式转换和显式转换. 1.隐式转换 隐式转换:从类型A到类型B的转换可以在所有情况下进行,执 ...

  8. Android学习笔记-ImageView(图像视图)

    本节引言: 本节介绍的UI基础控件是:ImageView(图像视图),见名知意,就是用来显示图像的一个View或者说控件! 官方API:ImageView;本节讲解的内容如下: ImageView的s ...

  9. jsp 之 解决 Mysql net start mysql启动,提示发生系统错误 5 拒绝访问的问题

    在dos下运行net start mysql时 !!!提示发生系统错误 5:拒绝访问!只要切换到管理员模式就可以启动了. 所以我们要以管理员身份来运行cmd程序来启动mysql. 1.在开始菜单的搜索 ...

  10. 一步一步学习Vue(十一)

    本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var ...