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 ;
  • 分析

posted @ 2020-06-08 11:52  贝加尔湖畔╭  阅读(228)  评论(0)    收藏  举报