MySQL[尚硅谷] Summary for videos

一、前置知识

  • DB:数据库
  • DBMS:数据库管理系统
  • SQL:结构化查询语言
  • 将数据放到表中,再将表放到库中,表由列组成,也称为字段,一个数据库有多个表。
  • 通过修改配置文件my.ini来修改默认设置。
  • net start/stop mysql08(服务名) windows下开启数据库服务。
  • 连接数据库方法:①通过SQL自带客户端,仅限root。②windows客户端mysql -h主机名 -P端口号 -u用户名 -p密码 本机可省略-h -P 。退出exitctrl c
  • 每条命令用分号结尾,不区分大小写,建议关键字大写。
  • DQL语言 查询
  • DML语言 增删改
  • DDL语言 定义
  • TCL语言 控制

二、基础知识

  • show databases;
  • use test;
  • show tables;
  • show tables from a; #展示a库中的所有表
  • desc + 表名; #展示表的结构
  • select version();
  • windows下:mysql --version / mysql --V
  • # 注释
  • --空格 注释
  • /* 注释 */
  • show engines;查看MySQL支持的存储引擎。
  • MySQL中+只能做运算符,转换失败则值为0,只要其中一方为null,结果则为null。
  • MySQL索引从1开始。
  • IFNULL(表达式,x):如果表达式为null,值则为x。
  • where后面不支持别名。
  • 字符型和日期型的常量值必须用单引号引起来,数值型不需要。
  • isnull(x):是null则为1,不是null则为0。
  • 为表起别名之后只能用表的别名,不能用表名。
  • MySQL不支持全外连接。

三、DQL语言

1. 基础查询

  1. select 查询列表 from 表名;
  2. 查询列表:表中的字段、常量值、表达式、函数,查询的结果是个虚拟的表格。
  3. 别名建议加双引号,单引号也可以。
  4. 去重:select distinct 查询列表 from 表名;,distinct只能加一个字段名。

2. 条件查询

  1. where后面添加筛选条件。
  2. 条件查询支持按条件表达式筛选(< > = != <> <= >=)、逻辑表达式筛选(&& || !)、模糊查询(like / between and / in / is null / is not null)。
  3. %通配符:任意多个字符,包含0个字符。
  4. _通配符:任意单个字符。
  5. \_:代表_
  6. 指定转义:where last_name like '_$_%' ESCAPE '$';
  7. betwee and 的值包含临界值,临界值不能颠倒顺序。
  8. in列表内的值必须统一,且不支持通配符,in ('a','c');
  9. <>:不等于 <=> :安全等于,支持null,=不支持null,需要用is null

3. 排序查询

  1. select from where order by 排序列表(多个字段、单个字段、表达式、函数、别名) acs / desc 不加则默认升序;
  2. 一般放在最后面,limit除外。
  3. by a ASC, b DESC a升序,若a相同,则b降序。

4. 函数查询

  1. select 函数名(实参列表) from 表
  2. 函数查询分为两类:单行查询与分组查询。

4.1 单行函数

4.1.1 字符函数
  • length():汉字为三个字节(utf8),length返回字节个数。
  • contact(A,B):拼接 。
  • upper()
  • lower()
  • substr/substring(' ', 7):从7开始后的所有字符。
    substr/substring(' ', 7, 3):从7开始的后3位字符。
  • instr(' ', ' '):后面的字符串在前面的字符串中第一次出现的索引,如果未出现则为0。
  • trim():去掉前后的空格。
    trim('a' from ' '):把前后的a去掉。
  • lpad(' ', 10, '*'):指定长度左填充,如果原字符串长度大于10,则右截断。
  • rpad(' ', 10, '*'):指定长度右填充,如果原字符串长度大于10,则右截断。
  • replace(' ', 'x', 'y'):所有的x会被替换成y。
4.1.2 数学函数
  • round():四舍五入。
    round(x, y):保留小数点后y位。
  • ceil():向上取整。
  • floor():向下取整。
  • truncate():截断。
    truncate(x, y):保留小数点后y位。
  • rand():随机产生0到1之间的小数,不会到1。
  • mod(10, 3):返回10%3,与select 10%3等效。
4.1.3 日期函数
  • now():日期+时间。
  • curdate():日期。
  • curtime():时间。
  • year(now()):年。
  • month()
  • monthname():返回月的英文单词。
  • day()
  • hour()
  • minute()
  • second()
  • str_to_date('9-13-2010', '%m-%d-%Y'):将字符串转换为日期。
  • date_format(now(), '%y年%m月%d日'):将日期转换为字符串。
