Mysql学习---视图/触发器/存储过程/函数/索引 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;                  # 单独执行此行,仅仅返回了自定义的函数结果

Mysql学习---使用Python执行存储过程

事务: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;

函数和存储过程的区别:

【更多参考】http://www.cnblogs.com/wupeiqi/articles/5713323.html   -->视图

【更多参考】http://www.cnblogs.com/wupeiqi/articles/5716963.html   -->索引

【更多参考】http://www.cnblogs.com/wupeiqi/articles/5716963.html   -->索引补充

原文地址:https://www.cnblogs.com/ftl1012/p/9385247.html

时间: 2024-10-20 22:22:16

Mysql学习---视图/触发器/存储过程/函数/索引 180101的相关文章

视图 触发器 存储过程 函数 流程过程 索引 慢查询

视图 触发器 存储过程 函数 流程过程 索引 慢查询 视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 ? 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调

Mysql学习笔记(八)索引

原文:Mysql学习笔记(八)索引 PS:把昨天的学习内容补上...发一下昨天学的东西....五月三日...继续学习数据库... 学习内容: 索引.... 索引的优点: 1.通过创建唯一索引,可以保证数据库每行数据的唯一性... 2.使查找的速度明显加快... 3.当使用分组和排序进行查询时,可以缩短时间... 索引的缺点: 1.维护索引需要耗费数据库的资源... 2.索引需要占用磁盘空间... 3.对表进行增删改的时候,由于索引的存在,时间会有所增加... 索引的分类... 普通索引和唯一索引

MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化

视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调: (1)在硬盘中,视图只有表结构文件,没有表结构数据 (2)视图通常是用于查询,尽量不要修改视图中的数据 dro

Mysql之视图 触发器 事务 存储过程 函数

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql> se

mysql 查询表,视图,触发器,函数,存储过程

1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TABLE_TYPE ='BASE TABLE' mysql查询建表语句: show create table `表名` 2.mysql查询所有视图: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名'

数据库 --- 40 视图 触发器 存储过程 事务 函数

一.视图  (view) 视图是一种虚拟表,可以把查询出来的临时表保存下来 1.创建视图 2.删除视图 3.修改视图,(原始表的记录也跟着修改) 4.查看视图 二.  触发器(trigger)可进行  增删改  操作 1.创建触发器 2.删除触发器 实例: 三.存储过程  1. 优点: 缺点: 2.程序与数据库结合使用的三种方式 3.创建简单存储过程(无参) 4.创建存储过程(有参) ① in  传入参数 ② out  返回值 #查看存储过程的一些信息:show create procedure

视图 触发器 事务 函数 存储过程

1.视图 视图是一个虚拟表(非真实存在).使用视图我们可以把查询过程中的临时表摘出来,用视图去实现. 视图有明显的效率问题,而且使用视图会过分依赖视图,强耦合,这样意味着扩展sql极为不便,因此不推荐使用 创建视图,使用视图 DROP VIEW teacher_view 删除视图 DROP VIEW teacher_view 2.使用触发器可以定制用户对某张表进行增删改操作前后的行为,注意:没有查询 delimiter // create trigger t1 BEFORE INSERT on

我的MYSQL学习心得(九) 索引

这一篇<我的MYSQL学习心得(九)>将会讲解MYSQL的索引 索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节. 大多数存储引擎有更高的限制.MYSQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关: MYISAM和InnoDB存储引擎只支持BTREE索引:MEMORY和HEAP存储引擎可以支持H

字符集,索引,视图,存储过程函数,变量,条件,光标,流程,事件,触发器

/*********************字符集(character)与校对规则(collation)****************************/ 说明:字符集用来定义MySQL存储字符串的方式,校对规则用来定义比较字符串的方式:MySQL支持不同服务器,不同数据库,不同的表,不同的字段指定不同的字符集:一种字符集可以对应多种校对规则 创建对象时指定字符集,校对规则可以查看help craete object: 查看所有可用字符集: show character set; des