Речення WHERE і HAVING детально обговорюються в цій статті. Вони також використовуються для фільтрації записів у запитах SQL. Різниця між реченнями WHERE і HAVING є найпоширенішим питанням, яке ставиться під час співбесіди. Основна відмінність між ними полягає в тому, що речення WHERE використовується для визначення умови для фільтрації записів перед тим, як буде зроблено будь-яке групування, тоді як речення HAVING використовується для визначення умови для фільтрації значень із групи. Перш ніж робити порівняння, ми спочатку дізнаємося про них SQL пункти.
Речення WHERE
Речення WHERE в MySQL використовується з SELECT, ВСТАВИТИ , ОНОВЛЕННЯ , і ВИДАЛИТИ запити для фільтрації даних із таблиці чи відношення. Він описує певну умову під час отримання записів з однієї таблиці або кількох таблиць за допомогою пропозиції JOIN. Якщо вказана умова задовольняється, він повертає конкретне значення з таблиці. Речення WHERE розміщує умови для вибраних стовпців.
Речення WHERE в MySQL також може реалізувати логічні сполучники І , АБО , і НІ. Вони відомі як логічна умова, яка має бути правда щоб отримати дані. Логічні сполучні вирази використовують оператори порівняння як свої операнди<, ,>=, = і . Оператори порівняння зазвичай використовуються для порівняння рядків і арифметичних виразів.,>
Наступний синтаксис ілюструє використання пропозиції WHERE:
SELECT column_lists, FROM table_name WHERE conditions GROUP BY column_lists;
Розглянемо приклад, щоб зрозуміти це положення. Припустимо, у нас є таблиця з назвою працівників які містять такі дані:
Якщо ми хочемо отримати відомості про працівника, тривалість робочого часу якого перевищує 9 , то ми можемо використати твердження таким чином:
mysql> SELECT * FROM employees WHERE working_hour > 9;
Ми отримаємо наведені нижче результати, де ми можемо побачити деталі співробітників, робочі години яких перевищують 9:
Якщо ми використовуємо наведений вище запит із ГРУПУВАТИ ЗА пункт , ми отримаємо інший результат:
mysql> SELECT * FROM employees WHERE working_hour > 9 GROUP BY name;
Ось результат:
Речення HAVING
Речення HAVING у MySQL використовується в поєднанні з GROUP BY дає нам змогу вказати умови, які фільтрують результати групи, які відображаються в результаті. Він повертає лише ті значення з груп у кінцевому результаті, які відповідають певним умовам. Ми також можемо використовувати речення WHERE і HAVING разом під час вибору. У цьому випадку пропозиція WHERE спочатку фільтрує окремі рядки, потім рядки групуються, виконує сукупні обчислення, а нарешті пропозиція HAVING фільтрує групи.
Це положення розміщує умови для груп, створених за допомогою пропозиції GROUP BY. Він поводиться як речення WHERE, коли оператор SQL не використовує ключове слово GROUP BY. Ми можемо використовувати агрегатні (групові) функції, такі як SUM, MIN, MAX, AVG і РАХУВАТИ тільки з двома реченнями: SELECT і HAVING.
Наступний синтаксис ілюструє використання пропозиції HAVING:
SELECT column_lists, aggregate_function (expression) FROM table_name WHERE conditions GROUP BY column_lists HAVING condition;
Розглянемо приклад, щоб зрозуміти це положення. Тут ми розглядаємо ту саму таблицю працівників для демонстрації.
Якщо ми хочемо отримати загальну тривалість робочого часу для кожного працівника, робочий час якого перевищує 6 годин , то ми можемо використати твердження таким чином:
mysql> SELECT name, SUM(working_hour) AS 'Total working hours' FROM employees GROUP BY name HAVING SUM(working_hour) > 6;
Ми отримаємо наведені нижче результати, де ми можемо побачити загальну кількість робочих годин кожного працівника:
Ключові відмінності між реченням WHERE і HAVING
Наступні моменти пояснюють основні відмінності між базою даних і схемою:
- Речення WHERE фільтрує окремі рядки, тоді як речення HAVING фільтрує групи замість одного рядка за раз.
- Ми не можемо використовувати речення WHERE з агрегатними функціями, оскільки воно працює для фільтрації окремих рядків. Навпаки, HAVING може працювати з агрегатними функціями, оскільки використовується для фільтрації груп.
- Операції з рядками обробляються пропозицією WHERE, тоді як пропозиція HAVING обробляє операції зі стовпцями для зведених рядків або груп.
- WHERE ставиться перед GROUP BY, що означає фільтрування рядків речення WHERE перед виконанням сукупних обчислень. HAVING стоїть після GROUP BY, що означає, що речення HAVING фільтрує рядки після виконання сукупних обчислень. Отже, HAVING повільніше, ніж WHERE з точки зору ефективності, і його слід уникати, де це можливо.
- Ми можемо об’єднати пропозиції WHERE і HAVING разом у запиті SELECT. У цьому випадку пропозиція WHERE використовується спочатку для фільтрації окремих рядків. Потім рядки групуються, виконуються сукупні обчислення, і, нарешті, речення HAVING використовується для фільтрації груп.
- Речення WHERE отримує потрібні дані на основі вказаної умови. З іншого боку, пропозиція HAVING спочатку отримує цілі дані, а потім виконується розділення на основі вказаної умови.
- Без оператора SELECT ми не можемо використовувати речення HAVING. І навпаки, ми можемо використовувати WHERE з операторами SELECT, UPDATE і DELETE.
- Речення WHERE є попереднім фільтром, тоді як речення HAVING є постфільтром.
Таблиця порівняння WHERE проти HAVING
Наведена нижче порівняльна таблиця швидко пояснює їхні основні відмінності:
Основа порівняння | Речення WHERE | Речення HAVING |
---|---|---|
Визначення | Використовується для виконання фільтрації окремих рядків. | Використовується для виконання фільтрації груп. |
Базовий | Це реалізовано в операціях з рядками. | Це реалізовано в операціях зі стовпцями. |
Отримання даних | Речення WHERE отримує певні дані з певних рядків на основі вказаної умови | Речення HAVING спочатку отримує повні дані. Потім він розділяє їх відповідно до заданої умови. |
Агрегатні функції | Речення WHERE не дозволяє працювати з агрегатними функціями. | Речення HAVING може працювати з агрегатними функціями. |
Виступають в якості | Речення WHERE діє як попередній фільтр. | Речення HAVING діє як постфільтр. |
Використовується з | Ми можемо використовувати речення WHERE з операторами SELECT, UPDATE і DELETE. | Речення HAVING можна використовувати лише з оператором SELECT. |
ГРУПУВАТИ ЗА | Речення GROUP BY стоїть після речення WHERE. | Речення GROUP BY стоїть перед реченням HAVING. |
Висновок
У цій статті ми порівняли пропозиції WHERE і HAVING. Тут ми робимо висновок, що обидва речення працюють однаково для фільтрації даних, за винятком того, що деякі додаткові функції роблять речення HAVING більш популярним. Ми можемо ефективно працювати з агрегатними функціями в реченні HAVING, тоді як WHERE не допускає агрегатних функцій.