SQL基础教程MICK版 ···第五章总结

本文详细介绍了SQL中的视图概念及创建方法,并对比了视图与表的区别。此外,还深入探讨了子查询的应用场景,包括标量子查询与关联子查询的特点及其在SQL查询中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视图

1.视图的概念

​ 1)从SQL的角度来看视图就是一张表

(个人理解是,视图是逻辑上对表的筛选,表的内容是要存于内存中的,而视图只存SELECT 语句,有点类似于 视图是对表的查询, 由此可以知道,可以把经常要用到的查询语句做成视图)

2.视图与表的区别: 数据更新的限制,其中视图有两个限制;

视图的限制
1.定义视图不能有ORDER BY子句 会报错
2.如果定义视图的SELECT语句能够满足某些条件,那么这个视图就可以更新
典例
SELECT中没有用DISTINCT
FROM子句中只有一张表
没有使用GROUP BY子句,HAVING子句
/*
在没有满足第二个限制的视图无法进行更行操作,会报错的

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;

C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images

2.[外链图片转存失败(img-PwzRs1UW-1563197222279)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\1563195594455.png)]

3.[外链图片转存失败(img-3ibBn9zj-1563197222279)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\1563195688888.png)]

标量子查询、没有用标量子查询、常量的比较总结

聚合函数在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.[外链图片转存失败(img-EyJMsj3C-1563197222280)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\1563195566799.png)]
2.[外链图片转存失败(img-bNxOEY5v-1563197222280)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\1563196473447.png)]

自己的困惑

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  主查询来自哪里

补充,继续贴出 语句执行顺序

执行顺序是
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值