Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101
视图
视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作
本质:【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,PyMysql是支持视图的。
仅能做查询用。
创建视图:
create VIEW stu as select * from student; # 这里只是建立了一个对应关系,视图是虚表,动态获取数据
select * from stu; # 这里只是简化了操作,实际上还是执行了select * from student
查看视图:
show TABLES # 会显示table和view视图信息
删除视图:
drop VIEW stu;
修改视图:
ALTER VIEW stu as select * from student where gender = '男';
PyMysql是支持视图的
触发器
对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器
触发器用于定制用户对表的行进行【增/删/改】前后的行为
触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。
特别的:
NEW表示即将插入的数据行,OLD表示即将删除的数据行
多行操作的时候,每一行都会进行一个轮询操作
触发器的范围: INSERT、DELETE、UPDATE
触发器的时机: BEFORE、AFTER
创建触发器: 特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON student FOR EACH ROW
BEGIN
IF NEW.gender == 'M' THEN # NEW == student
INSERT into Male_stu(sex) VALUES('M'); # 输入性别为M,则插入Male_stu
ELSE
INSERT into Feamle_stu(sex) VALUES('W');
ELSEIF
END
INSERT into student(gender, class_id, sname) values('W', 1, '哈哈哈')
注意: 更新操作需要2个值,一个NEW传入的值,一个OLD的值
删除触发器
drop TRIGGER tri_before_insert_tb1
存储过程
存储过程是一个SQL语句集合[可增删改查在一个函数里],当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行;内部可又有for等语句。
注意:执行存储过程,肯定会先执行里面的sql语句的,且只能返回一条结果集,所有有多表的联合查询操作是,最好合并为一条结果集返回。
存储过程
a. 可写复杂逻辑
b. 参数:in out inout
c. 结果集:select ...
# 创建无参数的存储过程,类似函数的创建
CREATE PROCEDURE p1()
BEGIN
select * from student;
END
# 存储过程调用
call p1() # 使用CALL 存储名即可, 执行存储过程,显示结果
删除存储过程:
drop procedure p1;
# 创建有参数的存储过程,用来执行自定义变量和获取sql集[结果集只能有一个,但可以拼接结果集]
# 对于存储过程,可以接收参数,其参数有三类:
in 仅用于传入参数用
out 仅用于返回值用,在内部直接赋值后外部调用可以直接获取到内容[Mysql自动帮我们建立链接关系]
inout 既可以传入又可以当作返回值
create procedure p3(in i1 int,in i2 int,inout i3 int, out r1 int)
BEGIN
DECLARE temp1 int; # DECLARE声明变量,且存储过程里面必须使用
DECLARE temp2 int default 0; # 声明默认变量值
set temp1 = 1;
set r1 = i1 + i2 + temp1 + temp2;
set i3 = i3 + 100; # 功能一:自定义的函数操作
select * from student; # 功能二:查询并返回结果集,且一次只能返回一个,但可以拼接结果集
END; # 注意封号是用来执行结果的,没有封号则不会在执行存储
-- 执行存储过程: 使用CALL 存储名即可
set @t1 =4; # 必须带@符号
set @t2 = 0;
CALL p3 (1, 2 ,@t1, @t2); # 执行存储,并且自动返回了select * 的结果结合
SELECT @t1,@t2; # 单独执行此行,仅仅返回了自定义的函数结果
事务:Innodb支持事务
事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。
delimiter \ \
create
PROCEDURE
p1(
OUT
p_return_code
tinyint
)
BEGIN
DECLARE
exit
handler
for sqlexception
BEGIN
-- ERROR
set
p_return_code = 1;
rollback;
END; DECLARE
exit
handler
for sqlwarning
BEGIN
-- WARNING
set
p_return_code = 2;
rollback;
END; START
TRANSACTION;
DELETE
from tb1; insert
into
tb2(name)
values('seven');
COMMIT; -- SUCCESS
set
p_return_code = 0; END\ \
delimiter; 支持事务的存储过程
函数
函数: 内置函数 + 自定义函数
内置函数:
SELECT 1;
select CHAR_LENGTH('hello world'); #11,返回字符长度
SELECT CONCAT('hello ','world ','2017'); # hello world 2017,字符拼接
SELECT CONCAT_WS('_','hello ','world ','2017'); #hello _world _2017,添加了分隔符的字符拼接
SELECT CONV('8', 10, 2); #1000, 进制转换 10进制转化2进制
SELECT FORMAT(123456.2,2);#123,456.20 小数点后保留2位
SELECT LOWER('HELLO'); # 大写变小写
SELECT UPPER('hello'); # 小写变大写
SELECT INSERT('hello',0,2,'YY'); # 不更改,所以说明字符的替换是从第一个位置开始的
SELECT INSERT('hello',1,2,'YY'); # YYllo,从第一个位置开始替换
# 特别的:
# 如果pos超过原字符串长度,则返回原字符串
# 如果len超过原字符串长度,则由新字符串完全替换
SELECT INSTR('hello','e'); # 2, 返回e出现的索引位置
SELECT LEFT('hello', 3); #hel, 获取前3个字符
SELECT RIGHT('hello',3); #llo, 从右边取出3个值
SELECT SUBSTRING('hello',1,3); #hel, 默认从第一个位置开始取
SELECT TRIM(' ' ' hello ')# hello, 移除左右的空格
SELECT LTRIM(' hello world '); #helloworld,其引导空格字符被删除。
SELECT RTRIM(' hello world'); #hello world,结尾空格字符被删去
SELECT LOCATE('ll','hello'); # 3, 返回字符串所在的位置
SELECT REPEAT('h',5) #hhhhh, 重复前面的字符n次
SELECT REPLACE('hello','ll','yy')#heyyo, 替换字符
SELECT REVERSE('hello') #olleh, 字符反转
SELECT SPACE(2)# 返回2个空格
自定义函数:函数仅仅支持传递参数,返回一个结果,不允许写sql,不支持返回结果集
创建函数:
create function f1(i1 int,i2 int) # 传递2个参数
returns int # 返回结果,类似Java publist int f1(int i1, int i2)
BEGIN # 函数内容,函数内容不允许写sql, 不允许获取结果集
declare num int;
set num = i1 + i2;
# declare a int; # 函数里利用 select into 也可以实现赋值的操作
# select nid into a from student where name = 'hhh'; # 将nid值赋给a
return(num); # 返回结果
END;
执行函数:
SELECT f1(2,3) # 5
删除函数:
drop function f1;
函数和存储过程的区别:
执行计划
相对比较准确表达出当前SQL运行状况,根据参考信息可以进行SQL优化一般显示All/Index的时候,效率不高,因为All 是全数据表扫描,index是全索引表扫描,而且rows里面的数据都是相对的,不是很准确。
- limit 的好处,找到第一个后就不在继续查找,效率相比较高
select * from tb1 where email='123' -->[不推荐]
select * from tb1 where email='123' limit 1; -->[推荐]
EXPLAIN select sid from student;
EXPLAIN select sid from student;
EXPLAIN select sid from student limit 1; # 也是从表扫描,但是找到第一条后,后面就不执行了
EXPLAIN select sid from student where sid < 12;[所以创建表的时候,可以考虑将列设置为索引]
对SQL进行优化
- 对需要进行范围查找的列进行索引设置,因为在查找 <, <= 等进行操作的时候,使用的是Range范围查找,但是对于>, !=进行操作的时候,又是全局查找了
- 对于全表查找,最好加上limit, 因为有了limit查找到了数据后,就不在继续向下查找了
- 查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system / const
- 避免使用select *
- count(1)或count(列) 代替 count(*)
- 创建表时尽量时 char 代替 varchar[char:定长用于固定长度的表单提交数据存储效率高, varchar:不定长,效率偏低]
- 表的字段顺序固定长度的字段优先[varchar, text是不定长]
- 组合索引代替多个单列索引(经常使用多个条件查询时,组合索引比单独索引的合并快)
- 尽量使用短索引[指定列的某几个字符为索引]
- 使用连接(JOIN)来代替子查询(Sub-Queries)
- 连表时注意条件类型需一致
- 索引散列值(重复少)不适合建索引,例:性别不适合
【更多参考】http://www.cnblogs.com/wupeiqi/articles/5713323.html -->视图
【更多参考】http://www.cnblogs.com/wupeiqi/articles/5716963.html -->索引
【更多参考】http://www.cnblogs.com/wupeiqi/articles/5716963.html -->索引补充
Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101的更多相关文章
- MySQL 索引 视图 触发器 存储过程 函数
1.索引 索引相当于图书的目录,可以帮助用户快速的找到需要的内容. 数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万 ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- day40 mycql 视图,触发器,存储过程,函数
视图,触发器,存储过程,自定义函数 -- 回顾 1.mysql 约束 1.非空 not null 2. 主键约束 primary key 3. 唯一约束 unique 4. 外键约束 foreign ...
- Mysql 视图,触发器,存储过程,函数,事务
视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...
- mysql事务,视图,触发器,存储过程与备份
.事务 通俗的说,事务指一组操作,要么都执行成功,要么都执行失败 思考: 我去银行给朋友汇款, 我卡上有1000元, 朋友卡上1000元, 我给朋友转账100元(无手续费), 如果,我的钱刚扣,而朋友 ...
- SQL Server如何查看存储过程的执行计划
有时候,我们需要查看存储过程的执行计划,那么我们有什么方式获取存储过程的历史执行计划或当前的执行计划呢? 下面总结一下获取存储过程的执行计划的方法. 1:我们可以通过下面脚本查看存储过程的执行计划,但 ...
- MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能
一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...
- mysql视图 触发器 事物 函数 存储过程
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...
随机推荐
- PHP面向对象的基本思路
第一步:识别对象 ——任何实体都可以被识别为一个对象 第二步:识别对象的属性 ——对象里面存储的数据被识别为属性 ——对于不同的业务逻辑,关注的数据不同,独享里面存储的属性也不同 第三步:识别对象的行 ...
- CSS生成小三角
前言:小三角的应用场景:鼠标移动到某个按钮上面,查看信息详情时,信息详情弹出框有时候会需要一个小三角. 代码如下: <div id='triangle'></div> #tri ...
- Log4J 配置文件模板及代码说明
相对而言,这个日志系统的配置就没那么随意了,而且有些功能用起来也不是那么爽,譬如动态读取配置文件.不过鉴于使用这个日志的系统还是很多,所以也写一个demo贴出来,风格跟log4j2一样,配置的说明全在 ...
- Unity Github 项目收集
http://gad.qq.com/article/detail/24048 重磅推荐: Github 热门 Unity Assets 查询:http://unitylist.com/browse 最 ...
- Apache 反向代理 丢失Authorization
我后端API的服务器是Tomcat,而后端API验证是通过存放在头部Authorization的token值进行验证的. 我在测试Apache作为前端html解析的服务器时, 利用反向代理,把Api请 ...
- 架构实战项目心得(十):基于spring-ladp的统一用户中心结构设计以及代码结构设计
一.目录设计 1 公司 2 部门 3 注册人员 4 层级人员 二.规则 1 注册 自行注册人员放到模拟公司的目录下,等所属公司组织结构建立完毕,将此人员迁移到所属公司(或者删除此人员,所属公司新建此人 ...
- awk中引用变量使用单引号''
举例如下 who命令输出第一列 (1)第一种情况不使用引号 # i=1;who | awk '{print $${i}}' 输出如下: awk: {print $${i}} awk: ...
- 使用Myeclipse进行简单webservice开发的示例
(转) http://blog.csdn.net/changhenshui1990/article/details/70142371 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...
- Oracle中Merge into的用法实例讲解
最近在做一个需求,就是涉及到表的问题,前端传过来一条数据,根据主键,查询数据库,如果不存在,那么久插入到数据库中一条,如果存在的话,就是以主键的方式,对数据库中的数据,进行更新. 拿到这个需求的时候, ...
- ApplicationContextInitializer接口
一.简述 ApplicationContextInitializer是Spring框架原有的概念, 这个类的主要目的就是在 ConfigurableApplicationContext类型(或者子类型 ...