| Termin | Definicja |
|---|---|
| JOIN z HAVING | JOIN z HAVING to konstrukcja filtrująca zgrupowane wyniki łączenia tabel według warunku obliczanego po agregacji. Jak JOIN z HAVING łączy dane i filtruje grupyJOIN z HAVING jest konstrukcją języka SQL używaną wtedy, gdy wynik zapytania powstaje z połączenia co najmniej dwóch tabel, a następnie ma zostać pogrupowany i ograniczony według wartości obliczonej dla całej grupy. JOIN określa sposób zestawienia powiązanych wierszy, GROUP BY tworzy grupy, funkcja agregująca oblicza wynik dla każdej grupy, natomiast HAVING usuwa te grupy, które nie spełniają warunku. Taki schemat różni się od prostego filtrowania pojedynczych rekordów. Przykładowo tabela zamowienia może zawierać identyfikator klienta, a tabela klienci jego nazwę. Połączenie tych tabel przez JOIN pozwala przypisać zamówienia do klientów. Jeżeli celem jest wyświetlenie tylko tych klientów, którzy mają co najmniej pięć zamówień, warunek dotyczący liczby zamówień powinien znaleźć się w HAVING, ponieważ liczba ta powstaje dopiero po zastosowaniu funkcji COUNT i zgrupowaniu danych. Kolejność działania zapytania z agregacjąLogiczne przetwarzanie takiego zapytania można opisać w kilku etapach. Najpierw źródła danych są wskazywane w klauzuli FROM, a JOIN tworzy wynik pośredni na podstawie warunku złączenia, zwykle zapisanego po słowie ON. Następnie WHERE może odrzucić pojedyncze wiersze jeszcze przed grupowaniem. GROUP BY dzieli pozostałe rekordy na grupy, a funkcje takie jak COUNT, SUM, AVG, MIN lub MAX obliczają wartości dla każdej z nich. Dopiero wtedy HAVING filtruje gotowe grupy. Przykładowe zapytanie może wyglądać następująco: SELECT k.id, k.nazwa, COUNT(z.id) AS liczba_zamowien FROM klienci AS k JOIN zamowienia AS z ON z.klient_id = k.id GROUP BY k.id, k.nazwa HAVING COUNT(z.id) >= 5; W tym przykładzie JOIN zestawia klienta z jego zamówieniami, GROUP BY tworzy grupę dla każdego klienta, COUNT(z.id) oblicza liczbę zamówień, a HAVING pozostawia wyłącznie grupy spełniające próg. Alias liczba_zamowien może być używany w wyniku zapytania, ale możliwość odwołania się do aliasu w samej klauzuli HAVING zależy od konkretnego silnika SQL, dlatego bezpieczną, przenośną formą jest ponowne zapisanie funkcji agregującej. Różnica między WHERE a HAVING przy użyciu JOINWHERE i HAVING filtrują dane w różnych momentach. WHERE działa na pojedynczych wierszach wyniku połączenia, zanim powstaną grupy. HAVING działa na grupach utworzonych przez GROUP BY i może sprawdzać wyniki agregacji. Warunek z.status = 'zrealizowane' może więc trafić do WHERE, ponieważ dotyczy właściwości pojedynczego zamówienia. Z kolei warunek COUNT(z.id) > 5 wymaga HAVING, ponieważ odnosi się do liczby zamówień przypisanych do całej grupy. Umieszczenie warunku w niewłaściwej klauzuli może zmienić znaczenie zapytania. Jeżeli przed grupowaniem zostaną odrzucone zamówienia anulowane, COUNT policzy tylko zamówienia pozostawione po filtrze WHERE. Jeżeli natomiast celem jest znalezienie klientów mających zamówienia z określonego statusu, takie ograniczenie powinno być świadome i jasno oddawać logikę raportu. HAVING może zawierać kilka warunków połączonych operatorami AND lub OR, na przykład minimalną liczbę rekordów oraz minimalną sumę wartości. Należy wtedy pamiętać, że każda agregacja jest liczona w obrębie tej samej grupy. Wpływ typu złączenia na wynik grupowaniaRodzaj JOIN bezpośrednio wpływa na to, jakie grupy mogą pojawić się w wyniku. INNER JOIN zwraca tylko te rekordy, dla których istnieje dopasowanie w obu tabelach. Jeżeli klient nie ma żadnego zamówienia, nie pojawi się w wyniku przed agregacją, więc nie będzie można go wyświetlić przez warunek dotyczący liczby zamówień równej zero. LEFT JOIN zachowuje natomiast wszystkie rekordy z tabeli znajdującej się po lewej stronie. Dzięki temu można uwzględnić także klientów bez zamówień, stosując na przykład COUNT(z.id) = 0. Przy LEFT JOIN ważne jest odróżnienie COUNT(*) od COUNT(z.id). COUNT(*) może policzyć wiersz zachowany przez złączenie nawet wtedy, gdy po prawej stronie nie ma rzeczywistego dopasowania. COUNT(z.id) pomija wartości NULL, dlatego lepiej wskazuje liczbę faktycznie znalezionych zamówień. Błędy w warunku ON, pominięcie właściwego klucza albo połączenie tabel relacją wiele-do-wielu mogą zwielokrotnić wiersze i zawyżyć COUNT oraz SUM. W praktyce należy sprawdzić klucze łączenia, oczekiwaną liczność relacji oraz to, czy agregowana kolumna jest odporna na wartości NULL. Warszawskie Pogotowie Komputerowe wykonuje profesjonalną naprawę laptopów, komputerów stacjonarnych PC i ich podzespołów, dlatego przy problemach z komputerem używanym do pracy z aplikacjami bazodanowymi można zlecić diagnostykę sprzętu, systemu oraz podstawowych problemów z działaniem oprogramowania. |