Зміст курсу
Розширений Рівень SQL
Розширений Рівень SQL
HAVING
Школа дуже вдячна за вашу роботу, і тепер у нас є нове завдання.
Виявилося, що деякі студенти складали додаткові іспити, коли мали скласти лише один. Школа підозрює їх у нечесності, оскільки кожен студент має мати лише одну оцінку.
Нам доручили з'ясувати прізвища цих студентів і передати їх адміністрації школи, щоб вони змогли вжити необхідних заходів.
Давайте разом подумаємо як ми можемо це зробити. Ви можете почати з того, що ми можемо зробити це за допомогою клавзи WHERE
, і це буде виглядати приблизно так:
SELECT student_surname FROM student_grades WHERE COUNT(grade) > 1
Але, як ви можете побачити, ми отримуємо помилку, що вказує на те, що ми не можемо використовувати агрегатні функції усередині клози WHERE
. Ось де нам знадобиться клоза HAVING
.
Давайте зрозуміємо, що це таке і як це використовувати, на прикладі з нашої таблиці employee
.
Припустимо, нам потрібно отримати відділи, де середня заробітна плата співробітників нижче $70,000 на рік.
Для цього нам знадобиться використовувати агрегатну функцію та клозу HAVING
.
Давайте подивимося, як ми можемо це зробити:
SELECT department FROM employees GROUP BY department HAVING AVG(salary) < 70000
Ми отримали один відділ у відповідь, використовуючи клас HAVING
, де ми встановили умову для колонки, по якій групували дані.
Примітка
Щоб використовувати агрегацію даних в класі
HAVING
, нам потрібно мати групування даних у нашому запиті. Як у запиті вище, ми групували дані по колонціdepartment
.
Давайте розглянемо більш узагальнений синтаксис класу HAVING
та коли його найкраще використовувати:
Давайте також коротко розглянемо головну відмінність між клозами WHERE
та HAVING
та коли варто використовувати кожен з них:
- Клоз
WHERE
використовується до агрегації даних, тоді як клозHAVING
застосовується після агрегації даних; - Клоз
WHERE
пишеться доGROUP BY
, у той час як клозHAVING
записується післяGROUP BY
.
Ось дві головні відмінності, які вам потрібно пам'ятати для успішного використання клозу HAVING
. Тепер давайте повернемося до завдання, яке нам дала школа.
Ось попередній перегляд таблиці student_grades
, з якою ми працюємо:
Swipe to show code editor
Вам потрібно отримати прізвища студентів, які мають декілька оцінок у школі.
Необхідно витягнути лише прізвища студентів; немає потреби включати кількість їхніх оцінок у відповідь. Використовуйте клавзу HAVING
та агрегатну функцію COUNT()
для виконання цього завдання. Потім відсортуйте прізвища у алфавітному порядку.
Примітка:
У результаті має бути тільки одна колонка з прізвищами.
Дякуємо за ваш відгук!
HAVING
Школа дуже вдячна за вашу роботу, і тепер у нас є нове завдання.
Виявилося, що деякі студенти складали додаткові іспити, коли мали скласти лише один. Школа підозрює їх у нечесності, оскільки кожен студент має мати лише одну оцінку.
Нам доручили з'ясувати прізвища цих студентів і передати їх адміністрації школи, щоб вони змогли вжити необхідних заходів.
Давайте разом подумаємо як ми можемо це зробити. Ви можете почати з того, що ми можемо зробити це за допомогою клавзи WHERE
, і це буде виглядати приблизно так:
SELECT student_surname FROM student_grades WHERE COUNT(grade) > 1
Але, як ви можете побачити, ми отримуємо помилку, що вказує на те, що ми не можемо використовувати агрегатні функції усередині клози WHERE
. Ось де нам знадобиться клоза HAVING
.
Давайте зрозуміємо, що це таке і як це використовувати, на прикладі з нашої таблиці employee
.
Припустимо, нам потрібно отримати відділи, де середня заробітна плата співробітників нижче $70,000 на рік.
Для цього нам знадобиться використовувати агрегатну функцію та клозу HAVING
.
Давайте подивимося, як ми можемо це зробити:
SELECT department FROM employees GROUP BY department HAVING AVG(salary) < 70000
Ми отримали один відділ у відповідь, використовуючи клас HAVING
, де ми встановили умову для колонки, по якій групували дані.
Примітка
Щоб використовувати агрегацію даних в класі
HAVING
, нам потрібно мати групування даних у нашому запиті. Як у запиті вище, ми групували дані по колонціdepartment
.
Давайте розглянемо більш узагальнений синтаксис класу HAVING
та коли його найкраще використовувати:
Давайте також коротко розглянемо головну відмінність між клозами WHERE
та HAVING
та коли варто використовувати кожен з них:
- Клоз
WHERE
використовується до агрегації даних, тоді як клозHAVING
застосовується після агрегації даних; - Клоз
WHERE
пишеться доGROUP BY
, у той час як клозHAVING
записується післяGROUP BY
.
Ось дві головні відмінності, які вам потрібно пам'ятати для успішного використання клозу HAVING
. Тепер давайте повернемося до завдання, яке нам дала школа.
Ось попередній перегляд таблиці student_grades
, з якою ми працюємо:
Swipe to show code editor
Вам потрібно отримати прізвища студентів, які мають декілька оцінок у школі.
Необхідно витягнути лише прізвища студентів; немає потреби включати кількість їхніх оцінок у відповідь. Використовуйте клавзу HAVING
та агрегатну функцію COUNT()
для виконання цього завдання. Потім відсортуйте прізвища у алфавітному порядку.
Примітка:
У результаті має бути тільки одна колонка з прізвищами.
Дякуємо за ваш відгук!