Różnica między klauzulą WHERE a HAVING
Różnica między klauzulą WHERE a HAVING
Jaka jest różnica między klauzulą WHERE i HAVING w SQL?
Zarówno klauzula WHERE, jak i HAVING są bardzo podobne i służą do ograniczania wierszy zwracanych w zapytaniu SELECT.
Różnica między klauzulą WHERE a HAVING jest:
- Klauzula WHERE służy do filtrowania wierszy, działa bez GROUP BY.
- Klauzula HAVING służy do filtrowania wierszy działa tylko z GROUP BY.
Klauzula WHERE
Klauzula WHERE w SQL służy do filtrowania rekordów. Możesz używać z zapytaniami SELECT, DELETE i UPDATE. Na przykład to zapytanie dotyczące naszych przykładowych danych:
1 2 |
SELECT COUNT(*) FROM employee; |
Pokazuje 200 rekordów. Jeśli dodamy klauzulę WHERE:
1 2 3 |
SELECT COUNT(*) FROM employee WHERE salary > 50000; |
Otrzymujemy 134.
Zatem klauzula WHERE uwzględniała tylko te rekordy, w których salary> 50000. Możemy również użyć klauzuli WHERE w instrukcjach UPDATE:
1 2 3 |
UPDATE employee SET salary = salary * 1.1 WHERE department_id = 5; |
To samo można powiedzieć o instrukcji DELETE.
1 2 |
DELETE FROM employee WHERE department_id = 7; |
Klauzula HAVING
Z drugiej strony klauzula HAVING służy do filtrowania danych po zastosowaniu grupowania GROUP BY. Powiedzmy, że chcesz znaleźć SUMĘ wynagrodzeń na dział.
1 2 3 4 |
SELECT department_id, SUM(salary) AS total_sal FROM employee GROUP BY department_id ORDER BY department_id; |
DEPARTMENT_ID | TOTAL_SAL |
1 | 305000 |
2 | 2142000 |
3 | 2233000 |
4 | 1243000 |
5 | 2491000 |
6 | 1733000 |
7 | 1587000 |
8 | 1560000 |
Klauzula HAVING i WHERE
Chcemy pokazać sumę wynagrodzeń większą niż 1 000 000 na dział dla pracowników zatrudnionych po 1 stycznia 2013.
1 2 3 4 5 6 |
SELECT department_id, SUM(salary) AS total_sal FROM employee WHERE hire_date > '01-JAN-2013' GROUP BY department_id HAVING SUM(salary) > 1000000 ORDER BY department_id; |
Wynik:
DEPARTMENT_ID | TOTAL_SAL |
2 | 1347000 |
3 | 1256000 |
5 | 1102000 |
Czy mogę używać HAVING zamiast WHERE ?
Gdybyśmy chcieli usunąć WHERE i po prostu użyć HAVING, moglibyśmy spróbować:
1 2 3 4 5 |
SELECT department_id, SUM(salary) AS total_sal FROM employee GROUP BY department_id HAVING SUM(salary) > 1000000 AND hire_date > '01-JAN-2013' ORDER BY department_id; |
Otrzymujemy jednak błąd. Mam nadzieję, że ten artykuł wyjaśnia dla Ciebie różnicę między klauzulą WHERE a HAVING.
Zapraszam do polubienia fanpage Facebook “Umiejętności miękkie w IT”
Ostatecznie w zamian za dostarczoną treść, proszę więcej uśmiechu w cyfrowym świecie! 😉