Jaka jest różnica między posiadaniem i gdzie w SQL?
Jaka jest różnica między HAVING
a WHERE
w SQL SELECT
oświadczeniu?
EDIT: zaznaczyłem odpowiedź Stevena jako poprawną, ponieważ zawierała kluczowy fragment informacji na linku:
Gdy
GROUP BY
nie jest używane,HAVING
zachowuje się jakWHERE
klauzula
Sytuacja, którą widziałem WHERE
w nie miała GROUP BY
i tam zaczęło się moje zamieszanie. Oczywiście, dopóki tego nie wiesz, nie możesz tego określić w pytaniu.
19 answers
O określeniu warunku wyszukiwania dla grupa lub funkcja agregująca używana w instrukcji SELECT.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-19 20:56:21
HAVING: służy do sprawdzania warunków Po agregacja ma miejsce.
Gdzie: służy do sprawdzania warunków przed przeprowadzeniem agregacji.
Ten kod:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Daje tabelę wszystkich miast W MA i liczbę adresów w każdym mieście.
Ten kod:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5
Daje tabelę miast W MA z więcej niż 5 adresami i liczbą adresów w każdym mieście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 09:15:46
Różnica Numer jeden dla mnie: jeśli HAVING
został usunięty z języka SQL wtedy życie będzie trwać mniej więcej tak jak wcześniej. Oczywiście, zapytania mniejszości musiałyby być przepisane przy użyciu pochodnej tabeli, CTE, itp, ale prawdopodobnie byłyby łatwiejsze do zrozumienia i utrzymania w rezultacie. Być może kod optymalizatora sprzedawców musiałby zostać przepisany, aby uwzględnić to, znowu okazja do poprawy w branży.
Zastanów się przez chwilę nad usunięciem WHERE
z języka. Tym razem większość istniejących zapytań musiałaby zostać przepisana bez oczywistej alternatywnej konstrukcji. Programiści muszą stworzyć np. INNER join do tabeli, o której wiadomo, że zawiera dokładnie jeden wiersz (np. DUAL
w Oracle), używając klauzuli ON
do symulacji poprzedniej klauzuli WHERE
. Takie konstrukcje byłyby wymyślone; byłoby oczywiste, że czegoś brakuje w języku i w rezultacie sytuacja byłaby gorsza.
TL;DR we could lose HAVING
jutro i nie byłoby gorzej, być może lepiej, ale tego samego nie można powiedzieć o WHERE
.
Z odpowiedzi tutaj, wydaje się, że wielu ludzi nie zdaje sobie sprawy, że HAVING
klauzula może być używana bez GROUP BY
klauzula. W tym przypadku klauzula HAVING
jest zastosowana do całego wyrażenia tabeli i wymaga, aby w klauzuli SELECT
pojawiały się tylko stałe. Zazwyczaj klauzula HAVING
obejmuje Agregaty.
name
jest unikalna dla wszystkich wartości w T
:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
Są tylko dwa możliwe wyniki: jeśli klauzula HAVING
jest prawdziwa, to wynik będzie jednym wierszem zawierającym wartość 1
, w przeciwnym razie wynikiem będzie zestaw pusty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-13 07:39:50
Klauzula HAVING została dodana do SQL, ponieważ słowo kluczowe WHERE nie mogło być używane z funkcjami agregującymi.
W3schools link aby uzyskać więcej informacjiSkładnia:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
Zapytanie takie jak to:
SELECT column_name, COUNT( column_name ) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
HAVING COUNT( column_name ) >= 3;
...może być przepisany przy użyciu tabeli pochodnej (i pomijając HAVING
) w następujący sposób:
SELECT column_name, column_name_tally
FROM (
SELECT column_name, COUNT(column_name) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
) pointless_range_variable_required_here
WHERE column_name_tally >= 3;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 08:22:17
Różnica między tymi dwoma jest w stosunku do grupy przez klauzulę:
WHERE comes before GROUP BY; SQL ocenia klauzulę WHERE before it groups records.
HAVING comes after GROUP BY; SQL ocenia HAVING after IT groups records.
Referencje
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-22 22:42:31
HAVING
jest używany, gdy używasz agregatu, takiego jak GROUP BY
.
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 16:47:06
Gdzie jest stosowane jako ograniczenie na zestaw zwracany przez SQL; wykorzystuje wbudowane w SQL oepracje i indeksy zestawów i dlatego jest najszybszym sposobem filtrowania zestawów wynikowych. Zawsze używaj tam, gdzie to możliwe.
Posiadanie jest konieczne dla niektórych filtrów zbiorczych. Filtruje zapytanie po pobraniu, zebraniu i posortowaniu wyników przez sql. Dlatego jest znacznie wolniejszy niż gdzie i należy go unikać, z wyjątkiem sytuacji, które tego wymagają.
SQL Server pozwoli ci uzyskać Precz z używaniem nawet wtedy, gdy gdzie byłoby znacznie szybciej. Nie rób tego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 16:53:49
Gdzie klauzula nie działa dla funkcji zbiorczych
oznacza : nie należy używać w ten sposób
bonus: nazwa tabeli
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
Tutaj zamiast używać klauzuli WHERE musisz użyć HAVING..
Bez użycia klauzuli GROUP BY, posiadanie klauzuli działa jak klauzula WHERE
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-17 12:49:58
Różnica b / w WHERE
i HAVING
klauzula:
Główna różnica pomiędzy klauzulą WHERE
i HAVING
jest taka, że WHERE
jest używana do operacji wiersza, a HAVING
do operacji kolumn.
Dlaczego potrzebujemy HAVING
klauzuli?
Jak wiemy, funkcje agregujące mogą być wykonywane tylko na kolumnach, więc nie możemy używać funkcji agregujących w klauzuli WHERE
. Dlatego używamy funkcji zbiorczych w klauzuli HAVING
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-31 05:17:17
Jednym ze sposobów myślenia jest to, że klauzula having jest dodatkowym filtrem do klauzuli where.
A gdzie używana jest klauzula filtruje rekordy z wyniku. Filtr występuje przed utworzeniem jakichkolwiek grup. A o klauzuli jest używany do filtrowania wartości z grupy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 14:36:35
W zapytaniu zbiorczym (każde zapytanie, w którym używana jest funkcja zbiorcza) predykaty w klauzuli where są oceniane przed wygenerowaniem agregowanego pośredniego zbioru wyników,
Predykaty w klauzuli Having są stosowane do zbiorczego zbioru wyników po jego wygenerowaniu. Dlatego warunki predykatu dla wartości zagregowanych muszą być umieszczone w klauzuli Having, a nie w klauzuli Where i dlaczego można używać aliasów zdefiniowanych w klauzuli Select w klauzuli Having, ale nie w klauzuli Where Klauzula.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 16:56:27
Miałem problem i odkryłem kolejną różnicę między WHERE
i HAVING
. Nie działa tak samo na indeksowanych kolumnach.
WHERE my_indexed_row = 123
wyświetli wiersze i automatycznie wykona "zamów ASC" na innych indeksowanych wierszach.
HAVING my_indexed_row = 123
pokazuje wszystko od najstarszego" wstawionego " wiersza do najnowszego, bez zamawiania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-26 04:50:24
Gdy GROUP BY
nie jest używane, WHERE
i HAVING
są zasadniczo równoważne.
Jednakże, gdy GROUP BY
jest używane:
- klauzula
WHERE
służy do filtrowania rekordów z wyniku. Na filtrowanie następuje przed dokonaniem jakichkolwiek grup. - klauzula
HAVING
służy do filtrowania wartości z grupy (tj. do sprawdzenie warunków po przeprowadzeniu agregacji na grupy).
źródło z tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-02 20:09:56
From here .
Standard SQL wymaga, aby mieć musi odnosić się tylko do kolumn w Grupuj według klauzuli lub kolumn używanych w funkcje zbiorcze
W przeciwieństwie do klauzuli WHERE, która jest stosowana do wierszy bazy danych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 16:50:14
Podczas pracy nad projektem, to było również moje pytanie. Jak wspomniano powyżej, o sprawdza warunek na już znalezionym wyniku zapytania. Ale Gdzie {[5] } służy do sprawdzania stanu podczas uruchamiania zapytania.
Pozwól, że podam przykład, aby to zilustrować. Załóżmy, że masz taką tabelę bazy danych.Usertable {int userid, date datefield, int dailyincome}
Załóżmy, że w tabeli znajdują się następujące wiersze:
1, 2011-05-20, 100
1, 2011-05-21, 50
1, 2011-05-30, 10
2, 2011-05-30, 10
2, 2011-05-20, 20
Teraz chcemy uzyskać userid
s I sum(dailyincome)
których sum(dailyincome)>100
Jeśli napiszemy:
To będzie błąd. Poprawne zapytanie to:SELECT userid, sum (dailyincome) FROM usertable WHERE sum (dailyincome) > 100 GROUP BY userid
SELECT userid, sum(dailyincome) FROM USERTABLE GROUP BY userid Mając sum (dailyincome)>100
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-19 23:40:49
Gdzie klauzula jest używana do porównywania wartości w tabeli bazowej, podczas gdy klauzula HAVING może być używana do filtrowania wyników funkcji agregowanych w zbiorze wyników zapytania Kliknij tutaj !
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 10:33:42
Gdy grupa BY nie jest używana, klauzule WHERE I HAVING są zasadniczo równoważne.
Jednakże, gdy używana jest grupa by:
- klauzula WHERE służy do filtrowania rekordów z wyniku. Na filtrowanie następuje przed dokonaniem jakichkolwiek grup.
- klauzula HAVING jest służy do filtrowania wartości z grupy (np. do sprawdzania warunków po dokonano agregacji na grupy).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-23 14:47:11
Używam HAVING do ograniczenia zapytania opartego na wynikach funkcji agregującej. Np. select * in blahblahblah group by SOMETHING having count (SOMETHING)>0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 16:49:08
Gdzie klauzula służy do filtrowania wierszy z całej bazy danych. Ale Having clause służy do filtrowania wierszy z określonej grupy bazy danych. Posiadanie klauzuli może również pomóc w funkcji zbiorczej, takiej jak min / max / average
Więcej szczegółów.. Jaka jest różnica między Gdzie a mając Jaka jest różnica pomiędzy WHERE a HAVING
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-27 21:57:41