Зміст курсу
Розширений Рівень 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
Your task will be to fetch the last names of students who have multiple grades for the school.
You only need to retrieve the last names of the students; there's no need to include the count of their grades in the response. Use the HAVING
clause and the COUNT()
aggregate function to accomplish this task. Then, sort the surnames in the alphabetical order.
Note:
You should have only one column with last names in the result.
Brief Instructions
- Retrieve the
student_surname
column. - Group the data by
student_surname
. - Use the
HAVING
clause to filter the results based onCOUNT(grade) > 1
. - Sort the results by
student_surname
.
Рішення
Дякуємо за ваш відгук!
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
Your task will be to fetch the last names of students who have multiple grades for the school.
You only need to retrieve the last names of the students; there's no need to include the count of their grades in the response. Use the HAVING
clause and the COUNT()
aggregate function to accomplish this task. Then, sort the surnames in the alphabetical order.
Note:
You should have only one column with last names in the result.
Brief Instructions
- Retrieve the
student_surname
column. - Group the data by
student_surname
. - Use the
HAVING
clause to filter the results based onCOUNT(grade) > 1
. - Sort the results by
student_surname
.
Рішення
Дякуємо за ваш відгук!