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ę jak WHERE 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.

Author: Usama Abdulrehman, 2008-11-13

19 answers

O określeniu warunku wyszukiwania dla grupa lub funkcja agregująca używana w instrukcji SELECT.

Źródło

 97
Author: Steven,
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.

 380
Author: wcm,
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.

To jest bardziej przydatne niż się wydaje. Na przykład rozważ to zapytanie sprawdzające, czy kolumna 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.

 27
Author: onedaywhen,
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 informacji

Skł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;
 22
Author: Kaiser Advisor,
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.

wybierz diagram instrukcji

Referencje

 21
Author: Paul Sweatte,
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;
 12
Author: Galwegian,
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.

 8
Author: davidcl,
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  
 7
Author: Achilles Ram Nakirekanti,
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.

 4
Author: M Asad Ali,
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

 2
Author: Ved Prakash,
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.

 1
Author: Charles Bretana,
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.

 1
Author: Simmoniz,
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

 1
Author: bebosh,
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

 0
Author: Harry Lime,
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:

SELECT userid, sum (dailyincome) FROM usertable WHERE sum (dailyincome) > 100 GROUP BY userid

To będzie błąd. Poprawne zapytanie to:

SELECT userid, sum(dailyincome) FROM USERTABLE GROUP BY userid Mając sum (dailyincome)>100

 0
Author: Nayan,
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 !

 0
Author: Muhammad Ali,
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).
 0
Author: rjose,
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

 -1
Author: JasonTrue,
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

 -1
Author: Uzair,
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