MySQL支持视图功能,包括可更新的视图。视图可理解为一个虚拟表,作用与真实表一样,在逻辑上可以把视图当作一个真实表使用,视图内部包含了真正的查询语句,这个查询语句可以非常复杂,但是用户并不关心这个查询语句,用户只需要查询视图,就能返回想要的数据。
1. 视图优缺点
1.1. 优点
- 简化用户的使用,复杂性隐藏在内部
- 安全性,用户只能查询或修改他们所能见到的数据
- 逻辑独立,能够屏蔽表结构变化带来的影响
1.2 缺点
- 性能较差,简单的查询也会变得比较复杂
- 修改不方便,复杂的视图很难维护
2. 创建视图
创建视图语法:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
create view创建一个新的视图,或者使用replace view 替换(修改)一个已存在的视图。
- view_name,视图名称。
- select_statement,一个select语句,用来提供视图的定义,视图中的数据由这个select语句提供。
示例:
create view v_tb as select * from tb;
- 视图位于schema命名空间,在一个数据库里,视图的名称必须唯一。
- 创建视图需要有CREATE VIEW权限以及SELECT语句中对涉及到的表的访问权限。如果使用REPLACE VIEW,需要有DROP权限。
- 视图一旦创建好,那么它的状态就是固定的,不会因为后来表的定义修改而改变。比如视图的select_statement为select * from t; 如果表t增加了一个新的字段,视图中不会新增该字段。同样如果表t删除了一个字段,查询视图则会报错。
3. 查看视图
3.1 查看数据库中有哪些视图
select * from information_schema.views where table_schema='db_name'\G
3.2 查看视图定义
show create view view_name\G
或者
show create table view_name\G
3.3 删除视图
语法:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
比如:
drop view view_tb;
4. 视图使用案例
表t为商品表,记录数量和单价,创建一个视图,在获取数量和单价的基础上,计算总价。如下:
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
5. 视图使用的一些限制
- 视图select语句不能引用系统变量或者用户自定义的变量。
- 在存储过程内部,视图select语句不能引用存储过程函数的参数和局部变量。
- 视图select语句不能引用预编译参数。
- 视图中引用的表或者视图必须存在,否则查询视图时将报错。
- 视图不能引用临时表,因此也不能创建一个临时视图。
- 不能为视图关联触发器。
- 视图select语句中字段别名最大64个字符,而不是256。