наличие предложения работает с where в mysql

Вот схема Сотрудник (имя, пол, зарплата, имя отдела), и имя является первичным ключом

SELECT deptname
FROM employee
WHERE sex=m
GROUP BY deptName HAVING avg(salary) >
  (SELECT avg(salary)
   FROM employee)

Я хочу понять часть having avg(salary) что на самом деле делает эта часть? так как мы не включаем пункт выбора зарплаты,

SELECT deptname
FROM employee
WHERE sex=m
GROUP BY deptName

Эта часть даст мне группу deptName, только один столбец и ничего больше, мне интересно, как работает (avg (salary)) , он берет среднее значение всех сотрудников из таблицы или что?

Кто подскажет спасибо


person Community    schedule 21.04.2014    source источник


Ответы (4)


WHERE фильтрует записи перед их группировкой; тогда как HAVING фильтрует результаты после их группировки. Выражения, использующие функции или операторы, могут использоваться в любом предложении (хотя агрегатные функции, такие как AVG(), не могут использоваться в предложении WHERE, поскольку записи не будут сгруппированы при оценке этого предложения).

Таким образом, ваш запрос отфильтровывает список отделов для тех, в которых средняя заработная плата работников-мужчин этого отдела больше, чем общая средняя заработная плата (в компании).

person eggyal    schedule 21.04.2014
comment
это был не мой вопрос, я знаю, что мы не можем использовать агрегатные функции в предложении where, я просто хотел знать, что такое avg (зарплата) в этом случае - person ; 21.04.2014

SELECT AVG(salary)
   FROM employee

По приведенному выше запросу сначала вы получите среднюю зарплату всех сотрудников.

Теперь вы получаете только отдел, средняя зарплата которого больше, чем средняя зарплата всех сотрудников.

person Zafar Malik    schedule 21.04.2014
comment
получив это, он возвращает среднюю зарплату отдела, но только с сотрудниками-мужчинами. - person ; 21.04.2014
comment
Разве нам не нужно также использовать avg (salary) в операторе select? - person ; 21.04.2014
comment
Я думаю, вы говорите avg (зарплата) вместо того, чтобы иметь avg (зарплата) ... если это так, то я хочу прояснить вам, что здесь ваш запрос не извлекает среднюю зарплату, но здесь avg (зарплата) - это условие для фильтрации данных. .. надеюсь, вы получите ответ на свой запрос. - person Zafar Malik; 21.04.2014
comment
Да, если вам нужна средняя зарплата по отделу вместе с их именем, вам также следует использовать в выборе. - person Zafar Malik; 21.04.2014

Предложение have работает как условие where для предложения 'group by deptName'. Все строки сгруппированы по значению столбца deptName. Для каждой группы среднее значение рассчитывается на основе значений заработной платы для этой конкретной группы.

Таким образом, для всех групп, только если средняя зарплата для этой конкретной группы «deptName» больше, чем средняя зарплата для всех сотрудников, будет отображаться строка из этой группы.

person Kanishk Dudeja    schedule 21.04.2014

наличие похоже на предложение WHERE, но оно предназначено для агрегатных функций, таких как AVG.

поэтому ваш запрос будет искать среднее значение каждого имени отдела. НО в вашем запросе

 having avg(salary) > (select  avg(salary) from employee)

вы, возможно, хотите дать среднее значение для сравнения.

подобно

   having avg(salary) > 25 

поэтому будут выбраны только те, у кого средний показатель > 25.

person echo_Me    schedule 21.04.2014
comment
ничего не делает? Я читал, что он получает среднюю зарплату сотрудников мужского пола, что меня смущает. - person ; 21.04.2014
comment
да, это делает, он выбирает среднее значение, тогда вы хотите выбрать только среднее значение, которое больше, чем фактическое среднее значение. - person echo_Me; 21.04.2014
comment
Я думаю, что неправильно, что этот запрос ничего не делает, поскольку он предоставит все названия отделов, средняя зарплата которых (по отделам) больше, чем средняя зарплата всех сотрудников. - person Zafar Malik; 21.04.2014