视图和子查询

Posted sanzashu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视图和子查询相关的知识,希望对你有一定的参考价值。

什么是视图:从SQL角度来看,视图就是一张表
与表的区别是:是否保存了实际的数据

视图的优点:

  1. 无需保存数据,节省储存设备容量。
  2. 将select语句保存成视图,就可以不用每次都从新书写
    注:应将经常使用的select保存成视图
创建视图

创建一个名为商品合计表的视图

CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
    FROM Product
 GROUP BY product_type;

创建视图之后可以使用简单的select语句查询。

删除视图

使用DROP VIEW

多重视图

视图之前上再创建视图,ProductSum为之前创建的视图

CREATE VIEW ProductSumJim (product_type, cnt_product)
AS
SELECT product_type, cnt_product
FROM ProductSum
WHERE product_type = '办公用品';    

对多数DBMS来说,多重视图会降低SQL的性能,所以应该尽量避免创建多重视图。

视图的限制
  1. 定义视图不要使用ORDER BY子句,因为视图和表一样数据是没有顺序的
  2. 对视图进行更新,不能使用(INSERT/DELETE/UPDATE)语句
视图更新

有些视图可以跟新,但必须满足,select子句为单表,既没有聚合又没有结合的select语句

CREATE VIEW ProductJim (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
AS 
SELECT *
    FROM Product
 WHERE product_type = '办公用品';
-- 向视图插入数据(原表也插入了此条数据)
INSERT INTO ProductJim VALUES ('0009', '印章', '办公用品', 95, 10, '2009-11-30');
子查询(一次性视图)

执行顺序:内层的select子句——>外层的select子句

SELECT product_type, cnt_product
FROM (SELECT product_type, COUNT(*) AS cnt_product
                FROM Product
             GROUP BY product_type) AS ProductSum;

注:为子查询设定名称时,需要使用AS关键字,该关键字有时也可以省略。

标量子查询:标量子查询就是返回单一值(一行一列)的子查询
1.在where子句中使用标量子查询

*不能在where子句中使用聚合函数(下面这句是会报错的!!!!)

SELECT * FROM product 
WHERE sale_price > AVG(sale_price);

> 1111 - Invalid use of group function

计算平均销售单价的标量子查询(返回单一结果(一行一列))

 select avg(sale_price) from product;

汇总:where中使用标量子查询

 SELECT * FROM product 
 WHERE sale_price > (select avg(sale_price) from product);

注:标量子查询通常可以在任何使用单一值的位置都可以使用(select/group by/having...)

2.select中使用标量子查询
-- 标量子查询结束作为常数
SELECT product_id, 
       product_name, 
       sale_price,
       (SELECT AVG(sale_price) FROM Product) AS avg_price 
FROM Product;
3.having子句中使用标量子查询
SELECT product_type, AVG(sale_price)
    FROM Product
 GROUP BY product_type
HAVING AVG(sale_price) > (SELECT AVG(sale_price) FROM Product);

关联子查询

在细分的组内进行比较时,需要使用关联子查询

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 ROUP BY product_type);

以上是关于视图和子查询的主要内容,如果未能解决你的问题,请参考以下文章

视图和子查询

内联视图和普通视图的关系以及和子查询的区别

如何使用 UNION 和子 SELECT 从查询构造 MySQL 视图

片段视图返回后执行的 Firebase 查询

共享元素转换在父片段和子片段之间不起作用(嵌套片段)

带有活动和子片段的导航抽屉