初识mysql

MySQL数据库概述

数据库存储方式

  1. 人工存储
  2. 文件系统阶段
  3. 数据库系统阶段

数据库SQL语言

  • SQL(Structured Query Language) 结构化查询语言,数据库管理系统通过SQL语言来管理数据库中的数据
  • SQL语言分为三个部分:
    • DDL 数据定义语言(definition)
      create table
    • DMl 数据操作语言(manipulation)
      select insert update delect table
    • DCL 数据控制语言(control)
      grant revoke

为什么使用MySQL

开放源代码的数据
mysql的跨平台性
价格优势
功能强大使用方便

MySQL数据类型

整数

tinyint(4)  smallint(6)  mediumint(9)  int(11)  bingint(20)  

浮点数

float  double  decimal(m,d)  m代表总长度 d代表小数点后精确到d位

日期和时间

year 年   
date 日期   
time 时间   格式为:hh:mm:ss
datetime 日期时间  
timestamp 时间(时区),范围小,支持时区  datetime 最通用,year,date,time可以省略一些空间  

字符串

char(m)  指定长度的字符串
varchar(m) 不定长度的字符串
tinytext  
text    文本
mediumtext
longtext

二进制

binary(m)
varbinary(m)
bit(m)
tinyblob
blob    字节类型 适合存图片
mediumblob
longblob

操作数据库

登录 mysql -h localhost -uroot -proot
  • 显示 创建 删除数据库
    show databases;
    create database xxx;
    drop database xxx;
    use db_name 使用某个数据库
    drop 删除数据库
  • 新建用户
    create user name identified by “ssapdrow”
  • 数据库存储引擎
    show variables like “%engine%”

创建数据库

  • create database 数据库名;
    create database day14;

  • 创建数据库时指定字符集
    create database day14 character set gbk;

  • show databases
    查看当前所有数据库
  • use employees
    使用一个数据库

查看服务器上所有的数据库

show databases;

查看创建数据库的代码

show create database 数据库名;
show create database day13; 

修改某个数据库的编码

alter database 数据库名  character set 字符编码  COLLATE 字符集的校验规则;
alter database day13  character set utf8 collate utf8_general_ci;

删除数据库

drop database 数据库名;
drop database day13;

使用某个数据库 (将来建表都放在这个库中)

use 数据库名;
use day13;

操作数据表

创建表

语法

1
2
3
4
5
6
7
8
create table 表名(
属性名 数据类型[完整性约束],
属性名 数据类型[完整性约束],
。。。
属性名 数据类型
);
可以增加主键 和自增长
primary key auto_increment(int类型,主键)
  • 显示当前数据库下所有数据表
    show tables
  • 查看创建表的代码
    show create table 表名;
  • 查看表的字段
    desc 表名 (以列表的形式显示出结果)
  • 完整性约束
    primary key 主键
    foreign key 外键
    not null 不能为空
    unique 唯一索引
    auto_increment 自动增加
    default 默认值

    设置表的主键

  • 单字段主键
    属性名 数据类型 primary key
    stu_id int primary key,
  • 多字段主键
    primary key(属性1,属性2…属性n)

    1
    2
    3
    4
    5
    6
    CREATE TABLE student(
    stu_id INT,
    course_id INT,
    grade FLOAT,
    PRIMARY KEY(stu_id, course_id)
    );
  • 创建表之后添加主键
    alter table 表名 add primary key (列名)

    设置表的外键

  • 在创建表的时候添加

    1
    CONSTRAINT 外键别名 FOREIGN KEY (属性1.1, 属性1.2,…, 属性1.n)  REFERENCES 表名(属性 2.1, 属性2.2,…, 属性2.n)
  • 在创建表之后添加

    1
    alter table 表名 add constarint FK_employee_dept_id foreign key(dept_id) references departement(id)

使用子查询创建表

create table emp1 as 
select * from employees;

设置表的非空约束

属性名 数据类型 not null

设置表的唯一性约束

属性名 数据类型 unique  

设置表的属性值自动增加

属性名 数据类型 AUTO_INCREMENT

设置表的属性的默认值

属性名 数据类型 default 默认值

查询表

查看表基本结构

DESC 表名  

修改表

修改表名

ALTER TABLE 旧表名 RENAME [TO] 新表名; 

