1. 视图的定义
视图是一个由查询语句定义数据内容的表。表中的数据内容就是SQL查询语句的结果集。
视图是虚拟的表
视图总是显示最近的数据。当用户查询视图时,数据库都将重建数据
2. 视图的创建/修改和删除
2.1 视图的创建
语法
create [algorithm={undefined / merge / temptable}]
view view_name as
select column_name(s) from table_name
[with [cascaded / local] check option];
- algorithm: 可选,表示视图选择的算法
- undefined: mysql自动选择使用的算法
- merge: 表示将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
- temptable: 表示将视图的结果存入临时表,然后使用临时表执行语句
- view_name: 视图的名称,可包含属性列表
- column_name(s) : 查询的字段,也就是视图的列名。
- table_name: 从哪个数据库获取数据
- with check option: 可选,表示更新视图时要保证在视图的权限范围内。
- caseaded: 表示更新视图要满足所有相关视图和表的条件才进行更新
- local: 表示更新视图时,要满足该视图本身定义的条件即可更新
with check option虽是可选属性,为了数据安全,建议使用
示例1
create view kcmc
as select sid from student
with local check option;
默认档期数据库下创建视图,可以指定:db_name.view_name
如:create view test.v as select * from t;
数据库不能包含具有相同名称的表和视图
视图能够引用表或其他数据库中的视图
能够使用联合/UNION和子查询
示例2
CREATE TABLE t(
qty INT,
price INT
);
INSERT INTO t VALUE(3, 50);
--创建视图
CREATE VIEW v AS SELECT qty, price, qty*price AS VALUE FROM t;
SELECT * FROM v;
视图定义服从以下限制:
- select语句不能包含from子句中的子查询
- select语句不能引用系统或用户变量
- select语句不能引用预处理语句参数
- 在存储子程序内,定义不能引用子程序参数或局部变量
- 定义中引用的表或视图必须存在。但是,创建视图后,能够舍弃定义引用的表或视图。可以使用check table语句,检查视图定义是否存在这类问题
- 定义中不能使用temporary表,不能创建temporary视图
- 定义中命名的表必须已存在
- 不能将触发程序与视图关联在一起
- 视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略
- 对应定义中的其他选项或子句,他们将被增加到引用视图的语句的选项或子句中,但效果未定义。
- 如果创建了视图,并通过更改系统变量更改了查询处理环境,会影响从视图获得的结果
2.2 视图的修改
当视图定义的数据表发生了变化,需要对视图进行修改来保证查询的正确进行
视图存在,进行修改,视图不存在,创建视图
语法
create or replace [algorithm={undefined / merge / temptable}]
view view_name[(属性清单)] as
select column_name(s) from table_name
[with [cascaded / local] check option];
- 属性清单:可选,指定视图中各个属性的名词,默认情况,与select语句中查询的属性相同
示例
create or replace view kcmc(学生ID, 学生姓名)
as select sid, sname from student
with local check option;
2.3 删除视图
删除视图不会删除数据,只是删除视图的结构定义
语法
drop view [if exists] view_name [, view_name1, view_name2...]
示例
drop view kcmc;
3. 视图的使用
/**** 1、创建和删除视图 ****/
// 创建视图(指定某些字段,显示字段时重命名),后面还可以接WHERE进行条件查询
CREATE VIEW v1(b,a) AS SELECT bookName, author FROM t_book;
// 通过视图来查询(只能查询到指定的字段,提高了安全性)
SELECT * FROM v1;
// 删除视图(视图只是一种虚拟的表,删除视图对原来的数据表没有影响)
DROP VIEW IF EXISTS v1;
/**** 2、查看视图 ****/
// 查看视图
desc v1;
// 查看视图基本信息
SHOW TABLE STATUS LIKE 'v1';
// 查看视图详细信息
SHOW CREATE VIEW v1;
/**** 3、修改视图 ****/
// 修改视图
CREATE OR REPLACE VIEW v1(b,p) AS SELECT bookName, price FROM t_book;
ALTER VIEW v1 AS SELECT * FROM t_book;
/**** 4、更新视图 ****/
// 向视图中插入数据(其实就是在表中插入数据)
INSERT INTO v1 VALUES ( "6", "中国历史", "MK", "45", "4");
// 更新视图的数据
UPDATE v1 SET price=54 WHERE id=6;
// 删除视图的数据
DELETE FROM v1 WHERE id=6;