2016-03-28 154 views
0

“查找平均工资最高的部门。”SQL子查询执行

select dept_name 
from instructor 
group by dept_name 
having avg (salary) >= all (select avg (salary) 
          from instructor 
          group by dept_name) 

基于以上的嵌套子查询,我有点糊涂了它是如何执行。有人可以证实我的解释是否正确?

第一行第二行from instructor将运行,根据该关系,元组将被分组dept_name。然后,在由dept_name分组的新建关系中,您将检查每个组的平均工资,并将该值与子查询中形成的新教师关系的所有其他平均工资进行比较。它是否正确?子查询将形成一个新的关系,所以你实际上会有两个单独的关系在运行?

(select avg (salary) 
from instructor 
group by dept_name) 

在上面的子查询,本来我以为无论属性不在组中聚集by子句HAVE出现在选择子句。但是在这种情况下,为什么在子查询的select子句中不存在dept_name

+0

只是将其更改为文本! – LP45

回答

0

查询运行在两个段中。第一个是你的嵌套查询(实际上作为Left Anti Semi join执行)。这将返回每个dept_name的平均工资。

--Nested Query Returns all dept_name average salaries 
select avg (salary) 
from #instructor 
group by dept_name 

这是当时相比,您在使用“All”运营商的主要选择语句拉升平均工资。这相当于比较所有部门的最高平均工资。想想看这样的:

Main Select  Nested Comparison 
Math 200  >= Max({Math 200, Bio 250, English 100}) 
Bio 250  >= Max({Math 200, Bio 250, English 100}) 
English 100 >= Max({Math 200, Bio 250, English 100}) 

因此,在您的查询的情况下,它会永远只能返回部门认为“有”的平均工资比最高平均工资“等于或大于”。下面是一个简单的版本,可以帮助你理解。

Drop Table #instructor 
Create Table #instructor (dept_name nvarchar(200), salary money) 
Insert Into #instructor 
Select 'Math', 200 
Union Select 'English', 150 
Union Select 'Biology', 275 
Union Select 'Computer Science', 300 

select dept_name 
from #instructor 
group by dept_name 
having avg (salary) >= all(select avg (salary) 
          from #instructor 
          group by dept_name) 

你会注意到,在上面的例子中,唯一显示的部门是计算机科学。但是如果你把生物学改为300,那么生物学和计算机科学都会出现。

+0

”哦,现在这使得竞争更加激烈!非常感谢! – LP45

+0

完全没问题! – TsTeaTime

0

列中的group by不是必须出现在select。这是不可能的情况,因为查询只需要返回一列。

此查询的结果是:

select avg(salary) 
from instructor 
group by dept_name 

简直就是在每个部门的平均工资清单。作为查询本身,如果您也有部门名称,这将更有用。但在这种情况下,这是不需要的。

+0

那么子查询是否会返回每个部门平均工资的关系? – LP45

+0

子查询返回值为“ALL”的操作员可以操作的列表。 –

+0

哦,好的。你能解释一下你的意思吗?“所有”运营商都可以使用“ – LP45