符号 代表
%Y 4位年
%y 2位年
%m 01、02月
%c 1、2月
%d 01、02日
%H 24制小时
%h 12制小时
%i 00、01分钟
%s 00、01秒
4.1.4 其他函数
  • version()
  • user()
  • database()
  • datadiff(' ', ' ') :相差多少天。
  • md5:MD5形式加密。
  • password:返回加密形式。
4.1.5 流程控制函数
  • if(x, y, z):如果x成立,y,否则z。
  • case:两种形式。
1
2
3
4
5
6
7
case 要判断的字段或者表达式
when 常量 then/语句(如果是语句,则加分号)
when 常量 then/语句(如果是语句,则加分号)
when 常量 then/语句(如果是语句,则加分号)
...
else/语句(如果是语句,则加分号)
end
1
2
3
4
5
6
7
case 
when 条件1 then/语句(如果是语句,则加分号)
when 条件2 then/语句(如果是语句,则加分号)
when 条件3 then/语句(如果是语句,则加分号)
...
else/语句(如果是语句,则加分号)
end

4.2 分组函数(别名:统计函数、聚合函数)

  • sumavgmaxmincount
  • sum、avg:数值、忽略null、sum(distinct a)去重、count(distinct a)去重。
  • max、min:字符、数值、日期、忽略null。
  • count:非空个数。
  • select count(*) from :统计行数。
    select count(1) from:统计行数,相当于加了一列1。
    MYISAM存储引擎下,*效率高。
    INNODB存储引擎下,两种方法效率差不多,都比count 字段高。
  • 使用分组函数一同查询的字段要求是group by后的字段。

5. 分组查询

1
2
3
4
5
6
select 分组函数,列(与group by 后的列相同)
from
where 分组前的筛选
group by
having 分组后的筛选
order by
  • 分组函数做条件一定是分组后筛选。
  • 能用分组前筛选尽量用分组前筛选,提高效率。
  • 可以在group by后面添加多个字段,多个字段没有先后顺序,即按照多个字段分组。

6. 连接查询(多表查询)

  • select name, boyName from beauty, boys;,显示的是笛卡尔乘积现象(表1有m行,表2有n行,则显示的即是n*m行)。
  • 按年代分为两种:①SQL92:在MySQL中仅仅支持内连接。②SQL99(推荐)。
  • MySQL不支持全外连接。
  • 按功能分分类:
    ①内连接(两表交集):等值连接、非等值连接、自连接(自己与自己连接)。
    ②外连接(一个表中有一个表中没有):左外连接、右外连接、全外连接。
    ③交叉连接(笛卡尔乘积)。
  • SQL92仅支持内连接(MySQL中):where 连接条件 and 筛选条件,自连接:为表起多个别名来连接。如果为表起了别名,则查询的字段不能使用原来的表名去限定,必须使用别名。from后面两个表的顺序可以交换。
  • SQL99支持外连接与内连接与交叉连接。连接类型为内连inner、左外left (outer)、右外right (outer)、全外full (outer)、交叉cross,如果省略默认为内连接。如下:
1
2
3
4
5
select1 别名 连接类型
join2 别名
on 连接条件
where
筛选条件
  • 外连接:一般来查询一个表中有,另一个表中没有的数据。查询结果为主表中所有的数据,如果从表中有对应的匹配,则为值;反之则为null。
  • 在左外连接中,left左侧是主表;在右外连接中,right右侧是主表。左外连接和右外连接中可以通过交换语句中表的顺序来转换,达到的效果相同。
  • 筛选另一表中不存在的行时,最好选择筛选从表的主键。
  • 全外连接结果为:主表从表都存在(交集),主表有从表没有则用null填充,主表没有从表有则用null填充。如果想去掉交集,则可以在where后增加主表或者从表主键为null的条件。
  • SQL99中的交叉连接与SQL92中的笛卡尔乘积效果等效。
  • 建议使用SQL99语法。

7. 子查询/内查询

  • 外部的语句称为外查询/主查询,其他语句内部的语句称为内查询/子查询,子查询放在小括号内,子查询的执行优先于子查询的执行。
  • 子查询可以放在selectfromwhere/havingexists后面。
  • 子查询可以根据本身的查询结果生成的虚拟表分为:①标量子查询(一行一列) ②列子查询(一列多行) ③行子查询(一行多列) ④表子查询(多列多行)。
  • where/having后面可以放标量子查询(搭配单行操作符:><等)、列子查询(搭配多行操作符:innot inany/someall)、行子查询(如下)。