字段的数据类型

  1. 修改字段的数据类型 (列)
    alter table 表名 modify 属性名 数据类型;
    alter table user modify name varchar(30);
  2. 增加字段及数据类型 (列)
    alter table 表名 add 属性名1 数据类型 [完整性约束] [first|after 属性2]
  3. 删除字段 (列)
    alter table 表名 drop 属性名;
  4. 改变字段数据类型 (列)
    alter table 表名 change 旧属性名 新属性名 新数据类型
  5. 修改表的字符集
    alter table 表名 character set 字符集编码
  6. 添加一列
    alter table 表名 add 列名 类型
  7. 删除表的外键约束
    alter table 表名 drop foreign key 外键别名;
  8. 删除表
    drop table 表名;
    当需要删除被其他表关联的表时,需要先删除外键然后在删除该表

插入数据

  • 所有字段插入数据
    1、INSERT语句中不指定具体的字段名
    insert into 表名 values (值1,值2…值 n)
    2、INSERT语句中列出所有字段
    insert into 表名 (属性1,属性 2…属性n) values (值1,值2…值n)
  • 插入指定字段
    insert into 表名 (属性1,属性2,属性3) value (值1,值2,值3)
  • 同时插入多条数据
    1
    2
    3
    4
    insert into 表名  
    (属性1,属性2,属性3) values (值1,值2,值3),
    (属性1,属性2,属性3) values (值1,值2,值3),
    (属性1,属性2,属性3) values (值1,值2,值3);

更新数据

update 表名
set 属性1 = 值1,属性2 = 值2,...
where 条件表达式;

删除数据

delete from 表名 [条件表达式];
truncate table 表名 [条件表达式];
  • 区别:
  1. truncate table 删除数据效率更高(先摧毁整个表结构,再重建表)
  2. delete 删除所有记录时,一条一条往后删除
  3. truncate table只能删除所有
  4. delete可以选择性的删除部分记录

数据查询

基本查询语句

select 属性列表         
from 表名和视图列表
[where 条件表达式1]     
[group by 属性名 1 [having 条件表达式2]]
[order dy 属性名2[asc|desc]]
limit 限制查询的个数(分页)

单表查询

  • 查询所有列
    select * from 表名
    
  • 查询指定字段
    select 列名1,列名2 from 表名
  • 查询指定记录
    where 条件表达式
    =,>,<,!组合查询
    [not] between and (不)在…之间
    [not] in 在… 里面
    [not] like %(匹配零个或多个) _(匹配一个)
    is [not] null
    and ,or 条件查询
    select distinct 属性名 去除重复
    order by 属性名 [asc|desc] 排序
    GROUP BY, GROUP_CONTACT()凼数非常好用
    SELECT sex, GROUP_CONTACT(name) FROM employee GROUP BY sex;
    GROUP BY不WITH ROLLUP一起使用,多一行,加统计
    SELECT sex COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;
    LIMIT [刜始位置,] 记录数
  • mysql 中+的作用
    运算符
    如果两个操作数都为数值型,则做加法运算
    如果一方为字符串,将字符串转化为数值型
    • 如果转换成功,则继续做加法运算
    • 如果转换失败,则将字符型数值转化为0

      集合查询

      count(),avg(),max(),min(),sum()

      连接查询

  • 内连接
    select a.*,b.* from a,b where a.xid = b.id
    或者 select a.*,b.* from a inner join b on a.xid = b.xid
  • 外连接
    select 属性名列表 from 表名1 left|right join 表名2 on 表名1.属性1 = 表名2.属性2;

    左外连接 left join 左表全记录,右表符合条件
    右外连接 right join 由表全记录 左表符合条件

    子查询

    把一个查询的结果在另一个查询中使用就叫子查询
  • in or not in
  • exists or not exists (不)存在 子查询返回真假值(true|false)
  • any 任意一个值
  • all 满足所有条件

    合并查询

    select 语句1

    union | union ALL
    

    select 语句2

    union 所有查询结果合并到一起,去掉重复项
    union ALL 简单合并

    为表和字段取别名

    表名 表的别名
    属性名 [as] 属性的别名

    使用正则表达式查询

    属性名 regexp “匹配方式”

    ^ 字符串开始
    $ 字符串结束
    . 任意一个字符 包括回车和换行
    [字符集合] 任意一个字符
    s1|s2|s3 集合中的任意一个

    • 匹配多个
    • 匹配一个或者多个
      字符串{n} 字符串出现的次数为n
      字符串{m,n} 字符串出现至少m次,至多n次

      select * from student where sname regexp ‘ab{1,3}’

