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.触发器