文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL之视图、触发器、事务、索引及其他知识补充

2020-01-27 14:54

关注

MySQL之视图、触发器、事务、索引及其他知识补充

一、视图

视图是将SQL语句的查询结果当做虚拟表实体化保存起来,以后可以反复使用

create view teacher2course as
select * from teacher inner join course on teacher.tid = course.teacher_id;

drop view teacher2course;
-- 视图使用频率不高

二、触发器(trigger)

触发器:满足特点条件之后自动执行。
在MySQL只有三种情况下可以触发:

语法结构

create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
begin
	sql语句
end

触发器名字在命名的时候推荐使用如下方式:

tri_after_insert_t1、tri_before_delete_t1

如何临时修改SQL语句的结束符:

delimiter $$

在MySQL中NEW特指数据对象可以通过点的方式获取字段对应的数据

id    name	pwd  hobby
1     jason  123  read
NEW.name  >>>  jason

案例:

CREATE TABLE cmd (
    id INT PRIMARY KEY auto_increment,
    USER CHAR (32),
    priv CHAR (10),
    cmd CHAR (64),
    sub_time datetime,   -- 提交时间
    success enum ("yes", "no")   -- 0代表执行失败
);

CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
);

delimiter $$  -- 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
    if NEW.success = "no" then  -- 新记录都会被MySQL封装成NEW对象
        insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
    end if;
end $$
delimiter ;  -- 结束之后记得再改回来,不然后面结束符就都是$$了


-- 往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)
VALUES
    ("tony","0755","ls -l /etc",NOW(),"yes"),
    ("tony","0755","cat /etc/passwd",NOW(),"no"),
    ("tony","0755","useradd xxx",NOW(),"no"),
    ("tony","0755","ps aux",NOW(),"yes");

-- 查询errlog表记录
select * from errlog;
-- 查看触发器
show triggers;
-- 删除触发器
drop trigger tri_after_insert_cmd;

三、事务(重要)

3.1 四大特性(ACID)

3.2 事务相关操作

start transcation;  -- 开启事务
  	诸多SQL操作
rollback;  -- 回滚到操作之前的状态
commit;  -- 确认事务操作,之后不能回滚

示例如下 :

create table user(
id int primary key auto_increment,
name char(32),
balance int
);

insert into user(name,balance)
values
("jason",1000),
("egon",1000),
("tank",1000);

-- 修改数据之前先开启事务操作
start transaction;

-- 修改操作
update user set balance=900 where name="jason";   -- 买支付100元
update user set balance=1010 where name="egon";   -- 中介拿走10元
update user set balance=1090 where name="tank";   -- 卖家拿到90元

-- 回滚到上一个状态
rollback;

-- 开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
commit;
"""开启事务检测操作是否完整,不完整主动回滚到上一个状态,如果完整就应该执行commit操作"""

站在python代码的角度,应该实现的伪代码逻辑:

try:
    update user set balance=900 where name="jason"; #买支付100元
    update user set balance=1010 where name="egon"; #中介拿走10元
    update user set balance=1090 where name="tank"; #卖家拿到90元
except 异常:
    rollback;
else:
    commit;

四、存储过程

类似于python中的自定义函数。

4.1 无参存储过程

delimiter $$
create procedure p1()
begin
	select * from user;
end $$
delimiter ;
-- 调用
call p1();

4.2 有参存储过程

delimiter $$
create procedure p2(
    in m int,  -- in表示这个参数必须只能是传入不能被返回出去
    in n int,  
    out res int  -- out表示这个参数可以被返回出去,还有一个inout表示即可以传入也可以被返回出去
)
begin
    select * from user where id > m and id < n;
    set res=0;  -- 用来标志存储过程是否执行
end $$
delimiter ;

4.3 python代码操作存储过程

import pymysql

conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    passwd="456852",
    db="db6",
    charset="utf8",
    autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.callproc("p2",(1,3,10))
# @_p1_0=1,@_p1_1=3,@_p1_2=10;
print(cursor.fetchall())

五、函数

相当于Python中的内置函数。

ps:可以通过 help 函数名 查看帮助信息!

六、流程控制

-- if判断
if i = 1 THEN
       SELECT 1;
ELSEIF i = 2 THEN
       SELECT 2;
ELSE
       SELECT 7;
END IF;

-- while循环
SET num = 0 ;
WHILE num < 10 DO
    SELECT
        num ;
    SET num = num + 1 ;
END WHILE ;

七、索引与慢查询优化(重要)

索引可以简单的理解为帮助你加快数据查询速度的工具,也可以把索引比喻成书的目录。

索引的建立涉及到几种数据结构:

将某个字段添加成索引就相当于依据该字段建立了一颗B+树,从而加快查询速度。

如果某个字段没有添加索引,那么依据该字段查询数据会非常的慢(遍历查找)。

7.1 索引分类

  1. primary key

    主键索引除了有加速查询的效果之外,还具有一定的约束条件;

  2. unique key

    唯一键索引,除了有加速查询的效果之外,还具有一定的约束条件;

  3. index key

    普通索引,只有加速查询的效果,没有额外约束条件;

注意外键 foreign key 不是索引,它仅仅是用来创建表与表之间关系的。

7.2 创建索引

-- 创建唯一索引需要提前排查是否有重复数据
select count(字段) from 表名;
select count(distinct(字段)) from 表名;

-- 查看当前表内部索引值
show index from 表名;
	
-- 创建主键索引
alter table t1 add primary key pri_id(id);
	
-- 创建唯一索引
alter table t1 add unique key uni_age(age);

-- 创建普通索引
alter table t1 add index idx_name(name);

-- 前缀索引(属于普通索引)
"""
避免对大列建索引,如果有就使用前缀索引
eg:博客内容 百度搜索内容等
"""
alter table t1 add index idx_name(name(4));

-- 联合索引(属于普通索引,遵循最左匹配原则)
alter table t1 add index idx_all(name,age,sex);

-- 删除索引
alter table t1 drop index 索引名(idx_name、idx_all...);

7.3 explain句式

explain 就是帮助我们查看SQL语句属于那种扫描。

常见的索引扫描类型:

  1. index
  2. range
  3. ref
  4. eq_ref
  5. const
  6. system
  7. null

从上到下,性能从最差到最好,生产环境下认为至少要达到range级别。

不走索引情况(熟悉四条及以上):

索引的创建会加快数据的查询速度,但是一定程度会拖慢数据的插入和删除速度。

八、隔离级别

在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改。

InnoDB支持所有隔离级别:set transaction isolation level

原文地址:https://www.cnblogs.com/JZjuechen/archive/2022/02/24/15929882.html

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