MySQL-07-视图-游标
9、6.5
一些真实开发中用不到的知识,但是对理解MySQL有帮助,也对笔试面试有帮助
1、视图
- 概念:视图就相当于一个虚表,其实本质就是一个查询,我们不可以插入删除等,但是它会随着创建它的select的结果改变而改变,所以它本质上就是一个查询
-- 创建视图的语法
INSERT INTO teacher (tname) VALUES ("张老师"),("郭老师");
CREATE VIEW v1 as (SELECT * FROM teacher WHERE tid > 2);
-- 调用
SELECT * FROM v1;
2、函数
在MySQL中调取函数都是用,select + 函数名;
分两类:
-
系统函数:
-
select CURDATE() : 获取当前时间
-
我们记住一个很重要的,常用:日期格式的,DATE_FORMAT(表示日期的那一列,“%Y-%m”)
- %Y表示显示四位数的年,%y年份的后两位
- %m月份
blog
id title ctime
1 asdf 2019-11
2 asdf 2019-11
3 asdf 2019-10
4 asdf 2019-10我们在分组查询的时候这么用,可以根据月份分组
select ctime,count(1) from blog group ctime select DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m") 2019-11 2 2019-10 2
-
-
自定义函数
格式: -- 系统函数
-- 自定义函数,格式如下 delimiter \\ CREATE FUNCTION f1( a INT, b INT ) returns INT BEGIN DECLARE sum INT DEFAULT 0; SET sum = a + b; RETURN (sum); end \\ delimiter ; SELECT f1(1,100);
3、存储过程(相对重要)
-
概念:
存储过程顾名思义,就是我们定义一段存储过程,可以供外界直接调用,相当于替我们完成一个或几个功能的代码块,可以让后端程序员不用写sql语句,把sql语句都交给DBA统一管理
-
优点
- 减少了代码的耦合
- 增加了性能,因为我们不用传递很长的sql语句到服务端,而只需要传递一个指令,MySQL服务端拿到指令调用相关sql
-
缺点:
- 一般公司DBA少,并且比较忙
- 我们现在公司都是程序员写代码,然后有个快慢日志由DBA审查sql的性能,性能不好了在帮你修改
1、格式
关键字:procedure:程序、手续的意思
-- 1、简单的
1. 简单
-- 定义存储过程:就是一坨sql语句
delimiter \\
CREATE PROCEDURE p1()
BEGIN
SELECT * FROM student;
INSERT INTO teacher (tname) VALUES ("黄老师");
END\\
delimiter ;
CALL p1();
SELECT * FROM teacher;
2、复杂
我们看到p1后由括号,肯定可以传递参数
存储过程有三种参数:
-
in 传入的
-
out 可以传出的:像函数的返回值
1、定义变量:set @v1 = 10; set (@)变量名 = ??
2、call调用
3、查询参数 select 参数
-- 2、复杂的 delimiter // CREATE PROCEDURE p2( in a INT, OUT b INT ) BEGIN SELECT * FROM teacher WHERE tid > a; SET b = 10000; END// delimiter ; SET @v1 = 10; CALL p2(3, @v1); SELECT @v1;out 的真正用处,也就是为什么有out
是因为事务的关系,我们在全部执行成功的时候把out设置成1,失败设置成0,就可以在外面指定这个存储过程有没有执行成功
具体做法:
delimiter \\ create PROCEDURE p5( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception //声明如果发生异常 BEGIN -- ERROR:执行错误的时候,回滚并且设置标志为1 set p_return_code = 1; rollback; END; START TRANSACTION; DELETE from tb1; insert into tb2(name) values('seven'); COMMIT; set p_return_code = 2; //成功设置为2 END\\ delimiter ; -
inout :
4、触发器
概念:在执行某一操作的前或后会执行另一些操作
-- delimiter //
-- create trigger t1 BEFORE INSERT on student for EACH ROW
-- BEGIN
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- END //
-- delimiter ;
--
-- insert into student(gender,class_id,sname) values('女',1,'陈涛'),('女',1,'张根');
-- NEW,代指新数据
-- OLD,代指老数据
10、6.6
今日所学:
1、游标
什么时候用游标?
当我们连续造作两列时,比如两列的和,两列字符串的拼接
用到的时候直接拿来用
这是sql代码:
delimiter //
create procedure p6()
begin
declare row_id int; -- 自定义变量1
declare row_num int; -- 自定义变量2
declare done INT DEFAULT FALSE;
declare temp int;
declare my_cursor CURSOR FOR select id,num from A;
declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
open my_cursor;
xxoo: LOOP
fetch my_cursor into row_id,row_num;
if done then
leave xxoo;
END IF;
set temp = row_id + row_num;
insert into B(number) values(temp);
end loop xxoo;
close my_cursor;
end //
delimter ;
- 分析


浙公网安备 33010602011771号