上课演示


typora-copy-images-to: img
typora-root-url: img

https://www.bilibili.com/video/BV1FE411t7M7?from=search&seid=5258357899390534051

1.MySQL常用函数(理解)

1.字符串函数

函数 描述 实例
CHAR_LENGTH(s) 返回字符串 s 的字符数 SELECT CHAR_LENGTH(‘itheima’) AS ‘长度’;
CONCAT(s1,s2…sn) 字符串 s1,s2 等多个字符串合并为一个字符串 SELECT CONCAT(‘I’,‘love’,‘you’);
LOWER(s) 将字符串 s 的所有字母变成小写字母 SELECT LOWER(‘ITHEIMA’);
UPPER(s) 将字符串转换为大写 SELECT UPPER(“itheima”);
SUBSTR(s, start,length) 从字符串 s 的 start 位置(从1开始)截取长度为 length 的子字符串 SELECT SUBSTR(“itheima”,1,2);
TRIM(s) 去掉字符串 s 开始和结尾处的空格 SELECT TRIM(’ itheima ')

代码演示:

-- 获取字符串的字符个数
select char_length('itcast') as 长度; -- 6 了解
-- 拼接 '锁哥柳岩1100'  true 表示1 false 0 必须掌握
select concat('锁哥','柳岩',true,10,false);
-- 转换大写
select upper('itCAST');
-- 截取 '黑马程序员' 截取的字符串  1 从第一个字符开始截取  3截取的字符个数 必须掌握
select substr('黑马程序员',1,3); -- 黑马程
select substr('黑马程序员',1,60); -- 黑马程序员
-- 去掉字符串的前后空格 :it  cast
select trim('  it  cast  ');

2.数字函数

函数 描述 实例
RAND() 返回 0 到 1 的随机数 SELECT RAND();
ROUND(小数 , 小数点后保留小数位数) 四舍五入保留几位小数 SELECT ROUND(3.1415926,2) ;
TRUNCATE(小数 , 小数点后保留小数位数) 不会四舍五入保留几位小数 SELECT TRUNCATE(3.1415926,3);
LEAST(expr1, expr2, expr3, …) 返回列表中的最小值 SELECT LEAST(13, 14, 521, 74, 1)
GREATEST(expr1, expr2,expr3, …) 返回列表中的最大值 SELECT GREATEST(13, 14, 521, 74, 1)
-- 数字函数
-- 求0-1的随机数
select rand();

-- 四舍五入保留小数位数
select round(3.456,2); -- 3.46   2表示保留小数位数 掌握
-- 没有四舍五入保留小数位数
select truncate(3.145,2); -- 3.14 2表示保留小数位数 掌握
-- 求最大值
select greatest(10,30,-10,100); -- 100

3.日期函数

函数名 描述 实例
NOW() 和 SYSDATE() 返回系统的当前日期和时间 SELECT NOW(); 或 SELECT SYSDATE();
CURDATE() 返回当前日期 SELECT CURDATE();
CURTIME() 返回当前系统时间 SELECT CURTIME();
YEAR(d) 返回d的中的年份 SELECT YEAR(NOW());
MONTH(d) 返回d的中的月份 SELECT MONTH(NOW());
DAY(d) 返回d中的日 SELECT DAY(NOW());
-- 日期函数
-- 获取年月日时分秒
select now();  -- 掌握
select sysdate();

-- 获取年月日
select curdate();

-- 获取指定的年份
select year(now()); -- 掌握

4.高级函数

函数名 描述 实例
CURRENT_USER() 返回当前用户 SELECT CURRENT_USER();
IFNULL(v1,v2) 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。 SELECT IFNULL(null,‘Hello Word’)
ISNULL(expression) 判断表达式是否为 NULL SELECT ISNULL(NULL);
-- 高级函数
select current_user();
-- 判断是否为空 ifnull(实际值,默认值) 如果实际值是null那么返回默认值 
-- 如果实际值不是null那么返回实际值
select ifnull(10,0); -- 10  掌握
select ifnull(null,0); -- 0
-- 判断是否为空 
select isnull(null); -- 1 true
select isnull('abc'); -- 0 false

2.事务(掌握)

1.介绍(掌握)

事务属于一组业务逻辑,在一个事务中含有多条sql语句(DML增删改),多条sql语句要么都成功,要么都失败。

作用:让数据表的数据具有安全性 有效性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwNaalc1-1607007158586)(/image-20200831091544544.png)]

