Jaka jest kolejność wykonywania klauzuli Group By, Have i Where w SQL Server?


93

Jestem po prostu zdezorientowany z sekwencją wykonywania zapytania SQL, gdy używamy GROUP BY i HAVING z klauzulą ​​WHERE. Który z nich zostanie wykonany jako pierwszy? Jaka jest sekwencja?

Odpowiedzi:


187

w porządku:

FROM & JOIN s określanie i filtrowanie wierszy
WHERE więcej filtrów w wierszach
GROUP BY łączy te wiersze w grupy
HAVING filter groups
ORDER BY układa pozostałe wiersze / grupy
LIMIT filtrów w pozostałych wierszach / grupach


czy jest jakieś odniesienie do tego?
Geshan,

3
@Geshan, spójrz naSET SHOWPLAN_ALL ON
KM.

Cześć, mam jedno pytanie. czy instrukcja case when condition zastąpi warunek gdzie?
MAX

2
A co z klauzulą ​​Select. Czy to w końcu?
MAX

Krótka i zwięzła odpowiedź! Dziękuję Ci!
Abhishek Ghosh

14

Oto pełna sekwencja dla serwera sql:

1.  FROM
2.  ON
3.  JOIN
4.  WHERE
5.  GROUP BY
6.  WITH CUBE or WITH ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY
11. TOP

Z powyższej listy można więc łatwo zrozumieć sekwencję wykonywania, GROUP BY, HAVING and WHEREktóra jest następująca:

1.  WHERE
2.  GROUP BY
3.  HAVING

Uzyskaj więcej informacji na ten temat od firmy Microsoft


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valTutaj ON pojawia się po dołączeniu, a wybór jest pierwszy. Jakieś wyjaśnienia?
noob

To jest tylko składnia pisania instrukcji SQL. Sekwencja, o której wspomniałem, to rzeczywista kolejność obliczana przez silnik SQL. Oznacza to, że jeśli składnia zapytania jest poprawna, wówczas silnik ocenia FROMnajpierw, a następnie ONi tak dalej.
Dr Suman Kabir

1
@ShailajaGuptaKapoor Możesz czytać to blogis.x2line.com/al/archive/2007/06/30/3187.aspx
MD Suman Kabir

Jeśli GDZIE występuje przed WYBIERZ, dlaczego zwraca wiersz? select sum (1) from foo, gdzie 1 = 0
Tony B

8

GDZIE jest pierwsze, następnie GRUPUJESZ wynik zapytania, a ostatnia, ale nie mniej ważna, klauzula HAVING jest brana do filtrowania zgrupowanego wyniku. To jest „logiczna” kolejność, nie wiem jak to jest technicznie zaimplementowane w silniku.


2
Warto dodać, że optymalizator może przenosić klauzule z HAVING do WHERE, jeśli nie zależą one od agregatu. Nie wpłynie to na pokazane wyniki.
Damien_The_Unbeliever

2

Myślę, że jest zaimplementowany w silniku, jak powiedział Matthias: WHERE, GROUP BY, HAVING

Próbowałem znaleźć w Internecie odnośnik zawierający całą sekwencję (tj. „WYBIERZ” znajduje się na samym dole), ale nie mogę go znaleźć. Zostało to szczegółowo opisane w książce „Inside Microsoft SQL Server 2005”, którą czytałem nie tak dawno temu, autorstwa Solid Quality Learning

Edycja: Znaleziono link: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx


Bardzo ładne wyjaśnienie, z którym się łączysz :-).
sleske

1
Link nie żyje. Jeśli możesz to naprawić, byłoby wspaniale :)
Akash KC

2

W Oracle 12c możesz uruchomić kod w obu poniższych sekwencjach:

Where
Group By
Having

Lub

Where 
Having
Group by

1

Zastanów się, co musisz zrobić, jeśli chcesz wdrożyć:

  • GDZIE : potrzeba wykonania operacji JOIN.
  • GROUP BY : Określasz Grupuj według, aby „grupować” wyniki przy łączeniu, a następnie musi to nastąpić po operacji JOIN, po użyciu WHERE.
  • HAVING : HAVING służy do filtrowania, jak mówią wyrażenia GROUP BY. Następnie jest wykonywany po GROUP BY.

Kolejność to GDZIE, GRUPA WEDŁUG i POSIADA.


To, co tu wyjaśniłeś, jest genialne. To rozwiało moje wątpliwości dotyczące posiadania. Podsumowując - GROUP BY & HAVING działa tak samo jak SELECT & WHERE. Klauzula HAVING zawsze działa na danych z tabeli COMPLETE, przyjmując warunek GROUP BY w obrazie i NIE NA danych GRUPOWANYCH.
Naveen Kumar

1

W poniższej kolejności

  1. OD I DOŁĄCZ
  2. GDZIE
  3. GRUPUJ WEDŁUG
  4. MAJĄCY
  5. WYBIERZ
  6. ZAMÓW PRZEZ
  7. LIMIT

0

Posiadanie klauzuli może nastąpić przed / przed klauzulą ​​group by.

Przykład: select * FROM test_std; ROLL_NO SNAME DOB TEACH


     1 John       27-AUG-18 Wills     
     2 Knit       27-AUG-18 Prestion  
     3 Perl       27-AUG-18 Wills     
     4 Ohrm       27-AUG-18 Woods     
     5 Smith      27-AUG-18 Charmy    
     6 Jony       27-AUG-18 Wills     
       Warner     20-NOV-18 Wills     
       Marsh      12-NOV-18 Langer    
       FINCH      18-OCT-18 Langer    

Wybrano 9 rzędów.

wybierz naucz, count ( ) count from test_std mając count ( )> 1 grupę według TEACH;

NAUCZ LICZENIE


Langer 2 testamenty 4


0

To jest kolejność wykonywania zapytania SQL,

wprowadź opis obrazu tutaj

Możesz sprawdzić kolejność wykonania na przykładach z tego artykułu .

Poniższe pytania mogą być pomocne i pochodzą bezpośrednio z tego artykułu .

  1. GROUP BY -> Pozostałe wiersze po zastosowaniu ograniczeń WHERE są następnie grupowane na podstawie wspólnych wartości w kolumnie określonej w klauzuli GROUP BY. W wyniku grupowania będzie tylko tyle wierszy, ile będzie unikatowych wartości w tej kolumnie. W sposób dorozumiany oznacza to, że powinieneś używać tego tylko wtedy, gdy masz funkcje agregujące w zapytaniu.
  1. HAVING -> Jeśli zapytanie ma klauzulę GROUP BY, to ograniczenia w klauzuli HAVING są następnie stosowane do zgrupowanych wierszy, odrzucając zgrupowane wiersze, które nie spełniają ograniczenia. Podobnie jak klauzula WHERE, w większości baz danych aliasy są również niedostępne w tym kroku.

Bibliografia:-


-2

SELECT
FROM
JOIN
WHERE
GROUP BY
MIEĆ
ORDER BY


13
To jest rzeczywiście złe. Według certyfikowanych trenerów MS i oficjalnych materiałów szkoleniowych, Order By jest po Select. To trochę logiczne, kiedy się nad tym zastanowić. Byłoby głupio zamówić wirtualny stół, którego jeszcze nie pobrałeś i nie skleiłeś. :)
simme
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.