SQL基础教程整理(五)关于视图,子查询和关联子查询

一.视图

1. 首先,什么是视图,通俗的讲 在实际的数据库中,每一张表会有很多个字段,但是不同的用户只想了解自己想了解的字段,对于其他的字段并不感兴趣,这时候使用视图可以把自己想要的一些字段再封装成一张表,这样每次特定用户只需要访问这张封装成的表即可了解自己想知道的字段。    再说的专业一点,视图是对SQL语句的封装,这个说法在下面进行解释

2. 为什么说 视图是对SQL语句的封装呢?这是因为,我们在数据库中建立的一张张表会实际存储到存储设备上,比如磁盘,我们每次使用select语句,实际上就是在访问内存中的表,但是视图并不是,视图保存的并不是数据,而是select语句,每次从视图中读取数据的时候,相当于是在内部执行select语句并创建出一张临时表

3.  视图的优点:(1)视图不需要保存实际数据,节省存储空间(2)可以将频繁使用的select语句保存成视图,这样就不用每次都书写复杂的SQL了

那么我们通过实际的例子进行说明关于视图的一些操作,下图是我们用到的叫做product的表


4. 视图的创建

CREATE VIEW ProductSum(product_type,product_sum) 创建一个叫做ProductSum的视图,其中有两个字段
AS                                                                                 必须写的关键字
select product_type,COUNT(*)                                        从Product中抽取出两个字段
from product

GROUP BY product_type;

注意事项:(1)AS必须写 (2)在从其他表抽取数据构成视图的时候可以使用where ,group by ,having

5. 视图的查询----》同查表一致

select * from ProductSum; 查询结果如下


在执行这条查询时,数据库会先执行定义视图的select语句,再执行select * from

6.  视图的限制:(1)不要使用order by定义视图 

    (2)对视图进行更新:通过上面的说明,我们知道,视图实际上是对SQL语句的封装,以上面的例子来说,ProductSum来自于表product,那么当表中的数据发生变化时,ProductSum中的数据也会跟着发生变化,因为视图是根据表通过select语句得到的   那么现在进入正题,如果我们对视图使用insert,update,delete语句时会发生什么呢 实际上,对视图进行操作时会连带着更新相应的表,但是会对生成视图的select语句有一定的限制  a. 未使用distinct 去重   b.from中只有一张表   c.未使用group by 以及having子句

7. 视图的删除  --》drop view ProductSum;


二.子查询

 1.  首先我们需要知道,什么是子查询呢,子查询就是将用来定义视图的select语句直接用于from语句中,通过下面的例子 进行说明

select * from ProductSum;结果是


当我们使用子查询的时候



我们把用作定义视图使用的select语句,直接放到from 语句 中 并且通过as关键字 指定子查询的名称,但由于该名称是一次性的,所以当本次查询结束之后立刻消失不会保存起来


三.标量子查询

1. 标量子查询就是 返回值只能有一行一列的子查询

2. 我们想查询销售单价大于全部商品平均售价的商品 

select product_id,product_name,sale_price
from product
where sale_price>(select AVG(sale_price )

                     from product);   结果如下


在执行这条语句时,数据库会先执行 select AVG(sale_price )  from product返回所有商品的平均价格 2097.5

然后在执行剩下的SQL语句时 实际上就成了 执行 

select product_id,product_name,sale_price  

from product  

where sale_price>2097.5

注意事项:(1)标量子查询绝对不能返回多个结果 (2)标量子查询可以出现在select,group by,having ,ordder by子句中


四.关联子查询

1. 在这里 我们先抛出一个问题,在上面我们提到了 查询售价高于所有商品平均价格的商品信息,那么如果我们想要了解到各个商品种类中高于该商品种类的平均销售单价的商品信息

2. 这时候就需要关联子查询了

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表,因此进行了as区分, 在细分的组内进行比较时,需要使用关联子查询




猜你喜欢

转载自blog.csdn.net/qq_36437446/article/details/80605708