技术问题-视图和游标

484 阅读3分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

请简述视图是什么?

什么是视图

视图是虚拟表,实际上并不存在,不包含数据,只是根据创建语句中的select语句将对应的表中数据虚拟聚合到了一起,访问时和真正的数据表访问方法是一样的。

创建视图的语法

mysql

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
   [WITH [CASCADED | LOCAL] CHECK OPTION]

oracle

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
    [(alias[, alias]...)]

AS subquery
     [WITH CHECK OPTION [CONSTRAINT constraint]]
     [WITH READ ONLY]

总结起来都是

create View viewname as select ~

视图的优点

image.png

  1. 简单:对于程序员而言,可以直接调用此视图获取对应数据,对于后面对应的表结构,关联和筛选条件不用关心
  2. 安全:可以单独给用户设置权限,因为我们不能对表中某行某列进行权限限制,但可以给用户设计
  3. 数据独立:一旦视图的结构确定了,那么我们就可以屏蔽表结构变化对用户的影响,源表的列增加对视图无影响。

视图的缺点

image.png

  1. 无法追溯:因为我们的视图是放在数据库中的,对于视图的修改就不会有记录。如果被人修改无法立刻追溯到是谁修改的,而如果使用代码拼接数据,那么每次对代码的更改,都可以被代码管理工具记录下来!
  2. 修改限制:我们如果想修改对应的某些行时,如果是较为复杂的视图,比如有Group By或者Union之类的语句时,再想修改就变得十分困难。
  3. 性能损失:当我们使用这个视图时,视图中的字段我们不可能都用到,有的时候就会将大量的无用数据返回回来,浪费内存和带宽。

游标是什么?

什么是游标

游标(Cursor)是存储在MySQL服务器上的数据库查询,游标一般在存储过程中使用,用来对存储过程中select语句检索出来的结果集做行遍历时使用。有点像指针,指向哪一行,就可以对此行进行处理。

优缺点

优点:可以针对每一行,做自己想做的事操作 缺点:数据量过大时,遍历非常耗时,现在一般都是拿到服务器的内存中用代码遍历的。

使用游标的步骤

定义游标->打开游标->使用游标->关闭游标 1.定义游标

DECLARE cursor_name CURSOR FOR select_statement;

游标要在变量和条件声明的后面,可以声明多个游标
2.打开游标

OPEN cursor_name;

3.使用游标

FETCH  cursor_name INTO var_name [, var_name] ...

一次从结果中拿一行,把需要的数据保存在各个定义的变量中。 拿完一行会自动到下一行中 4.关闭游标

CLOSE cursor_name;

一个简单的游标例子

DELIMITER $$ 
CREATE PROCEDURE build_title_list (INOUT title_list varchar(4000)) 
BEGIN 
DECLARE v_finished INTEGER DEFAULT 0; 
DECLARE v_title varchar(100) DEFAULT ""; 
-- declare cursor for film title 
DEClARE title_cursor CURSOR FOR SELECT title FROM film; 
-- declare NOT FOUND handler 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; 
OPEN title_cursor; 
get_title: LOOP 
FETCH title_cursor INTO v_title; 
IF v_finished = 1 THEN 
LEAVE get_title; 
END IF; 
-- build title list 
SET title_list = CONCAT(v_title,";",title_list); 
END LOOP get_title; 
CLOSE title_cursor; 
END$$ 
DELIMITER ;

调用

SET @title_list = "";
CALL build_title_list ( @title_list );
SELECT
	@title_list;

image.png