目录
一、视图
从SQL角度操作视图和操作表看起完全相同
1. 什么是视图
视图是虚拟的表,视图是依据SELECT语句来创建的,操作视图时会根据创建视图的SELECT语句生成一张虚拟表,然后在虚拟表上做SQL操作
2. 视图和表的区别
视图不保存实际的数据,作为一个窗口,通过窗口看到数据表中实际的数据,视图是基于真实表的一张虚拟表,其数据来源均建立在真实表的基础上。
3. 为什么存在视图
- 将频繁使用的SELECT语句保存以提高效率
- 使用户看到的数据更清晰
- 不对外公开数据表全部字段,增强数据保密性
- 降低数据的冗余
4. 如何创建视图
CREATE VIEW <视图名称>(<列名1>,<列名2>,……) AS <SELECT 语句>;
- SELECT语句中列的排列顺序和视图的排列顺序相同,主要是顺序的一致性,名称可以不一致。
- 视图名在数据库中需要唯一,不能与其他视图和表重名
- 视图可以基于表和视图创建(避免多重视图,会降低SQL性能)
- 视图不能使用ORDER BY
4.1 基于单表的视图
CREATE VIEW productsum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type;
4.2 基于多表的视图
CREATE VIEW view_shop_product(product_type, sale_price, shop_name)
AS
SELECT product_type, sale_price, shop_name
FROM product,
shop_product
WHERE product.product_id = shop_product.product_id;
在视图的基础上查询
语句与在表上的操作一致
SELECT *
FROM view_shop_product
WHERE product_type = '衣服';
5. 修改视图结构
ALTER VIEW <视图名> AS <SELECT语句>;
修改视图的结构,可以新增查询条件,也可以新增字段,新增字段时一定要保证视图字段和查询字段一致。
ALTER VIEW view_shop_product(product_type, sale_price, shop_name)
AS
SELECT product_type, sale_price, shop_name
FROM product,
shop_product
WHERE product.product_id = shop_product.product_id
AND regist_date>'2009-09-11';
6. 更新视图内容
对视图的操作基于底层表的操作,修改时只有满足底层基本表的定义才能修改成功。包含以下任意一种,都不能被更新:
- 聚合函数 SUM()、MIN()、MAX()、COUNT() 等
- DISTINCT 关键字。
- GROUP BY 子句。
- HAVING 子句。
- UNION 或 UNION ALL 运算符。
- FROM 子句中包含多个表。
UPDATE productsum
SET sale_price = '5000'
WHERE prodcut_type = '办公用品';
通过视图的修改只能透过窗口能看到内容
注意:不推荐透过视图去改表内容
7. 删除视图
DROP VIEW <视图名1>[ , <视图名2>];
需要有相应的权限
DROP VIEW productsum;
二、子查询
1. 什么是子查询
一个查询语句嵌套另一个查询语句内部的查询。先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表。