视图
1.视图的概念
1)从SQL的角度来看视图就是一张表
(个人理解是,视图是逻辑上对表的筛选,表的内容是要存于内存中的,而视图只存SELECT 语句,有点类似于 视图是对表的查询, 由此可以知道,可以把经常要用到的查询语句做成视图)
2.视图与表的区别: 数据更新的限制,其中视图有两个限制;
/*
在没有满足第二个限制的视图无法进行更行操作,会报错的
1.视图的创建
CREATE VIEW 视图名(<视图列1>,<视图列2>,...)
AS -- 这个必不可少的
(<SELECT语句>)
*/
--个人理解, 建立视图离不开一个实表 如果只写到AS就截止了,就会报错。
CREATE VIEW viewname(product_id,product_name)
AS
SELECT product_id,product_name
FROM product;
/*
2.DROP掉视图
DROP VIEW 视图名;
*/
DROP VIEW viewname;
子查询
标量子查询
/*
标量子查询:它可以放在SELECT列中,可以放在WHERE子句中,也可以放在HAVING子句等等,
几乎可以说,它可以放在任何位置
*/
--1 举例
SELECT product_id,product_name,product_type,sale_price,(SELECT AVG(sale_price)
FROM product) AS sale_price_all
-- AS sale_price_all是子查询的名字
FROM product;
--2 与没有用标量子查询的区别
SELECT product_id,product_name,product_type,sale_price, AVG(sale_price) AS sale_price_all
FROM product;
--3 与常量的比较
SELECT product_id,product_name,product_type,sale_price, 1000 AS sale_price_all
FROM product;
标量子查询、没有用标量子查询、常量的比较总结
聚合函数在SELECT中只执行了一次,而用标量子查询就可以根据行数的多少生成对应的列
关联子查询
/*
我的理解是:关联子查询是在多个标量子查询的基础上加个条件,用条件对多个标量子查询的值筛选出来一个
*/
-- 标量子查询的例子 1
SELECT product_id,product_name,product_type,sale_price,(SELECT AVG(sale_price)
FROM product) AS sale_price_all
-- (SELECT AVG(sale_price) FROM product) AS sale_price_all -- 用于计算出 sale_price的总值/总数的比值
FROM product;
-- 关联子查询的例子 2
SELECT product_id,product_name,product_type,sale_price,
(SELECT AVG(sale_price)
FROM product AS P1
WHERE P1.product_type = P2.product_type
-- 根据这个条件筛选出对应 平均值
GROUP BY product_type -- 对sale_price分成几组进行算平均值
) AS sale_price_all
FROM productcopy AS P2;
自己的困惑
1.我发觉,以上面关联子查询的例子为例,去掉GROUP BY 操作的结果还是一样,
这一刻我觉得我的理解可能出现的偏差,真正的理解是怎么样的?
·······以下做出一种假设
1)WHERE子句中有限定SELECT的能力,也就是,WHERE子句中是可以通过限定SELECT中的列,列进行对应的划分结果还是一样,
很显然,经过查询之后,仔细分析了一波。假设是错误的。
正确的解释应该是下面这个!!!!!
/*
根据语句执行顺序
和 下面三句话
先做外部主查询;
将主查询的值传入子查询并执行;
子查询再将查询结果返回主查询,主查询根据返回结果完成最终的查询。
以下分析结果
*/
SELECT product_id,product_name,product_type,sale_price,
(SELECT AVG(sale_price) -- 6 条件筛选了之后,在进行AVG得到值
FROM product AS P1 -- 3 子查询的表来自哪里
WHERE P1.product_type = P2.product_type -- 4 对子查询的限制条件是什么
-- GROUP BY product_type -- 5
--分成若干个组,很显然这个多余了,
-- 因为4进行限制之后,才开始分组,
-- 然而这个限定条件已经不能让这个分组有什么实际意义了
) AS sale_price_all -- 2 对该表进行查询
FROM productcopy AS P2; -- 1 主查询来自哪里
补充,继续贴出 语句执行顺序