小结:

1.mysql数据库默认是自动提交事务,就是每执行一条增删改的sql语句就会提交一次事务。

2.我们可以使用命令变为手动控制事务:

​ 开启手动控制事务:start transaction;

​ 提交事务:commit;

​ 回滚事务:rollback;

3.数据库的事务只是针对update insert delete 语句和查询select语句无关。

2.手动控制事务(掌握)


# 创建账号表
create table account(
	id int primary key auto_increment,
	name varchar(20),
	money double
);
# 初始化数据
insert into account values (null,'a',1000);
insert into account values (null,'b',1000);

-- 1.手动控制事务
-- 1.1 一切正常 提交事务
-- 开启手动控制事务
start transaction;
-- 书写一组sql语句
-- a给b转账100  a-100  b+100
-- a-100
update account set money = money - 100 where name='a';
-- b+100
update account set money = money + 100 where name='b';
-- 一切正常 提交事务
-- 提交事务表示永久性改变,以后在打开数据就是提交事务之后的数据了,即使回滚或者在发生异常
-- 数据也不会回到最开始的状态了
commit;

-- 1.2回滚事务
-- 开启事务
start transaction;
-- a-100
update account set money = money - 100 where name='a';
-- b+100
update account set money = money + 100 where name='b';
-- 出现异常,回滚事务
rollback;

小结:

1.手动开启事务:start transaction

2.一切正常 提交事务:commit

3.出现异常,回滚事务:rollback.回滚到最开始开启事务的状态。

3.自动控制事务(掌握)

就是每执行一条sql都会提交一次事务。

-- 自动控制事务
-- 查看自动控制事务的状态
-- autocommit的值是on表示开启自动提交事务 off表示关闭自动提交事务
show variables like '%commit%';
-- 可以使用命令关闭自动提交事务,但是关闭只是针对当前连接窗口有效,重新连接又会开启
set autocommit = 0;


-- a-100
update account set money = money - 100 where name='a'; 
-- b+100
update account set money = money + 100 where name='b';

小结:

mysql默认是自动提交事务,就是每执行一条sql语句就会提交一次事务。

4.事务的回滚点(理解)

我们上述学习如果出现异常,执行rollback会会滚到开启事务之前的状态。那么我们使用回滚点也可以不回滚到开启事务之前的状态,可以回滚到设置回滚点的位置。

回滚点的操作语句 语句
设置回滚点 savepoint 名字
回到回滚点 rollback to 名字
-- 回滚点
-- 开启手动控制事务
start transaction;
-- a-100
update account set money = money - 100 where name='a'; 

-- 设置回滚点
savepoint itcast;
-- a-100
update account set money = money - 100 where name='a'; 

-- 回滚到回滚点位置
rollback to itcast;

5.事务的原理(理解,面试考)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EB2Zinly-1607007158588)(/image-20200831100536952.png)]

说明:

1.如果没有手动开启事务,那么执行的增删改语句直接发送 给数据库服务器

2.如果手动开启事务,那么会产生一个临时日志文件。执行commit命令将临时日志文件中的的sql语句发送给送数据库服务器。如果执行rollback命令则会清空临时日志文件,不会将临时日志文件的sql语句发送给数据库服务器

3.设置回滚点之后,回到回滚点,我们也必须执行commit命令将回滚点之前的sql语句提交给数据库服务器。数据才会改变,否则又会回到最开始状态。

6.事务的四大特性(ACID)(面试)

1.原子性:Atomicity。就是最小,不能进行分割,在一个事务中,多条sql语句要成功都成功,要失败都失败

2.隔离性:Isolation。每个事务之间是不互相干扰的。

事务A:张三给李四转账100元。

事务B:王五给赵六转账100元。

3.一致性:Consistency 就是之前事务前后的数据不变。

举例:

转账前:张三 1000 李四 1000

转账之后:张三900 李四 1100

4.持久性:Durability。事务只要被提交就会永久性改变。

7.事务的并发访问引发的三个问题(了解,面试)

1.介绍

1.脏读:就是一个事务读取了另一个未提交事务的数据,导致前后读取结果不一致的现象就是脏读。脏读是非常危险的,开发中一定避免。

2.不可重复读:就是一个事务读取了另一个已经提交事务的数据,导致前后读取数据的结果不一致。强调的是update语句