函数

  • 算术函数
    abs() 取绝对值
    mod() 取余
    sum()
    avg()
    max()
    min()
    ceil() 向上取整
    floor() 向下取整
    truncate() 截取多少位数字
    round() 四舍五入为指定小数位数
    需要有两个参数  
        * 字段名称  
        * 小数位数
    
  • 字符串函数
    concat() 字符串拼接
    length() 字段长度 汉字三个字符
    char_length() 字段长度 汉字一个字符
    lower() 将字符串中的字符转化为小写
    upper() 将字符串中的字符转化位大写
    replace(字段名,需要替换的字符串,替换字符串对象) 替换函数
    substr(字段名,开始位置,长度) 截取字符串
    instr() 获取指定字符串的下标
    注意:mysql中下标从1开始
  • 日期函数
    now()系统现在的时间
    current_date() 系统当前时间 YYYY:MM:DD
    current_time() 系统当前时间 hh:mm:ss
    current_timestamp() 系统当前时间
    extract() 年月日
    date() 日期
    year() 年份
    month() 月份
    day() 天数
    hour() 小时
    minute() 分钟
    second() 秒
  • 条件判断函数
    if(expr ,v1,v2)
    ifnull(v1,v2)
    如果不是NULL,则返回第一个参数。 否则,IFNULL函数返回第二个参数。
  • 统计函数
    count()计数
    sum()总和
    max()最大值
    min()最小值
    avg()平均值

事物

Transaction Control Language 事务控制语言
事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

  • 事务的特性:
    ACID
  1. 原子性:
    一个事务不可再分割,要么都执行要么都不执行
  2. 一致性:
    一个事务执行会使数据从一个一致状态切换到另外一个一致状态
  3. 隔离性:
    一个事务的执行不受其他事务的干扰
  4. 持久性:
    一个事务一旦提交,则会永久的改变数据库的数据.

事务的创建

隐式事务

事务没有明显的开启和结束的标记
比如insert、update、delete语句
delete from 表 where id =1;

显式事务:

事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit=0;

  1. 开启事务
    set autocommit=0;
    start transaction;可选的
  2. 编写事务中的sql语句(select insert update delete)
    语句1;
    语句2;

  3. 结束事务
    commit;提交事务
    rollback;回滚事务
    savepoint 节点名;设置保存点

  4. 事务的隔离级别:

事物 脏读 不可重复读 幻读
read uncommitted
read committed ×
repeatable read × ×
serializable × × ×

mysql中默认 第三个隔离级别 repeatable read
oracle中默认第二个隔离级别 read committed

  • 查看隔离级别
    select @@tx_isolation;
  • 设置隔离级别
    set session|global transaction isolation level 隔离级别;

案例

  1. 演示事务的使用步骤

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #开启事务
    SET autocommit=0;
    START TRANSACTION;
    #编写一组事务的语句
    UPDATE account SET balance = 1000 WHERE username='张无忌';
    UPDATE account SET balance = 1000 WHERE username='赵敏';

    #结束事务
    ROLLBACK;
    #commit;

    SELECT * FROM account;
  2. 演示事务对于delete和truncate的处理的区别

    1
    2
    3
    4
    5
    SET autocommit=0;  
    START TRANSACTION;

    DELETE FROM account;
    ROLLBACK;
  3. 演示savepoint 的使用

    1
    2
    3
    4
    5
    6
    7
    8
    SET autocommit=0;
    START TRANSACTION;
    DELETE FROM account WHERE id=25;
    SAVEPOINT a;#设置保存点
    DELETE FROM account WHERE id=28;
    ROLLBACK TO a;#回滚到保存点

    SELECT * FROM account;

视图

含义:虚拟表,和普通表一样使用
mysql5.1版本出现的新特性,是通过表动态生成的数据

比如:舞蹈班和普通班级的对比

区别 创建语法的关键字 是否实际占用物理空间 使用
视图 create view 只是保存了sql逻辑 增删改查,只是一般不能增删改
create table 保存了数据 增删改查

