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?
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:
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
SET SHOWPLAN_ALL ON
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 WHERE
która jest następująca:
1. WHERE
2. GROUP BY
3. HAVING
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val
Tutaj ON pojawia się po dołączeniu, a wybór jest pierwszy. Jakieś wyjaśnienia?
FROM
najpierw, a następnie ON
i tak dalej.
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.
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
Zastanów się, co musisz zrobić, jeśli chcesz wdrożyć:
Kolejność to GDZIE, GRUPA WEDŁUG i POSIADA.
W poniższej kolejności
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
To jest kolejność wykonywania zapytania SQL,
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 .
- 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.
- 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:-
SELECT
FROM
JOIN
WHERE
GROUP BY
MIEĆ
ORDER BY