3.幻读(虚读):就是一个事务读取了另一个已经提交事务的行记录数,导致前后读取行记录数的结果不一致。强调的是insert delete语句

2.脏读

就是一个事务读取了另一个未提交事务的数据,导致前后读取结果不一致的现象就是脏读。脏读是非常危险的,开发中一定避免。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LWVI8F7o-1607007158593)(/image-20200831104309409.png)]

3.不可重复读

就是一个事务读取了另一个已经提交事务的数据,导致前后读取数据的结果不一致。强调的是update语句

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8SS3ReBz-1607007158597)(/image-20200831104648507.png)]

说明:

1.不可重复读强调的是已经提交事务的数据,多次读取数据前后不一致的现象就是不可重复读。

2.开发中有的数据库是可以出现不可重复读。oracle sqlserver

如果你的公司不考虑时间的时效性,不可重复读是可以出现的。

4.幻读(虚读)

就是一个事务读取了另一个已经提交事务的行记录数,导致前后读取行记录数的结果不一致。强调的是insert delete语句

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LdWVb1hE-1607007158599)(/image-20200831105310633.png)]

小结:

1.脏读:一定避免。强调的是未提交事务的数据。

2.不可重复读:可以出现。强调的是已经提交事务的数据前后不一致(主要是update语句)

3.幻读(虚读):可以出现。强调的是已经提交事务的行记录数前后不一致(主要是insert/delete语句)

8.事务的隔离级别(了解,面试)

数据库有四种隔离级别,如果隔离级别设置不当会导致并发访问的三个问题。

级别 名字 隔离级别 脏读 不可重复读 幻读 数据库默认隔离级别
1 读未提交 read uncommitted
2 读已提交 read committed Oracle和SQL Server
3 可重复读 repeatable read MySQL
4 串行化 serializable

安全性:

serializable > repeatable read > read committed > read uncommitted

性能:

serializable < repeatable read < read committed < read uncommitted

9.脏读现象演示(课下不建议演示,面试原理上面画图)

参考课下笔记。

3.MySQL性能(掌握)

1.介绍

正常开发中我们除了要考虑完成需求,我们还要考虑性能的优化。

优化有两种:

1.硬优化:在硬件上进行优化,不是我们考虑的,老板考虑,购买服务器。

2.软优化:在sql语句等其他软件方面进行优化。我们下面讲解的是索引优化就是属于软优化的软件。

2.分析-执行次数比较多的语句

我们下面讲解的索引优化方案不是适合所有数据库的,只是适合查询密集型数据库的。就是查询比较多的情况。

查询密集型8:修改密集型2

查询密集型:使用索引优化。

修改密集型:订单系统。订单状态 商品信息。后面学习的ES.ElasticSearch简称ES.

查看你的数据库的属于哪种密集型命令:

show global status like 'Innodb_rows%';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4uViN821-1607007158600)(/image-20200831112920134.png)]

3.查看-sql语句的执行效率

执行插入千万条数据:

create database itcast01;

use itcast01;

-- 1. 准备表
CREATE TABLE user(
	id INT,
	username VARCHAR(32),
	password VARCHAR(32),
	sex VARCHAR(6),
	email VARCHAR(50)
);

-- 2. 创建存储过程,实现批量插入记录
DELIMITER $$ -- 声明存储过程的结束符号为$$
-- 可以将下面的存储过程理解为java中的一个方法,插入千万条数据之后,在调用存储过程
CREATE PROCEDURE auto_insert()
BEGIN
    DECLARE i INT DEFAULT 1;
	START TRANSACTION; -- 开启事务
    WHILE(i<=10000000)DO
        INSERT INTO user VALUES(i,CONCAT('jack',i),MD5(i),'male',CONCAT('jack',i,'@itcast.cn'));
        SET i=i+1;
    END WHILE;
	COMMIT; -- 提交
END$$ -- 声明结束
DELIMITER ; -- 重新声明分号为结束符号

-- 3. 查看存储过程
SHOW CREATE PROCEDURE auto_insert;

-- 4. 调用存储过程
CALL auto_insert();

不带索引查询的数据效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7KfM2Sj-1607007158601)(/image-20200831113352508.png)]

带索引查询数据的效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CT609XKf-1607007158602)(/image-20200831113431752.png)]

4.索引

1.介绍(掌握)

索引属于一种排好序的数据结构。