创建视图

语法:
create view 视图名
as
查询语句;
  • 例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    创建
    CREATE VIEW myv3
    AS
    SELECT * FROM myv2 ORDER BY ag LIMIT 1;

    使用
    SELECT d.*,m.ag
    FROM myv3 m
    JOIN departments d
    ON m.`department_id`=d.`department_id`;

视图的修改

  1. 方式一:
    1
    2
    3
    create or replace view  视图名
    as
    查询语句;
  • 例子
    1
    2
    3
    4
    5
    6
    7
    SELECT * FROM myv3 

    CREATE OR REPLACE VIEW myv3
    AS
    SELECT AVG(salary),job_id
    FROM employees
    GROUP BY job_id;
  1. 方式二
    1
    2
    3
    4
    语法:
    alter view 视图名
    as
    查询语句;
  • 例子
    1
    2
    3
    ALTER VIEW myv3
    AS
    SELECT * FROM employees;

删除视图

语法:drop view 视图名,视图名,…;
DROP VIEW emp_v1,emp_v2,myv3;

查看视图

DESC myv3;
SHOW CREATE VIEW myv3;

视图的更新

1
2
3
4
5
6
7
8
9
CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary"
FROM employees;

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;
  • 注意
    具备以下特点的视图不允许更新
  1. 包含以下关键字的sql语句:
    分组函数、distinct、group by、having、union或者union all
  2. 常量视图
  3. select中包含子查询
  4. join
  5. from一个不能更新的视图
  6. where子句的子查询引用了from子句中的表

变量

系统变量

变量由系统定义,不是用户定义,属于服务器层面
  1. 查看所有系统变量
    show global | session variables;
  2. 查看满足条件的部分系统变量
    show global | session variables like ‘%char%’;
  3. 查看指定的系统变量的值
    select @@global | session 系统变量名;
  4. 为某个系统变量赋值
    • 方式一
      set gobal | session 系统变量名 = 值
    • 方式二
      set @@global | session 系统变量名=值;

全局变量

全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别
作用域:针对于所有会话(连接)有效,但不能跨重启
  • 查看所有全局变量
    SHOW GLOBAL VARIABLES;
  • 查看满足条件的部分系统变量
    SHOW GLOBAL VARIABLES LIKE ‘%char%’;
  • 查看指定的系统变量的值
    SELECT @@global.autocommit;
  • 为某个系统变量赋值
    1. SET @@global.autocommit=0;
    2. SET GLOBAL autocommit=0;

会话变量

作用域:针对于当前会话(连接)有效
  • 查看所有会话变量
    SHOW SESSION VARIABLES;
  • 查看满足条件的部分会话变量
    SHOW SESSION VARIABLES LIKE ‘%char%’;
  • 查看指定的会话变量的值
    1. SELECT @@autocommit;
    2. SELECT @@session.tx_isolation;
  • 为某个会话变量赋值
    1. SET @@session.tx_isolation=’read-uncommitted’;
    2. SET SESSION tx_isolation=’read-committed’;

自定义变量

变量由用户自定义,而不是系统提供的
使用步骤:
1、声明
2、赋值
3、使用(查看、比较、运算等)

用户变量

作用域:针对于当前会话(连接)有效,作用域同于会话变量

赋值操作符:=或:=

  • 声明并初始化
    SET @变量名=值;
    SET @变量名:=值;
    SELECT @变量名:=值;
  • 赋值(更新变量的值)
  1. 方式一:
    SET @变量名=值;
    SET @变量名:=值;
    SELECT @变量名:=值;
  2. 方式二:
    SELECT 字段 INTO @变量名
    FROM 表;
  3. 使用(查看变量的值)
    SELECT @变量名;

    局部变量

    作用域:仅仅在定义它的begin end块中有效
    应用在 begin end中的第一句话
  • 声明
    DECLARE 变量名 类型;
    DECLARE 变量名 类型 【DEFAULT 值】;
  • 赋值(更新变量的值)
  1. 方式一:
    SET 局部变量名=值;
    SET 局部变量名:=值;
    SELECT 局部变量名:=值;
  2. 方式二:
    SELECT 字段 INTO 具备变量名
    FROM 表;
  3. 使用(查看变量的值)
    SELECT 局部变量名;

