视图
创建视图
关键字:CREATE VIEW
- 使用视图时并不会将数据保存到存储设备之中,而且也不会将数据保存到其他任何地方。实际上视图保存的是 SELECT 语句。我们从视图中读取数据时,视图会在内部执行该 SELECT 语句并创建出一张临时表。
- 在进行汇总以及复杂的查询条件导致 SELECT 语句非常庞大时,使用视图可以大大提高效率
- SELECT 语句中列的排列顺序和视图中列的排列顺序相同,SELECT 语句中的第 1 列就是视图中的第 1 列,SELECT 语句中的第 2 列就是视图中的第 2 列
- 视图的限制:
- 定义视图时不能使用 ORDER BY 子句:因为视图和表一样,数据行都是没有顺序的;尽管有些 DBMS 在定义视图的语句中是可以使用 ORDER BY 子句的;但是并不是通用的
- 对视图进行更新(INSERT、DELETE、UPDATE 语句):select 进行限制的话是可以使用的,比如:① SELECT 子句中未使用 DISTINCT;② FROM 子句中只有一张表 ③ 未使用 GROUP BY 子句 ④ 未使用 HAVING 子句;总之是不可以在视图中进行汇总统计,因为更新的话会出现二意
- 由于 PostgreSQL 中的视图会被初始设定为只读,所以执行 INSERT 语句时,会报错;需要下面指令来允许更新操作。而在 DB2 和 MySQL 等其他 DBMS 中,并不需要执行这样的指令。
CREATE OR REPLACE RULE insert_rule
AS ON INSERT
TO ProductJim DO INSTEAD --ProductJim 是视图名称
INSERT INTO Product VALUES ( -- Product 是表名
new.product_id,
new.product_name,
new.product_type,
new.sale_price,
new.purchase_price,
new.regist_date);
CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
AS
<SELECT语句>
-- 创建视图
CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;
-- 通过普通的查询语句就可以查到汇总信息
SELECT product_type, cnt_product
FROM ProductSum;
-- 执行顺序是:
-- 1. 首先执行定义视图的 SELECT 语句
-- 2. 根据得到的结果,再执行在 FROM 子句中使用视图的 SELECT 语句
-- 备注:允许现以视图为基础创建视图的`多重视图`;虽然语法上没有错误,但是我们还是应该尽量避免在视图的基础上创建视图。这是因为对多数 DBMS 来说,多重视图会降低 SQL 的性能
删除视图
关键字:DROP VIEW
DROP VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
-- 示例:
DROP VIEW ProductSum;
关联视图的删除时
关键字:CASCADE --postgres 使用
DROP VIEW ProductSum CASCADE;
以视图为基础的子查询
- 子查询可以多层嵌套,但是不建议过多嵌套,性能存在问题,此外不易读
- 原则上子查询必须设定名称,设定名称时需要使用 AS 关键字,该关键字有时也可以省略:(在 Oracle 的 FROM 子句中不能使用 AS 需要删除 AS)
SELECT product_type, cnt_product
FROM (
SELECT Product_type, COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type
) AS ProductSum;
-- 执行顺序
-- 1. 首先执行 FROM 子句中的 SELECT 语句(子查询)
SELECT product_type, COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type;
-- 2. 执行外层的 SELECT 语句
SELECT product_type, cnt_product
FROM ProductSum;