类似于我们生活中的词典的目录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPX4y7ot-1607007158603)(/image-20200831113755247.png)]

索引作用:提高查询效率。

2. MySQL索引分类(掌握)

1.主键索引
	1)主键约束(唯一+非空)  2)提高性能
2.唯一索引
	1)唯一约束   2)提高性能
3.普通索引:
	1)提高性能
4.组合(联合)索引
		多个字段组成索引

5.全文索引
		solr、es
6.hash索引
		根据key-value 效率非常高

3.MySQL索引语法

1.在已有表的字段上直接创建【了解】

缺点:

​ 1)不能创建主键索引

​ 2)在创建索引时必须指定索引名

-- 索引

-- 创建学生表
CREATE TABLE student(
 id INT,
 name VARCHAR(32),
 telephone VARCHAR(11)
);

-- 1.给name字段设置普通索引
create index name_index on student(name);
-- 2.给telephone字段设置唯一索引
create unique index tel_index on student(telephone);

在可视化工具中查看索引:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLKbqkOH-1607007158604)(/image-20200831115036825.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3ZVP8zr-1607007158605)(/image-20200831115105798.png)]

2.在已有表的字段上修改表时指定【了解】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNDYUCOA-1607007158606)(/image-20200831115616339.png)]

3.创建表时指定索引(掌握)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TgTHTEr-1607007158606)(/image-20200831140706735.png)]

说明:

1.上述创建主键索引,默认名字是primary

2.其余创建索引方式都是字段名

4.查看索引(了解)

1.使用可视化工具查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXQtzKAr-1607007158607)(/image-20200831140852664.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gIbNPf8y-1607007158608)(/image-20200831141029063.png)]

5.删除索引(了解)

1.使用命令

-- 删除student表的name普通索引
drop index name_index on student;
-- 删除student表的telephone唯一索引
alter table student drop index tel_index;

2.使用可视化工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtjiIZZk-1607007158609)(/image-20200831141341615.png)]

4.加索引和不加索引演示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTQ9zdqW-1607007158610)(/image-20200831141601234.png)]

索引需要占用磁盘空间。

5.索引的优缺点(理解,面试题)

优点:

​ 1)提供查询效率,减少磁盘IO的次数。和磁盘IO次数越少,性能越快。

缺点:

​ 1)占用磁盘空间

​ 2)增加索引时间过长

​ 3)每次对表中的数据进行修改的时候,底层都会对索引重新排序。如果是修改密集型数据库不建议加索引。

6.索引建立原则(理解,面试题)

1.字段值的识别度大于70%。该字段才可以使用索引。
	字段:age sex  age更适合于索引,sex可识别度是50%
2.经常作为where条件的字段。例如:id name age 
3.经常使用连接的字段。id name age 
4.经常使用排序的字段。order by 价格 销量 等

7.索引的数据结构【了解,面试题】

1.索引底层为什么使用数据结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CyKO7XV-1607007158611)(/image-20200831143210623.png)]

1.mysql数据库对于每一行数据都有一个磁盘的物理地址。逻辑上每一行地址是相邻的,其实在物理磁盘上并不是相邻的。

2.如果上述我们不使用数据结构,那么查找数据6会经历6次磁盘IO.而如果将数据存储到右边的数据结构中,那么找89会经历2次磁盘io

2.mysql底层的数据结构

1.二叉搜索树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJvOKmC2-1607007158612)(/image-20200831143806617.png)]

mysql数据库底层不是二叉搜索树。因为有可能会变为链表数据结构增加磁盘io次数。

2.红黑树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcunrOuj-1607007158613)(/image-20200831144538408.png)]

mysql底层不是使用红黑树数据结构,因为树的高度太高,造成磁盘io次数过多。

3.BTree

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WiEjXhqf-1607007158614)(/image-20200831150834255.png)]

4.B+Tree数据结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jKhiLwB-1607007158615)(/image-20200831151848589.png)]

小结:

1.B+Tree数据结构:1)非叶子节点保存索引和指针域 2)叶子节点保存索引+数据域

2.使用B+Tree数据结构存储千万条数据,那么只需要经历2次磁盘IO.

3.B+Tree数据结构中含有冗余的索引。

4.B+Tree数据结构的叶子节点是排好序的,并且使用双链表数据结构,可以在任意位置向两个方向查找

5.查看每个节点的大小:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IsZHgPyn-1607007158622)(/image-20200831152214063.png)]

