
SQL | Чем отличается WHERE от HAVING?
Кажется, что с помощью WHERE можно решить любую задачу. Однако, предположим, у нас есть таблица результатов экзаменов с именем экзамена, номером ученика и самой оценкой за экзамен. Как выбрать учеников и экзамен с минимальной оценкой 5?
В данной ситуации на помощь приходит как раз таки HAVING - дополнительное условие по уже имеющейся выборке.
Из документации имеем, что основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций.
Следовательно, задачу можно решить одним запросом
Почему иначе - сложнее?
Чтобы понять, что у ученика минимальная оценка 5, нужно сначала сгруппировать значения ученика. Иначе база данных получит минимальную оценку у всех учеников.
Кажется, что с помощью WHERE можно решить любую задачу. Однако, предположим, у нас есть таблица результатов экзаменов с именем экзамена, номером ученика и самой оценкой за экзамен. Как выбрать учеников и экзамен с минимальной оценкой 5?
В данной ситуации на помощь приходит как раз таки HAVING - дополнительное условие по уже имеющейся выборке.
Из документации имеем, что основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций.
Следовательно, задачу можно решить одним запросом
SELECT StudentId FROM EXAM_RESULT GROUP BY StudentID HAVING MIN(Mark) = 5
Почему иначе - сложнее?
Чтобы понять, что у ученика минимальная оценка 5, нужно сначала сгруппировать значения ученика. Иначе база данных получит минимальную оценку у всех учеников.