1
2
3
4
5
SELECT * FROM employees
WHERE (employee_id, salary)=(
SELECT MIN(employee_id), MAX(salary)
FROM employees
)
  • select后面可以放标量子查询。
  • from后面可以放任意类型的子查询,from后面的表要起别名。
  • exists(相关子查询)后面可以放任意类型的子查询。exists后面的东西存在则为1,否则为0。语法:seists(完整的查询语句)

8. 分页查询

  • 分页查询场景:数据一页显示不全,需要分页提交SQL请求。语法:limit offset,sizeoffset代表要显示条数的起始索引(索引从0开始),如果需要从0开始则offset可省略。size代表要显示的条目个数。

9. 联合查询

  • 语句1 union 语句2
  • 将多条查询结果合并成一个结果,要求两个语句生成的虚拟表列数必须一致,列的类型和顺序爷最好一致,结果为去重的,如果不想去重,则把union换成union all即可。

四、DML语言

1. 插入

  • insert into 表名(列名) values(一一对应);
  • insert into 表名 set 列名=值, 列名=值 ... ;
  • 第一种写法可以省略列名,那么默认为所有列名,且列名顺序和表名一致。
  • 第一种写法支持插入多行,多行之间values括号后用逗号隔开,列名的顺序可以调换,对应的值也需要调换。
  • 第一种写法支持子查询:select into 表名(列名) select ...;,第二种写法不支持。

2. 修改

  • update 表名 set 列名=值, 列名=值 ...; (where 筛选条件)
  • 修改多表SQL92写法如下。
1
2
3
4
update 表1 别名, 表2 别名
set
where 连接条件
and 筛选条件
  • 修改多表SQL99写法如下。
1
2
3
4
5
update 表1 别名
inner / left / right join2 别名
on 连接条件
set
where 筛选条件

3. 删除

  • delete from 表名 where limit删除整行。
  • truncate table 表名不加where把表中所有数据删除。
  • 删除多表SQL92写法如下。
1
2
3
4
delete1的别名, 表2的别名
from1 别名, 表2 别名
where 连接条件
and 筛选条件
  • 删除多表SQL99写法如下。
1
2
3
4
5
delete1的别名, 表2的别名
from1 别名
inner/left/right join2 别名
on
where
  • truncate效率高一点。
  • truncate没有返回值,delete有返回值。
  • truncate删除不能回滚,delete可以回滚。
  • 如果删除的表中有自增长列,删除后再插入truncate1开始,delete从断点处开始。

五、DDL语言

  • DDL语言主要用于库和表的管理。

1. 库的管理

  • 库的创建:create database【if not exits】库名
  • 库的修改:rename database 库名 to 新库名(以前可以用,现在此条语句被取消)、alter database 库名 character set gbk
  • 库的删除:drop database【if exists】库名

2. 表的管理

  • 表的创建如下。
1
2
3
4
5
create table 表名(
列名 列类型【(长度) 约束】,
列名 列类型【(长度) 约束】,
列名 列类型【(长度) 约束】 #最后一个没有逗号
)
  • 表的修改:

    • 修改列名:alter table 表名 change【column】列名 新列名 新类型
    • 修改列的类型、约束:alter table 表名 modify column 列名 类型
    • 添加新列:alter table 表名 add column 列名 类型【first / after 字段名】
    • 删除列:alter table 表名 drop column 列名
    • 修改表名:alter table 表名 rename to 新表名
  • 表的删除:drop table【if exists】表名exists不能加在删除列,可以在加在表的创建、表的删除、库的创建、库的删除。

  • 表的复制:

    • 仅仅复制表的结构:create table 表名 like 要复制的表
    • 复制表的结构加所有数据:create table 表名 select * from 要复制的表
    • 复制表的结构和部分数据:create table 表名 select 字段1, 字段2 from 要复制的表 where 筛选条件
    • 仅仅复制表的某些字段:create table 表名 select 字段1, 字段2 from 要复制的表 where 0

3. 常见的数据类型