5.视图(掌握)

1.介绍

视图是一种虚拟存在的表。是在真实存在的表中进行查询将结果集存放到视图中。物理磁盘上只有表结构,没有数据。

作用:可以将非常复杂的查询结果集放到视图中,然后以后每次频繁使用的时候不用在书写非常复杂的sql语句了,而是直接查询视图即可。

准备sql语句:

-- 1个国家有多个城市,一个城市只属于一个国家
-- 国家和城市是:1对多
CREATE TABLE country (
    country_id int(11) PRIMARY KEY AUTO_INCREMENT,
    country_name varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE city (
    city_id int(11) PRIMARY KEY AUTO_INCREMENT,
    city_name varchar(50) NOT NULL,
    country_id int(11) NOT NULL,
    constraint ref_country_fk foreign key(country_id) references country(country_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


insert into country values(1,'China');
insert into country values(2,'America');
insert into country values(3,'Japan');
insert into country values(4,'UK');


insert into city values(1,'西安',1);
insert into city values(2,'NewYork',2);
insert into city values(3,'北京',1);
insert into city values(4,'上海',1);


建表关系:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdLRIcbW-1607007158631)(/image-20200831153259337.png)]

2.创建视图

-- 需求:在城市和国家表中查看所有国家和对应城市的信息。
-- 不使用视图
select * 
from country 
inner join city 
on country.country_id = city.country_id;
-- 将上述sql语句的结果集放到视图中
-- 创建视图
create view country_city_view
as
select country.country_name,city.* 
from country 
inner join city 
on country.country_id = city.country_id;
-- 查看视图
select * from country_city_view;

小结:

1.创建视图语法:

create view 视图名
as
sql 语句;

2.创建视图需要注意,不要有重复的字段名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lVGYfXqp-1607007158632)(/image-20200831154017749.png)]

3.视图是虚拟存在的表,只有表结构占物理磁盘空间,数据不占。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eh9njPsb-1607007158632)(/image-20200831154103252.png)]

3.视图和真实表的区别

		操作		是否 占磁盘空间
表      一样		数据和表结构都占磁盘空间
视图    一样		虚拟的表,只有表结构占磁盘空间,数据不占。

4.视图的好处

1.简化代码书写

5.修改视图

1.方式一:存在视图就修改,不存在就创建。

-- 案例:修改上述视图country_city_view,
-- select语句变为查询城市名是上海的城市信息和所属国家信息
create or replace view country_city_view
as
select country.country_name,city.*
from country 
inner join city 
on country.country_id = city.country_id
where city.city_name='上海';

select * from country_city_view;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Dd5nu23-1607007158633)(/image-20200831155908769.png)]

说明:上述存在视图就修改,不存在就创建。

2.方式二:存在就修改,不存在就报错。

-- 案例:修改上述视图city_country_view,
-- select语句变为查询城市名是北京的城市信息和所属国家信息
alter view country_city_view
as
select country.country_name,city.*
from country 
inner join city 
on country.country_id = city.country_id
where city.city_name='北京';
select * from country_city_view;

6.查看视图

1.使用可视化工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKtlZMl9-1607007158634)(/image-20200831160450852.png)]

2.使用命令:

show tables;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nCwCZ1Tv-1607007158635)(/image-20200831160624245.png)]

3.查看视图结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MiTGuto2-1607007158635)(/image-20200831160705983.png)]

4.查看创建视图的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zUI0qcTh-1607007158636)(/image-20200831160837344.png)]

说明:\G查询格式化显示。

7.删除视图

删除 country_city_view 视图

drop view country_city_view;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKbsDh33-1607007158636)(/image-20200831161005686.png)]

6.触发器(了解)

1.介绍

触发器只是针对增删改语句的,触发器类型由三种:insert delete update。给某张表的多行数据绑定一个触发器,然后对某行进行操作就会执行该触发器的代码。

触发器一般使用在记录日志文件。

触发器类型 NEW 和 OLD的使用
INSERT 型触发器 NEW 表示将要或者已经新增的数据,插入之前没有数据,所以不能使用OLD
UPDATE 型触发器 OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
DELETE 型触发器 OLD 表示将要或者已经删除的数据,删除之后没有数据了,所以不能使用NEW

2.创建触发器

1.准备sql语句

