| Termin | Definicja |
|---|---|
| Filtry poza JOIN (WHERE po JOIN) | Filtry poza JOIN (WHERE po JOIN) to technika stosowania warunków ograniczających wyniki zapytania po dokonaniu łączenia tabel. Filtry poza JOIN (WHERE po JOIN) — czym jest ta technikaFiltry poza JOIN (WHERE po JOIN) opisują sposób budowania zapytania SQL, w którym warunek ograniczający wynik umieszcza się w klauzuli WHERE, czyli po zdefiniowaniu połączenia tabel. Najpierw określa się, jakie rekordy mają zostać ze sobą zestawione, a następnie wskazuje się, które z powstałych wierszy powinny pozostać w rezultacie. Takie rozdzielenie łączenia i filtrowania poprawia czytelność zapytania, ponieważ każda część odpowiada za inne zadanie. JOIN określa relację między źródłami danych. Może łączyć klientów z zamówieniami, produkty z kategoriami albo pracowników z działami. WHERE ogranicza już przygotowany zbiór, na przykład do zamówień z określonego okresu, produktów dostępnych w sprzedaży lub klientów z wybranego miasta. W praktyce nie chodzi wyłącznie o kolejność zapisu poleceń, lecz o świadome rozróżnienie warunku relacji od warunku wyboru danych. Przykładowa konstrukcja może wyglądać następująco:
W tym przykładzie wyrażenie ON wskazuje, w jaki sposób powiązać klienta z zamówieniem. Warunek w WHERE wybiera wyłącznie zamówienia o określonym statusie. Dzięki temu relacja pozostaje łatwa do odczytania, a kryterium selekcji można zmieniać bez przebudowywania samego połączenia. Filtry poza JOIN (WHERE po JOIN) a ON, INNER JOIN i LEFT JOINZnaczenie filtra zależy od typu JOIN. Przy INNER JOIN umieszczenie wielu warunków w ON albo w WHERE często prowadzi do podobnego zestawu wyników, ponieważ i tak pozostają tylko wiersze spełniające relację po obu stronach. Nie oznacza to jednak, że oba zapisy zawsze są równoważne pod względem czytelności. Warunki opisujące powiązanie tabel warto pozostawić w ON, a warunki dotyczące wyboru danych umieścić w WHERE. Różnica staje się wyraźna przy LEFT JOIN. Załóżmy, że mają zostać pokazani wszyscy klienci, także ci, którzy nie złożyli zamówienia. Jeżeli filtr dotyczący statusu zamówienia zostanie umieszczony w WHERE, wiersze bez zamówienia otrzymają po stronie zamówień wartość NULL i mogą zostać odrzucone. W efekcie zapytanie zacznie działać podobnie do INNER JOIN. Przykład z filtrem w WHERE:
Wynik obejmie klientów z pasującym zamówieniem o statusie „zrealizowane”, ale nie pokaże klientów bez takiego zamówienia. Jeżeli celem jest zachowanie wszystkich klientów i jednoczesne dołączenie tylko wybranych zamówień, filtr należy przenieść do ON:
W tej wersji warunek ogranicza dopasowanie po stronie zamówień, lecz nie usuwa klienta z głównej tabeli. Brak dopasowania zostanie przedstawiony jako NULL. To jedna z najważniejszych praktycznych konsekwencji stosowania filtrów poza JOIN. Filtry poza JOIN (WHERE po JOIN) — typowe problemy i błędyCzęstym błędem jest niezamierzone przekształcenie LEFT JOIN w zachowanie właściwe dla INNER JOIN. Dzieje się tak, gdy w WHERE umieszczony zostaje warunek wymagający konkretnej wartości z tabeli dołączanej. Rozwiązaniem jest określenie oczekiwanego rezultatu: jeżeli brak powiązanego rekordu ma być widoczny, filtr powinien zwykle znaleźć się w ON albo powinien uwzględniać wartości NULL. Inny problem wynika z warunków zapisanych bez jednoznacznego wskazania tabeli. Gdy kilka tabel ma kolumnę o tej samej nazwie, na przykład id, status lub data, zapis bez aliasu może prowadzić do błędu albo do nieczytelnego zapytania. Zaleca się nadawanie tabelom krótkich aliasów i używanie pełnej kwalifikacji kolumn:
Warto także uważać na warunki z operatorem OR. Po połączeniu tabel taki warunek może zwrócić więcej wierszy, niż zakładano, zwłaszcza gdy brakuje nawiasów. Czytelny zapis ogranicza ryzyko błędnej interpretacji:
Problematyczne bywają również duplikaty. Jeżeli jeden klient ma wiele zamówień, połączenie zwróci wiele wierszy dla tego samego klienta. Sam filtr WHERE nie usuwa takich powtórzeń. W zależności od celu można użyć DISTINCT, agregacji z GROUP BY albo zmienić logikę zapytania na EXISTS. Należy przy tym upewnić się, czy usuwanie duplikatów nie ukrywa rzeczywistej wielokrotności danych. Filtry poza JOIN (WHERE po JOIN) — praktyczne wskazówki projektoweNajpierw warto opisać słownie oczekiwany wynik. Pomocne pytania brzmią: które rekordy muszą istnieć, które mogą nie mieć odpowiednika oraz czy brak dopasowania ma być pokazany. Dopiero później należy wybrać INNER JOIN albo LEFT JOIN i zdecydować, czy warunek powinien trafić do ON, czy do WHERE.
Znaczenie ma także wydajność. System bazodanowy może próbować zastosować warunki możliwie wcześnie, jeszcze przed pełnym utworzeniem wyniku pośredniego, ale sposób optymalizacji zależy od silnika, indeksów, rozmiaru tabel i złożoności zapytania. Dlatego nie należy zakładać, że przeniesienie każdego filtra do jednej konkretnej klauzuli automatycznie przyspieszy działanie. Najlepszą praktyką jest analiza planu wykonania oraz sprawdzenie, czy kolumny wykorzystywane do łączenia i filtrowania mają odpowiednie indeksy. Filtry poza JOIN (WHERE po JOIN) — kiedy potrzebna jest pomoc serwisuNieprawidłowe działanie zapytania może wynikać nie tylko z samej składni SQL. Przyczyną bywają uszkodzone pliki bazy danych, problemy z dyskiem, błędy systemu, niedostępna aplikacja albo nieprawidłowa konfiguracja programu korzystającego z danych. Jeżeli po zmianie warunku w WHERE znikają rekordy, pojawiają się powtórzenia lub zapytanie zaczyna działać bardzo wolno, warto najpierw zabezpieczyć kopię danych i zanotować wykonane zmiany. Pomoc serwisu może być przydatna również wtedy, gdy problem z filtrowaniem jest objawem szerszej awarii komputera, utraty dostępu do plików lub niestabilnej pracy aplikacji. W Warszawie takie przypadki obsługuje Warszawskie Pogotowie Komputerowe 24/7. Przed przekazaniem sprzętu dobrze przygotować opis problemu, przykładowe zapytanie, komunikat błędu oraz informację, czy usterka występuje stale, czy tylko przy określonych danych. Pozwala to szybciej odróżnić błąd logiczny zapytania od problemu technicznego środowiska, w którym zapytanie jest uruchamiane. Najważniejsze jest zachowanie rozdziału ról: JOIN powinien jasno pokazywać relację między tabelami, a WHERE powinien wyrażać reguły wyboru końcowego wyniku. Przy prostych połączeniach różnica może wydawać się niewielka, lecz przy LEFT JOIN, wielu warunkach i brakujących danych decyduje o tym, czy rezultat będzie zgodny z założeniami. |