Hello, bro. Welcome to my blogs.

5-1 视图

视图和表

视图和表的区别只有一个是否保存了实际的数据
使用INSERT和SELECT实际上就是从存储设备中读取数据,各种计算后,将数据呈现给用户。

视图不会将数据保存在存储设备中。实际上,视图保存的是SELECT语句视图会在内部执行该SELECT并创建出一张临时表。

视图的优点

  1. 无需保存数据,节省存储设备的容量。
  2. 可以将频繁使用的SELECT保存成视图,这样就不用每次都重新书写了。

创建视图

创建视图,要使用CREATE VIEW语句
语法:

CREATE VIEW 视图名称 (<视图列表1>,<视图列表2>,……)
AS
<SELECT语句>

注意:

  1. SELECT语句需要书写在AS关键字之后,
  2. SELECT语句中的列的排列顺序和视图中的列的排列顺序相同。

例:

CREATE VIEW myView (age, name)
AS
SELECT age, name
FROM STU
WHERE age>10;

这就完成一个视图的创建,创建成功,会有CREATE VIEW的字样。

之后就可以像用普通表一样去使用这个视图了。
使用视图的查询
实际有两个步骤:

  1. 执行定义视图的SELECT语句。
  2. 根据得到的结果,再执行在FROM子句中使用视图的SELECT语句。

多重的视图会降低效率,所以建议使用单重视图。

视图的限制:

  1. 定义视图时不能使用ORDER BY子句。
    因为视图和表一样,数据都是没有顺序的。
  2. 限制性对视图进行更新
    条件:
    • SELECT子句中未使用DISTINCT
    • FROM子句中只有一张表
    • 未使用GROUP BY 子句。
    • 未使用HAVING 子句

视图和表需要同时进行更新,因此通过聚合得到的视图无法进行更新
在视图中进行数据的更新, 在原表中,数据也会进行更新。

删除视图

语法:

DROP VIEW 视图名称

例如:

DROP VIEW myView

在PostgreSQL下,如果想删除已视图未寄出创建出来的多重视图,会由于存在关联视图,而发生错误。
可以使用DROP VIEW 视图名 CASCADE进行删除。

5-2 子查询

子查询和视图

子查询就是一张一次性的视图。

例:

SELECT name ,age
FROM (SELECT  name, age
    FROM STU
    WHERE age>10) AS temp;

有种类似嵌套SELECT的感觉。
子查询作为内层查询会首先执行。

增加子查询的层数
子查询的层数原则上没有上限。


标量子查询

标量子查询有一个特殊限制:
必须而且只能返回一行一列的数据

标量子查询就是返回单一值的子查询

使用实例:
当在WHERE时,需要使用类似平均值这种聚合函数,但是会发生错误。如果我们需要使用到标量子查询。

例如:

SELECT *
FROM STU
WHERE score > (SELECT AVG (score)
                FROM STU);

使用范围:
任意可以使用单一值的


5-3 关联子查询

  • 关联子查询会在细分的组内进行比较时使用
  • 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分。
  • 关联子查询的结合条件如果未给出在子查询之中就会发生错误。

使用情况:
对切分后的组进行子查询

Posted on 2016-05-11 14:29  苏白  阅读(389)  评论(0编辑  收藏  举报