-- 触发器
create table emp(
	id int primary key auto_increment,
    name varchar(30) not null,
    age int,
    salary int
);
insert into emp(id,name,age,salary) values(null, '金毛狮王',40,2500);
insert into emp(id,name,age,salary) values(null, '蝙蝠王',38,3100);
-- 日志表
create table emp_logs(
    id int(11) primary key auto_increment,
    operation varchar(20) not null comment '操作类型, insert/update/delete',
    operate_time datetime not null comment '操作时间',
    operate_id int(11) not null comment '操作表的ID,emp表数据的id',
    operate_params varchar(500) comment '操作参数,插入emp中的数据'
)engine=innodb default charset=utf8;

2.insert类型触发器

-- **创建 insert 型触发器,完成插入数据时的日志记录 :**
/*
	1.create trigger 属于关键字创建触发器
	2.insert_tri 表示触发器名字,属于标识符
	3.after 表示触发时机,在执行insert语句之后触发
	4.insert 触发器类型
	5.on emp 在emp表中
	6.for each row 为每一行绑定触发器 行级触发器
	6.new 表示新插入emp表中的行对象
*/
create trigger insert_tri
after insert
on emp
for each row
insert into emp_logs values(null,'insert',now(),new.id,
concat('插入之后的数据的id:',new.id,',name:',new.name,
',age:',new.age,',salary:',new.salary));
-- 向emp表中插入一行数据
insert into emp values(null, '光明左使',30,3500);

3.update触发器

创建 update 型触发器,完成更新数据时的日志记录 :

-- **创建 update 型触发器,完成更新数据时的日志记录 :**
create trigger update_tri
after update
on emp
for each row
insert into emp_logs values(null,'update',now(),new.id,
concat('[更新前的员工的id:',old.id,',name:',old.name,',age:',old.age,',salary:',
old.salary,'],[更新后的员工id:',new.id,',name:',new.name,',age:',new.age,
',salary:',new.salary,']'));

-- 更新
update emp set name='张无忌',age=20,salary=20000 where id = 3;

4.delete触发器

创建delete 行的触发器 , 完成删除数据时的日志记录 :

-- **创建delete 行的触发器 , 完成删除数据时的日志记录 :**
create trigger delete_tri
after delete
on emp
for each row
insert into emp_logs values(null,'delete',now(),old.id,
concat('删除之前员工的id:',old.id,',name:',old.name,',age:',old.age,',salary:',
old.salary));
-- 删除
delete from emp where id=3;

5.创建触发器小结

create trigger 触发器名
触发时机(before/after) 触发器类型(insert/update/delete)
on 表名
for each row
语句;

3.查看触发器

1.使用命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUId3fhV-1607007158637)(/image-20200831165447408.png)]

2.使用可视化工具:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dvOO1972-1607007158638)(/image-20200831165529439.png)]

4.删除触发器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMstscMp-1607007158638)(/image-20200831165615804.png)]

今日作业

1.mysql重点函数

2.手动控制事务

3.索引:看优缺点 创建原则 创建索引 数据结构

4.视图 创建

5.预习

y:’,
old.salary,’],[更新后的员工id:’,new.id,’,name:’,new.name,’,age:’,new.age,
‘,salary:’,new.salary,’]’));

– 更新
update emp set name=‘张无忌’,age=20,salary=20000 where id = 3;


### 4.delete触发器

**创建delete 行的触发器 , 完成删除数据时的日志记录 :**

~~~sql
-- **创建delete 行的触发器 , 完成删除数据时的日志记录 :**
create trigger delete_tri
after delete
on emp
for each row
insert into emp_logs values(null,'delete',now(),old.id,
concat('删除之前员工的id:',old.id,',name:',old.name,',age:',old.age,',salary:',
old.salary));
-- 删除
delete from emp where id=3;

5.创建触发器小结

create trigger 触发器名
触发时机(before/after) 触发器类型(insert/update/delete)
on 表名
for each row
语句;

3.查看触发器

1.使用命令

[外链图片转存中…(img-aUId3fhV-1607007158637)]

2.使用可视化工具:

[外链图片转存中…(img-dvOO1972-1607007158638)]

4.删除触发器

[外链图片转存中…(img-vMstscMp-1607007158638)]

今日作业

1.mysql重点函数

2.手动控制事务

3.索引:看优缺点 创建原则 创建索引 数据结构

4.视图 创建

5.预习

6.触发器

上一篇:关于跨域 HTTP 请求


下一篇:iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组