案例

  • 案例1:声明两个变量,求和并打印

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #用户变量
    SET @m=1;
    SET @n=1;
    SET @sum=@m+@n;
    SELECT @sum;

    #局部变量
    DECLARE m INT DEFAULT 1;
    DECLARE n INT DEFAULT 1;
    DECLARE SUM INT;
    SET SUM=m+n;
    SELECT SUM;
  • 用户变量和局部变量的对比

名字 作用域 定义位置 语法
用户变量 当前会话 会话的任何地方 加@符号,不用指定类型
局部变量 定义它的BEGIN END中 BEGIN END的第一句话 一般不用加@,需要指定类型

存储过程

存储过程和函数:类似于java中的方法
好处:
1、提高代码的重用性
2、简化操作

存储过程
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

创建存储过程

CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
    存储过程体(一组合法的SQL语句)
END  
  • 注意
  1. 参数列表包含三部分
    参数模式 参数名 参数类型
    eg: in stuname varchar(20)
    参数模式:
    in: 该参数可以作为输入,也可以作为该参数需要调用方传入值
    out:作为输出,返回值
    inout: 既可以作为输入也可以作为输出 ,也就是该参数既需要传入值,又可以返回值
  2. 如果存储过程体仅仅只有一句话,begin end可以省略
  3. 存储过程体中的每条sql语句的结尾要求必须加分号。
  4. 存储过程的结尾可以使用 delimiter 重新设置
    语法:
    delimiter 结束标记

调用存储过程

CALL 存储过程名(实参列表);
  1. 空参列表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT * FROM admin;

    DELIMITER $
    CREATE PROCEDURE myp1()
    BEGIN
    INSERT INTO admin(username,`password`)
    VALUES('john1','0000'),('lily','0000'),
    ('rose','0000'),('jack','0000'),
    ('tom','0000');
    END $

    #调用
    CALL myp1();
  2. 创建带in模式参数的存储过程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    创建存储过程实现,用户是否登录成功

    DELIMITER $
    CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
    BEGIN
    DECLARE result INT DEFAULT 0;#声明并初始化
    SELECT COUNT(*) INTO result#赋值
    FROM admin
    WHERE admin.username = username
    AND admin.password = PASSWORD;
    SELECT IF(result>0,'成功','失败');#使用
    END $

    #调用
    CALL myp3('张飞','8888')
  3. 创建out 模式参数的存储过程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    根据输入的女神名,返回对应的男神名和魅力值

    DELIMITER $
    CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT)
    BEGIN
    SELECT boys.boyname ,boys.usercp INTO boyname,usercp
    FROM boys
    RIGHT JOIN
    beauty b ON b.boyfriend_id = boys.id
    WHERE b.name=beautyName ;
    END $

    #调用
    CALL myp7('小昭',@name,@cp);
    SELECT @name,@cp;
  4. 创建带inout模式参数的存储过程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    传入a和b两个值,最终a和b都翻倍并返回

    DELIMITER $
    CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
    BEGIN
    SET a=a*2;
    SET b=b*2;
    END $

    #调用
    SET @m=10;
    SET @n=20;
    CALL myp8(@m,@n);
    SELECT @m,@n;

删除存储过程

语法:drop procedure 存储过程名
DROP PROCEDURE p1;
DROP PROCEDURE p2,p3; 

查看存储过程

DESC myp2;×
SHOW CREATE PROCEDURE  myp2;

函数

含义:一组预先编译好的SQL语句的集合,理解成批处理语句 
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且仅有1 个返回,适合做处理数据后返回一个结果

创建函数

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
    函数体
END
  • 注意
    1. 参数列表包含两部分 参数名 参数类型
    2. 函数体:肯定会有return语句,如果没有会报错
    3. 函数体中仅有一句话,则可以省略begin end
    4. 使用 delimiter语句设置结束标记

调用函数

select 函数名(参数列表)
  1. 无参有返回

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #案例:返回公司的员工个数
    DELIMITER $
    CREATE FUNCTION myf1() RETURNS INT
    BEGIN

    DECLARE c INT DEFAULT 0;#定义局部变量
    SELECT COUNT(*) INTO c#赋值
    FROM employees;
    RETURN c;

    END $

    SELECT myf1()
  2. 有参有返回

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #案例1:根据员工名,返回它的工资
    DELIMITER $
    CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
    BEGIN
    SET @sal=0;#定义用户变量
    SELECT salary INTO @sal #赋值
    FROM employees
    WHERE last_name = empName;

    RETURN @sal;
    END $

    SELECT myf2('k_ing')

