点击下载此附件
SELECT * FROM 销售明细 AS a WHERE (((a.数量)>(select avg(数量) from 销售明细 where 商品编码=a.商品编码)));
是一个很好的自我对比查询例子,即某表的数据和自己的数据进行对比的查询,以下逐一解答和分析该查询。
1)“SELECT * FROM 销售明细 AS a“这一部分意为选择【销售明细】表里的所有记录并且把这个表从新定义为名字叫【a】的临时表。此时你的数据库里等于有【销售明细】和【a】两
个在数据内容和结构是完全一模一样的表。
2)“SELECT * FROM 销售明细 AS a“后面的“Where”是定义【a】这个临时表的数据范围,至于范围是什么其实并不重要,重要的是它有范围的概念。跟着我们分析这个”Where"后面
范围的具体意思。
3)首先我们把”(((a.数量)>(select avg(数量) from 销售明细 where 商品编码=a.商品编码)))“里多余的括号去掉,更换为“a.数量>(select avg(数量) from 销售明细 where 商品编码
=a.商品编码)”。“a.数量>”是指临时表【a】里的【数量】字段有大于某某数值才符合范围,至于这个某某数值范围是什么?我们一下再进行分析。
4)“(select avg(数量) from 销售明细 where 商品编码=a.商品编码)”其中的”select avg(数量) from 销售明细“意思是求【销售明细】表里【数量】字段的总平均值(没有Group By的范
围要求),但”where 商品编码=a.商品编码“对【销售明细】表里的数据已进行”where 商品编码=a.商品编码“的数据范围约束。下面我们再进行数据对比就更加明白了。
5)【销售明细】表里的数据:
id 报表编码 商品编码 数量
1 1101 101 1100 不大于 101为约束的【数量】字段数据平均值1800,所以不符合范围。
2 1101 102 300 不大于 102为约束的【数量】字段数据平均值300,所以不符合范围。
3 1102 103 1700 不大于 103为约束的【数量】字段数据平均值1850,所以不符合范围。
4 1103 104 500 不大于 104为约束的【数量】字段数据平均值600,所以不符合范围。
5 1104 101 2500 大于 101为约束的【数量】字段数据平均值1800,所以符合范围。
6 1105 103 2000 大于 103为约束的【数量】字段数据平均值1850,所以符合范围。
7 1105 104 700 大于 104为约束的【数量】字段数据平均值600,所以符合范围。
6)【查询2】(以【商品编码】为范围,求【销售明细】里【数量】字段的平均值)里的数据:
商品编码 数量OfAvg
101 1800
102 300
103 1850
104 600
7)【查询1】里的数据:
id 报表编码 商品编码 数量
5 1104 101 2500
6 1105 103 2000
7 1105 104 700
8)总结:”SELECT * FROM 销售明细 AS a WHERE (((a.数量)>(select avg(数量) from 销售明细 where 商品编码=a.商品编码)));“意思为找出【销售明细】表里【数量】字段大于以
自身【商品编码】字段为范围的【数量】平均值的记录。