2016-03-28 3 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) 

В приведенном выше подзапроса, я первоначально думал, в зависимости от того атрибуты не будут объединены в группы по п ОКАЗАТЬ появится в выбранном пункте. Но в этом случае почему не dept_name присутствует в предложении select в подзапросе?

+0

Только что изменил его текст! – LP45

ответ

0

Запрос выполняется в двух сегментах. Первый - ваш вложенный запрос (который фактически выполняется как Left Anti Semi join). Это возвращает среднюю зарплату для каждого вашего депт_имя.

--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) 

Вы заметите, что в приведенном выше примере единственным отделом, который появляется, является Computer Science. Но если вы измените биологию до 300, то появится и биология, и компьютерная наука.

+0

Ох теперь это состязается! Спасибо огромное! – LP45

+0

Нет проблем! – TsTeaTime

0

Столбцы в group by do не должны появиться в select. Это случай, когда это невозможно, потому что запрос должен возвращать только один столбец.

Результат этого запроса:

select avg(salary) 
from instructor 
group by dept_name 

просто список из средней заработной платы в каждом отделе. В качестве запроса сам по себе это было бы более полезно, если бы у вас также было название отдела. Но в этом случае это не требуется.

+0

Так будет ли подзапрос возвращать отношение средней зарплаты в каждом отделе? – LP45

+0

Подзапрос возвращает список значений, на которые может работать оператор 'ALL'. –

+0

О, хорошо. Можете ли вы объяснить, что вы подразумеваете под «с помощью операторов« ALL », которые могут работать на» – LP45

Смежные вопросы