查看函数

show create function 函数名;
eg: show create function find_boys;

删除函数

drop function 函数名;
drop function find_boys;
  • 例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    创建函数,实现传入两个float,返回二者之和
    DELIMITER $
    CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
    BEGIN
    DECLARE SUM FLOAT DEFAULT 0;
    SET SUM=num1+num2;
    RETURN SUM;
    END $

    SELECT test_fun1(1,2)

流程控制结构

分支结构

if函数

1
2
语法:if(条件,值1,值2)
功能:实现双分支

应用在begin end中或外面

case结构

1
2
3
4
5
6
7
语法1:类似于switch
case 变量或表达式
when 值1 then 语句1;
when 值2 then 语句2;
...
else 语句n;
end
1
2
3
4
5
6
7
语法2:
case
when 条件1 then 语句1;
when 条件2 then 语句2;
...
else 语句n;
end

可以应用在begin end中或者外面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#案例:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
DELIMITER $
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';

CASE
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;
RETURN ch;
END $

SELECT test_case(56)

if结构

1
2
3
4
5
6
if 条件1 then 语句1;
elseif 条件2 then 语句2;
....
else 语句n;
end if;
功能:类似于多重if

只能应用在begin end中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
样例:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D  
DELIMITER $
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
IF score>90 THEN SET ch='A';
ELSEIF score>80 THEN SET ch='B';
ELSEIF score>60 THEN SET ch='C';
ELSE SET ch='D';
END IF;
RETURN ch;
END $
测试
SELECT test_if(87);

循环结构

分类: 
    while  loop repeat
循环控制:
    iterate 类似于 continue 继续,结束本次循环,继续下一次
    leave 类似于 break  跳出,结束当前所在的循环

while

语法:
【标签:】while 循环条件 do
    循环体;
end while【 标签】;
相当于
while(循环条件){
    循环体;
}
  1. 没有添加循环控制语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #案例:批量插入,根据次数插入到admin表中多条记录
    DROP PROCEDURE pro_while1;
    CREATE PROCEDURE pro_while1(IN insertCount INT)
    BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i<=insertCount DO
    INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
    SET i=i+1;
    END WHILE;

    END $

    CALL pro_while1(100)
  2. 添加leave语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
    TRUNCATE TABLE admin;
    DROP PROCEDURE test_while1
    CREATE PROCEDURE test_while1(IN insertCount INT)
    BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<=insertCount DO
    INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
    IF i>=20 THEN LEAVE a;
    END IF;
    SET i=i+1;
    END WHILE a;
    END $

    CALL test_while1(100)
  3. 添加iterate语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
    TRUNCATE TABLE admin$
    DROP PROCEDURE test_while1$
    CREATE PROCEDURE test_while1(IN insertCount INT)
    BEGIN
    DECLARE i INT DEFAULT 0;
    a:WHILE i<=insertCount DO
    SET i=i+1;
    IF MOD(i,2)!=0 THEN ITERATE a;
    END IF;

    INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');

    END WHILE a;
    END $

    CALL test_while1(100)

loop

语法:
【标签:】loop
    循环体;
end loop 【标签】;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELIMITER $
DROP PROCEDURE pro_loop$
CREATE PROCEDURE pro_loop(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:LOOP
SET i=i+1;
IF i>insertCount
THEN LEAVE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
END LOOP a;
END $

CALL pro_loop(100);

repeat

语法:
【标签:】repeat
    循环体;
until 结束循环的条件
end repeat 【标签】;
1
2
3
4
5
6
7
8
9
10
11
12
13
DELIMITER $
DROP PROCEDURE IF EXISTS pro_repeat$
CREATE PROCEDURE pro_repeat(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:REPEAT
INSERT INTO admin(username,`password`) VALUES(CONCAT('loong',i),'888');
SET i = i+1;
UNTIL i>insertCount
END REPEAT a;
END $

CALL pro_repeat(100);
-------------本文结束,感谢您的阅读-------------
您的支持将鼓励我继续创作!!