3.1 数值型

  • 数值型分为:整型、小数(浮点数、定点数)。
  • 整型:tinyint(1个字节)、smallint(2个字节)、mediumint(3个字节)、int(integer)(4个字节)、bigint(8个字节),都分为有符号和无符号两种类型。
  • 如果在字段的后面加上unsigned,则为无符号类型;否则则默认为有符号类型。
  • 如果插入的值超出整数的范围,则为临界值。
  • 不设置长度则会有一个默认的长度,长度代表宽度,如果数值的长度不够会在左侧填充0,但要搭配zerofill使用(只支持正数)。
  • 浮点数:float(M, D)(4个字节)、double(M, D)(8个字节)。
  • 定点数:decimal(M, D)(M+2个字节),也可以缩写为dec(M, D)
  • M代表小数部分和整数部分总共的位数,D代表小数部分的位数,代表保留D位,遵循四舍五入。如果插入的数据超过MD的限制则插入临界值。(M, D)可省略,如果为定点数则默认为(10, 0),如果为浮点数,则会根据插入的数值的精度来决定精度。
  • 定点数精确度比浮点数高。
  • 根据数据选择的数值类型越小越好,精度越小越好。

3.2 字符型

  • 字符型:较短的charvarcharbinaryvarbinary;较长的textblob;枚举类型enum;集合set
  • char(M)varchar(M)M代表最大字符数。char是固定字符数,varchar的字符数可以根据插入的字符数自动变化,char效率高,但varchar节省空间。charM可以省略,默认为1,varcharM不能省略。
  • binaryvarbinary:保存较短的二进制。
  • 字段名 enum('a', 'b', 'c'):一次只能插入一个,保存枚举的字符,不区分大小写,如果插入A则存为a
  • 字段名 set('a', 'b', 'c'):一次可以插入多个,valuese('a,b'),保存集合,不区分大小写。

3.3 日期型

符号 保存字节数 含义 性质
date 4 日期
datetime 8 日期+时间 范围为1000到9999
timestamp 4 时间戳 范围为1970到2038,受时区和版本影响,范围小
time 3 时间
year 1

4. 常见约束

  • 用于限制表中的数据,为了保证表的一致性。
  • 六大约束:
    ①非空约束not null:保证该字段非空。
    ②默认约束default:使该字段具有默认值。
    ③主键约束primary key:保证该字段具有唯一性,且非空,一个表中只能有一个主键约束。
    ④唯一键约束unique:保证该字段具有唯一性,但可以为空,一个表中可以有多个唯一键约束。
    ⑤检查约束check:MySQL中不支持,但不报语法错误。
    ⑥外键约束foreign key:用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值,从表中的外键要和主表中关联列的类型要求一致/兼容,主表中的关联列必须是一个主键/唯一键,删除数据时应先删除从表,再删除主表。
  • 添加约束的时机:
    • 创建表时。
    • 修改表时。
  • 约束的添加分类:
    • 列级约束:六大约束语法都支持,外键约束无效果。
    • 表级约束:除了非空约束、默认约束以外其余都支持。
1
2
3
4
5
6
create table 表名(
字段 类型 列级约束,
字段 类型 列级约束,
字段 类型 列级约束,
表级约束
}
  • 主键和唯一键都可以组合(两个列组合成主键或唯一键):primary key(id, stuname), unique(seat, seat2),但不推荐,主键不允许为空,唯一键允许。

  • 检查约束:字段名 char(1) check(字段名='男' or 字段名=‘女‘)

  • 默认约束:字段名 int default 18

  • 外键约束:字段名 int foreign key references 主表名(字段)

  • show index from 表名:查看表中所有的索引(主键、外键、唯一建会自动生成索引)。

  • 表级约束:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    create table 表名(
    字段 类型 列级约束,
    字段 类型 列级约束,
    字段 类型 列级约束,

    constraint 约束名】 约束类型(字段名)
    constraint pk primary key(字段名),#主键名字永远为primary key,即是修改也不变
    constraint uq unique(字段名),
    constraint ck check(字段名='男' or 字段名='女'),
    constraint 引用名 foreign key(字段名) references 主表(字段名)

    // 或者不加引用名,如下。默认为字段名
    foreign key(字段名) references 主表(字段名)
    }
  • 修改表时添加约束:
    ①添加列级约束:alter table modify column 字段名 int primary key
    ②添加表级约束:alter table add primary key(字段名)

  • 修改表时删除约束:
    alter table drop primary keyalter table drop index 索引名alter table drop foreign key 字段名
    alter table modify column 字段名 int【null】

  • 关于外键约束的删除:

    • 传统方式添加外键:alter table 表名 add constraint 引用名 foreign key(字段名) referencess 主表(字段名)
    • 级联删除:alter table 表名 add constraint 引用名 foreign key(字段名) referencess 主表(字段名) on delete cascade
    • 级联置空:alter table 表名 add constraint 引用名 foreign key(字段名) referencess 主表(字段名) on delete set null

