SQL系统学习笔记之视图

本文详细介绍了数据库中的视图概念,强调视图是存储SELECT语句而非实际数据。视图用于提高复杂查询的效率,特别是在需要汇总信息时。创建视图时应注意不能使用ORDER BY子句,且更新视图受限于特定条件。在PostgreSQL中,视图默认为只读,需要特殊指令才能启用更新。同时,文章提到了子查询和多重视图的使用,并讨论了视图的删除规则。最后,视图在性能优化和数据抽象方面的重要性被提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视图

创建视图

关键字:CREATE VIEW

  • 使用视图时并不会将数据保存到存储设备之中,而且也不会将数据保存到其他任何地方。实际上视图保存的是 SELECT 语句。我们从视图中读取数据时,视图会在内部执行该 SELECT 语句并创建出一张临时表。
  • 在进行汇总以及复杂的查询条件导致 SELECT 语句非常庞大时,使用视图可以大大提高效率
  • SELECT 语句中列的排列顺序和视图中列的排列顺序相同,SELECT 语句中的第 1 列就是视图中的第 1 列,SELECT 语句中的第 2 列就是视图中的第 2 列
  • 视图的限制:
  1. 定义视图时不能使用 ORDER BY 子句:因为视图和表一样,数据行都是没有顺序的;尽管有些 DBMS 在定义视图的语句中是可以使用 ORDER BY 子句的;但是并不是通用的
  2. 对视图进行更新(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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值