这是我参与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 ~
视图的优点
- 简单:对于程序员而言,可以直接调用此视图获取对应数据,对于后面对应的表结构,关联和筛选条件不用关心
- 安全:可以单独给用户设置权限,因为我们不能对表中某行某列进行权限限制,但可以给用户设计
- 数据独立:一旦视图的结构确定了,那么我们就可以屏蔽表结构变化对用户的影响,源表的列增加对视图无影响。
视图的缺点
- 无法追溯:因为我们的视图是放在数据库中的,对于视图的修改就不会有记录。如果被人修改无法立刻追溯到是谁修改的,而如果使用代码拼接数据,那么每次对代码的更改,都可以被代码管理工具记录下来!
- 修改限制:我们如果想修改对应的某些行时,如果是较为复杂的视图,比如有Group By或者Union之类的语句时,再想修改就变得十分困难。
- 性能损失:当我们使用这个视图时,视图中的字段我们不可能都用到,有的时候就会将大量的无用数据返回回来,浪费内存和带宽。
游标是什么?
什么是游标
游标(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;