5. 标识列(自增长列)

  • 不用手动插入值,系统提供默认的序列值。标识列的类型只能是数值型,一个表中至多一个自增长列。
  • auto_increment:放在约束后面,必须和key(主键、唯一键)搭配。
  • set auto_increment_increment=x:设置步长。可以用插入的方式设置初始自增长起始值。
  • 可以在修改表时设置或删除标识列。

六、TCL语言

  • 事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。如果单元中的某条SQL语句执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事务开始前的状态。

  • 在MySQL中用的最多的存储引擎有:innodb、myisam、memory等。其中innodb支持事务,而myisam、memory等不支持事务。

  • 事务的ACID属性:

    • 原子性:不可分割,要么都发生,要么都不发生。
    • 一致性:事务必须使数据库从一个一致性状态转换到另一个一致性状态。
    • 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    • 持久性:一旦提交,它对数据库中数据的改变是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
  • 事务的创建:

    • 隐式事务:事务没有明显的开始和结束的标记。比如insert、update、delete语句。
    • 显式事务:事务具有明显的开启和结束的标记。
      • 先设置自动提交功能为禁用set autocommit = 0; 【start transaction】,只针对当前事务有效。
      • 编写事务中的SQL语句(select、insert、update、delete)。
      • 结束事务:输入命令commit;提交事务或者rollback;回滚事务。
  • 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采用必要的隔离机制,就会产生各种并发问题:

    • 脏读:对于两个事务T1,T2,如果T1读取了已经被T2更新但还没有被提交的字段,之后若T2回滚,T1读取的内容就是临时且无效的。
    • 不可重复读:对于两个事务T1,T2,若T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了。
    • 幻读:对于两个事务T1,T2,若T1读取了一个字段,然后T2在该表中插入了一些新的行,T1再次读取同一个表,就会多出几行。
  • 数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使他们不会相互影响,避免各种并发问题。

  • 一个事务与其他事务隔离的程度称为隔离级别,数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。数据库提供的四种隔离级别如下。

  • Oracle支持的两种隔离级别:READ UNCOMMITTED、SERIALIZABLE。Oracle默认的事务隔离级别为READ COMMITTED。MySQL支持四种事务隔离级别,MySQL默认的事务隔离级别为REPEATABLE READ。
  • 每启动一个MySQL程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别。查看当前的隔离级别:select @@tx_isolation;,设置当前MySQL连接的隔离级别:set transaction isolation level read committed;,设置数据库系统的全局的隔离级别:set global transaction isolation level read committed;
  • savepoint 节点名,设置保存点,rollback to 节点名,回滚到保存点。

七、视图

  • 虚拟的表,和普通表一样使用,MySQL5.1版本出现的新特性,是通过表动态生成的数据,只保存了SQL逻辑,不保存查询结果,相对于表来说占用的空间更小,但是视图一般不能增删改。
  • 优点:实现了SQL语句重用;简化了复杂的SQL操作,不必知道它的查询细节;保护数据,提高安全性。
1
2
3
create view my_vl
as
select * from 表;
  • 视图的修改:

    • 方式一:create or replace view 视图名 as
    • 方式二:alter view 视图名 as
  • 视图的删除:drop view 视图名, 视图名...

  • 视图的查看:desc 视图名,或者show create view 视图名

  • 视图的更新(数据):

    • 插入:insert into 视图名 values(值, 值...)
    • 修改:update 视图名 set 字段名 = 值 where 筛选条件
    • 删除:delete from 视图名 where 筛选条件
  • 以下类型的视图是不能更新的:

    • 包含以下关键字的SQL语句:分组函数、distinct、group by、having、union、union all。
    • 常量视图。
    • 含join的查询。
    • from一个不能更新的视图。
    • where自居的子查询引用了from字句中的表。

