本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql;
一、视图
1、视图:视图是依据SELECT语句来创建的,基于真实表的一张虚拟的表,其数据来源均建立在真实表的基础上。
2、视图的作用
①通过定义视图可以将频繁使用的SELECT语句保存以提高效率。
②通过定义视图可以使用户看到的数据更加清晰。
③通过定义视图可以不对外公开数据表全部字段,增强数据的保密性。
④通过定义视图可以降低数据的冗余。
3、如何创建视图
语法:
CREATE VIEW XX视图(列1,列2,列3)
AS
SELECT语句
注意:
①SELECT 语句需要书写在 AS 关键字之后
②SELECT 语句中列的排列顺序和视图中列的排列顺序相同, SELECT 语句中的第 1 列就是视图中的第 1 列
③视图名在数据库中需要是唯一的,不能与其他视图和表重名
④视图不仅可以基于真实表,我们也可以在视图的基础上继续创建视图。(但对多数 DBMS来说, 多重视图会降低 SQL 的性能。)
⑤在一般的DBMS中定义视图时不能使用ORDER BY语句(因为视图和表一样,数据行都是没有顺序的)
4、如何修改视图结构
语法:
ALTER VIEW XX视图
AS
SELECT 语句
例:
ALTER VIEW productSum
AS
SELECT product_type, sale_price
FROM Product
WHERE regist_date > '2009-09-11';
5、如何更新视图内容
语法:
UPDATE XX视图
SET YY列='5000'
WHERE ZZ列='办公用品'
对于一个视图来说,如果包含以下结构的任意一种都是不可以被更新的:
- 聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
- DISTINCT 关键字。
- GROUP BY 子句。
- HAVING 子句。
- UNION 或 UNION ALL 运算符。
- FROM 子句中包含多个表。
--如果要改,需要修改底表,创建视图时也尽量使用限制不允许通过视图来修改表
6、如何删除视图
语法:
DROP VIEW XX视图
二、子查询
1、子查询:子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。
2、子查询和视图的区别:子查询就是将用来定义视图的 SELECT 语句直接用于 FROM 子句当中。由于子查询是一次性的,所以子查询不会像视图那样保存在存储介质中, 而是在 SELECT 语句执行之后就消失了。
虽然嵌套子查询可以查询出结果,但是随着子查询嵌套的层数的叠加,SQL语句不仅会难以理解而且执行效率也会很差,所以要尽量避免这样的使用。
3、标量子查询:标量就是单一的意思,所谓单一就是要求我们执行的SQL语句只能返回一个值,也就是要返回表中具体的某一行的某一列。
用途如:
- 查询出销售单价高于平均销售单价的商品
- 查询出注册日期最晚的那个商品
4、关联子查询:关联子查询就是通过一些标志将内外两层的查询连接起来起到过滤数据的目的
例:
SELECT product_type, product_name, sale_price
FROM product AS p1
WHERE sale_price > (SELECT AVG(sale_price)
FROM product AS p2
WHERE p1.product_type = p2.product_type
GROUP BY product_type);
执行逻辑:
- 首先执行不带WHERE的主查询
- 根据主查询讯结果匹配product_type,获取子查询结果
- 将子查询结果再与主查询结合执行完整的SQL语句