brief
在 MySQL 中,视图(View)是一种虚拟的表格,它是由一个 SQL 查询语句所定义的。视图通常基于一个或多个实际存在的表格,并且可以与这些表格进行交互操作,就像真实的表格一样。
MySQL 视图是一个存储在数据库中的命名查询结果集。当您创建视图时,它会将查询结果作为表格存储在数据库中,并赋予该结果集一个名称。在后续的查询中,您可以使用该名称来引用视图,从而简化了复杂查询的编写过程。
视图可以像任何其他表格一样被查询和操作。它们支持 SELECT、INSERT、UPDATE 和 DELETE 等操作,但是并不是实际的物理表格,而是通过对底层数据表格执行 SELECT 查询语句来创建的虚拟表格。
视图具有以下优点:
-
简化复杂的查询:您可以使用视图来保存常用的、复杂的查询,以便在需要时直接使用视图来查询数据,无需每次都重新编写查询。
-
提高数据的安全性:通过视图,您可以限制某些用户只能访问特定的列或行,从而提高数据的安全性。
-
提高数据的组织性:使用视图可以使数据更易于组织和管理,因为您可以将相关的数据组合在一起,并且可以根据需要自定义视图的列和排序方式。
-
提高性能:使用视图可以减少重复数据的存储,从而提高查询的性能。此外,当您在视图上执行 SELECT 查询时,MySQL 可以优化查询计划,从而提高查询性能。
但是,视图也有一些限制。例如,它们不能包含临时表格或用户变量,也不能使用 IN 和 OUT 参数。此外,如果视图的查询语句非常复杂,则可能会影响查询的性能。
代码演示
select cust_name,cust_contact
from customers,orders,orderitems
where customers.cust_id = orders.cust.id
and orderitems.order_num = orders.order_num
and prod_id = 'TNT2';
现在,假如可以把整个查询包装成一个名为productviews的虚拟表,则可以如下轻松地检索出相同的数据:
productviews是一个视图,作为视图,它不包含表中应该有的任何列或数据,它包含的是一个SQL查询.
select cust_name,cust_contact
from productsviews
where prod_id = 'TNT2';
视图的创建
-
视图用CREATE VIEW语句来创建
-
使用SHOW CREATE VIEW viewname;来查看创建视图的语句
-
用DROP删除视图,其语法为DROP VIEW viewname
-
更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图
-
利用视图简化复杂的联结
视图的最常见的应用之一是隐藏复杂的SQL,这通常都会涉及联结。请看下面的例子:
CREATE VIEW productsviews AS
SELECT cust_name,cust_contact,prod_id
FROM customers,orders,orderitems
where customers.cust_id = orders.cust.id
and orderitems.order_num = orders.order_num;
# 这条语句创建一个名为productviews的视图, 它联结三个表,以返回已订购了任意产品的所有客户的列表# 下面既可以使用视图了
SELECT cust_name,cust_contact
from productview
where prod_id = 'TNT2';
感觉就像是 封装好的 可重复使用的函数一样!
- 用视图重新格式化检索出来的数据
select Concat(RTrim(vend_name),'(',RTrim(vend_country),')')
AS vend_title
from vendors order by vend_name;# 把他封装成view
Create view vendoorlocation AS
select Concat(RTrim(vend_name),'(',RTrim(vend_country),')')
AS vend_title
from vendors order by vend_name;
- 用视图过滤不想要的数据
CREATE VIEW customeremail AS
SELECT cust_id,cust_name,cust_email
FROM customers
WHERE cust_email IS NOT NULL;SELECT * FROM customeremail;
- 使用视图与计算字段
# 使用计算字段
select prod_id,quantity,item_price, quantity*item_price AS expanded_price
from orderitems
where order_num = 2005;# 将其转化为计算字段
CREATE VIEW orderitemsexpanded AS
select prod_id,quantity,item_price, quantity*item_price AS expanded_price
from orderitems# 使用视图
select * from orderitemsexpanded where orde_num = 2005;