八、变量

  • 变量分为系统变量和自定义变量。系统变量分为全局变量和会话变量,自定义变量分为用户变量和局部变量。
  • 系统变量:由系统提高,属于服务器层面,如果不加global或session指定全局变量或会话变量,则默认为session会话变量。
    • 查看所有的系统变量:show global/【session】 variables
    • 查看满足条件的部分系统变量:show global/【session】 variables like xxx
    • 查看指定的某个系统变量的值:select @@global/【session】.系统变量名
    • 为某个系统变量赋值:set global/【session】 系统变量名=值。或者set @@global/【session】.系统变量名=值
    • 全局变量作用域:服务器每次启动将为所有的全局变量赋初试值,针对所有的会话连接都有效,但是不能跨重启。如果想跨重启,则需要修改配置文件。
    • 会话变量作用域:仅仅针对当前会话连接有效。
  • 自定义变量:声明、赋值、使用(查看运算比较等),可以放置在任何地方。
    • 用户变量作用域:仅针对当前会话有效,用于会话变量的作用域。
    • 声明并初始化:set @用户变量名=值set @用户变量名:=值select @用户变量名:=值
    • 赋值:
      • 方法一:set @用户变量名=值set @用户变量名:=值select @用户变量名:=值,可以跨数据类型。
      • 方法二:select 字段 into 变量名 from 表
    • 查看:select @用户变量名
  • 局部变量:仅仅在定义它的begin和end中有效,且必须在begin和end中的第一句话。
    • 声明:declare 变量名 类型declare 变量名 类型 default 值,值要与类型一致或兼容。
    • 赋值:
      • 方式一:set 局部变量名=值set 局部变量名:=值select @局部变量名:=值,可以跨数据类型。
      • 方式二:select 字段 into 变量名 from 表
    • 查看:select 用户变量名
  • 局部变量必须限定类型,自定义变量不需要限定类型。

九、存储过程和函数

  • 存储过程:一组预先编译好的SQL语句的集合,理解成批处理语句。减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。
    • 创建语法:create procedure 存储过程名(参数列表) begin 一组合法有效的SQL语句 end
      • 参数列表:参数模式、参数名、参数类型。
      • 参数模式:IN(可以作为输入,作为输入值)、OUT(可以作为输出,作为返回值)、INOUT(既可以做输入又可以做输出)。
      • 如果存储过程体仅有一句话,则begin和end可以省略。
      • 存储过程体的每条SQL语句的结尾要求必须加分号,存储过程的结尾可以使用delimiter重新设置。语法为delimiter 结束标记
    • 调用语法:call 存储过程名(实参列表)。例如:call myp('x', @a),其中@a可以提前定义,也可以不定义直接作为实参传入存储过程,但是依旧存在@a变量。
    • 存储过程的删除:drop procedure 存储过程名,一次只能删除一个。
    • 查看存储过程的信息:show create procedure 存储过程名
    • 很少有存储过程的修改。
  • 函数:有且仅有一个返回值。存储过程适合做批量的插入更新,而函数时候做数据处理后返回一个结果。
    • 创建语法:create function 函数名(参数列表) returns 返回类型
      • 参数列表:参数名、参数类型。
      • 肯定会有return语句,如果没有会报错,一般建议放在函数体的最后。
      • 如果函数体仅有一句话,则begin和end可以省略。
      • 函数体的每条SQL语句的结尾要求必须加分号,函数的结尾可以使用delimiter重新设置。语法为delimiter 结束标记
    • 调用语法:select 函数名(实参列表)
    • 函数的删除:drop function 函数名,一次只能删除一个。
    • 查看函数:show create function 函数名
    • 很少有函数的修改。

十、流程控制结构

1. 分支结构

  • if函数:实现简单的双分支,select if(表达式1, 表达式2, 表达式3),可以应用在任意地方。
  • case结构:
    • 类型一:实现等值判断。
    • 类型二:实现区间判断。
    • 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方。
    • 如果作为独立的语句使用,那么只能放在begin和end之间。
    • 相当于有break语句。
1
2
3
4
5
6
7
case 变量/表达式/字段
when 要判断的值 then 返回的值1或语句;
when 要判断的值 then 返回的值2或语句;
when 要判断的值 then 返回的值3或语句;
when 要判断的值 then 返回的值4或语句;
else 返回的值n;
end
1
2
3
4
5
6
7
case 
when 要判断的条件1 then 返回的值1或语句;
when 要判断的条件2 then 返回的值2或语句;
when 要判断的条件3 then 返回的值3或语句;
when 要判断的条件4 then 返回的值4或语句;
else 返回的值n;
end
  • if结构:实现多重分支。if 条件1 then 语句1; elseif 条件2 then 语句2 else 语句n end if,只能放在begin和end之间。

2. 循环结构

  • 分类:while、loop、repeat。
  • 循环控制:iterate【标签】结束本次循环继续下一次,leave【标签】结束当前所在循环。
  • 【标签:】while 循环条件 do 循环体; end while 【标签】
  • 【标签:】loop 循环体; end loop 【标签】,可以模拟死循环。
  • 【标签:】repeat 循环体; until 结束循环的条件 end repeat 【标签】