MySQL数据库——视图

视图是虚拟的表。 给我的感觉好像是原来表的投影一样,可以只投影一部分。视图只包含使用时动态检索数据的查询。
11.视图简介
理解视图,要从一个例子说起:

SELECT cust_name, cust_city,cust_state FROM customers

现在,假如可以把整个查询包装成一个名为productcustomers的虚拟表,那就可以如下轻松地检索出相同的数据:

SELECT cust_name,cust_city FROM productcustomers WHERE cust_name = 'huang'

这是一个简单的检索操作,我们可以通过视图,来这样实现。 但是如果这个操作要执行很多次,我们就可以通过视图技术来让操作简便!而且视图技术还允许我们只使用表的组成部分而不是整个表。

重要的是知道视图仅仅是用来查看存储在别处数据的一种设施!因为视图不包含数据,所以每次使用视图,都必须处理查询执行时所需要的任一个检索。

1.2 视图的规则和限制

1.和表一样,视图的名字必须唯一;
2.对于可以创建的视图数目没有限制;
3.为了创建视图,必须有足够的权限,这些权限通常由数据库管理人员授予;
4.视图可以嵌套,就是说可以利用从其他视图中检索数据的查询来构造一个视图;
5.ORDER BY也可以用在视图中,但如果该视图检索数据也用了ORDER BY ,那么该视图的ORDER BY将被覆盖;
6.视图不能索引,也不能有关联的触发器或默认值;
7.视图可以和表一起使用。例如,编写一条联结表和视图的SELECT语句。

2. 使用视图
视图的创建:用 CREATE VIEW 语句来创建;

视图的查看用:SHOW CREATE VIEW ???(name) ;;来查看创建视图的语句;

视图的删除:语法为 DROP VIEW ???(name);

视图的更新:我们可以先用DROP 再用 CREATE,也可以直接用 CREATE OR REPLACE VIEW 。 如果更新的视图不存在,则第二条更新语句会创建一个视图;如果要更新的视图存在,则第二条更新语句会替换原有视图。

2.1 利用视图简化复杂的联结
视图最常见的应用之一是隐藏复杂的SQL,这通常都会涉及联结。

扫描二维码关注公众号,回复: 1514011 查看本文章

我们上面的那个例子看,如再想进行一次检索,那我们只需要:

CREATE VIEW productcustomers AS SELECT
    cust_name,
    cust_city,
    cust_state
FROM
    customers

创建不受特定数据限制的视图是一种好习惯,另外思考一下,尽量创建可重用的视图。

2.2 用视图重新格式化检索出的数据

SELECT Concat(RTrim(cust_name),'(', RTrim(cust_city),')',cust_state) FROM customers

那我们可以创建这样的视图:

CREATE VIEW vendorlocations AS SELECT
    Concat(
        RTrim(cust_name),
        '(',
        RTrim(cust_city),
        ')',
        cust_state
    )
FROM
    customers

那我们就可以在每次需要的时候,使用这个视图

SELECT * FROM vendorlocations

2.3 用视图过滤不想要的数据
举个例子:

CREATE VIEW customeremaillist AS SELECT
    cust_id,
    cust_name,
    cust_emil
FROM
    customers
WHERE
    cust_mail IS NOT NULL;

现在,我们可以像使用其他表一样使用视图

SELECT * FROM customeremaillist

2.4 使用是图和计算字段
我们直接举个例子

SELECT prod_id
        quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;

那这里用了计算字段,我们可以制作一个视图:

CREATE VIEW orderitemsexpanded AS SELECT
    prod_id quantity * item_price AS expanded_price
FROM
    orderitems
;

可以这样使用创建好的视图:

SELECT
    *
FROM
    orderitemsexpanded
WHERE
    order_num = 2005;

3. 更新视图
通常,视图是可以更新地,就是说可以对他们用INSERT UPDATE 和 DELETE。 更新一个视图将更新基表,如果我们对视图增加或删除行,实际上是对其基表增加或删除行。

但是如果视图定义中有一下操作,则不能进行视图的更新:
1.分组(使用GROUP BY 和 HAVING);
2.联结;
3.子查询;
4.并;
5.聚集函数(Min()、Count()、Sum()、)
6.DISTINCT;
7.导出列;

可能看起来是个很严重的限制,但是视图实际主要用于数据检索!

猜你喜欢

转载自blog.csdn.net/qq_36120793/article/details/78907974