Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

JOIN z GROUP BY

Termin Definicja
JOIN z GROUP BY

JOIN z GROUP BY to konstrukcja łącząca tabele i jednocześnie grupująca wyniki w celu wykonania agregacji.

Jak JOIN łączy wiersze przed grupowaniem

Konstrukcja JOIN z GROUP BY pozwala pobrać dane z powiązanych tabel, a następnie obliczyć podsumowania dla określonych grup. Przykładowo tabela orders może przechowywać zamówienia, a tabela customers dane klientów. Zapytanie SELECT c.city, COUNT(o.id) FROM customers AS c JOIN orders AS o ON o.customer_id = c.id GROUP BY c.city łączy rekordy przez warunek o.customer_id = c.id, po czym tworzy osobną grupę dla każdej wartości c.city. Funkcja COUNT zwraca liczbę zamówień przypadających na daną grupę.

Najpierw silnik SQL ustala wynik połączenia tabel, a dopiero potem wykonuje grupowanie logiczne. Ma to znaczenie, gdy jedna wartość z tabeli nadrzędnej pasuje do wielu rekordów tabeli podrzędnej. Jeden klient z pięcioma zamówieniami pojawi się w wyniku połączenia pięć razy, dlatego COUNT(o.id) policzy pięć zamówień. Klucz obcy i klucz główny wskazane w warunku ON zwykle opisują relację jeden-do-wielu, ale samo SQL nie zakłada automatycznie, że połączenie będzie jednoznaczne.

Agregaty, kolumny grupowania i wielokrotne dopasowania

W zapytaniu grupującym każda kolumna wybrana bez funkcji agregującej powinna być częścią GROUP BY, aby wynik miał jednoznaczne znaczenie. Poprawnym przykładem jest SELECT c.city, SUM(o.total) FROM customers AS c JOIN orders AS o ON o.customer_id = c.id GROUP BY c.city. Kolumna c.city określa grupę, natomiast SUM(o.total) dodaje wartości zamówień należących do tej grupy. Do często stosowanych agregatów należą także AVG, MIN, MAX i COUNT.

Nieprawidłowo zaprojektowany warunek połączenia może zawyżyć wynik agregacji. Jeżeli zamówienia zostaną połączone z tabelą pozycji zamówienia, jeden rekord zamówienia może wystąpić tyle razy, ile ma pozycji. Wtedy SUM(o.total) powtórzy wartość całego zamówienia dla każdej pozycji. W takiej sytuacji należy agregować właściwą kolumnę, na przykład sumować order_items.quantity * order_items.unit_price, albo najpierw podsumować pozycje w osobnym zapytaniu, a dopiero później połączyć je z tabelą zamówień.

WHERE, HAVING oraz LEFT JOIN w zapytaniach podsumowujących

WHERE ogranicza wiersze przed utworzeniem grup, natomiast HAVING filtruje gotowe grupy po obliczeniu agregatów. Zapytanie SELECT c.city, COUNT(o.id) AS order_count FROM customers AS c JOIN orders AS o ON o.customer_id = c.id WHERE o.status = 'paid' GROUP BY c.city HAVING COUNT(o.id) >= 10 uwzględnia wyłącznie opłacone zamówienia, grupuje je według miasta i pozostawia miasta z co najmniej dziesięcioma zamówieniami. Warunku dotyczącego COUNT nie umieszcza się w WHERE, ponieważ agregacja nie została wtedy jeszcze wykonana.

Rodzaj połączenia wpływa na to, czy w wyniku pojawią się grupy bez dopasowanych rekordów. INNER JOIN zwraca tylko klientów mających pasujące zamówienia. LEFT JOIN zachowuje wszystkich klientów, a dla tych bez zamówień wstawia wartości NULL po stronie tabeli orders. Dlatego do policzenia także klientów bez zamówień stosuje się zwykle COUNT(o.id), a nie COUNT(*). Pierwsze wyrażenie nie liczy wierszy, w których o.id ma wartość NULL, drugie policzyłoby również pusty rezultat połączenia.

Kontrola poprawności i wydajności JOIN z GROUP BY

Podczas sprawdzania takiego zapytania warto najpierw uruchomić sam JOIN bez grupowania i obejrzeć liczbę oraz zawartość powstałych wierszy. Następnie można porównać wynik z licznością tabel źródłowych, sprawdzić powtarzające się identyfikatory i potwierdzić, że warunek ON używa właściwych kolumn. Szczególnej uwagi wymagają połączenia wielu tabel jeden-do-wielu, ponieważ każde kolejne dopasowanie może zwielokrotnić wiersze przed wykonaniem SUM lub COUNT\. Do kontroli planu wykonania służy zależne od silnika polecenie wyjaśniające, na przykład EXPLAIN.

Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, w tym diagnostyką podzespołów oraz problemów z oprogramowaniem użytkowym. Gdy nieprawidłowe zestawienia danych wynikają z błędnego zapytania, pomocne jest zebranie przykładowych rekordów, schematu tabel, relacji kluczy oraz oczekiwanego wyniku. Taki materiał pozwala odróżnić błąd w warunku JOIN od błędu w agregacji, filtrowaniu grup albo doborze kolumny użytej w funkcji zliczającej.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę