Start > Kursy on-line > MS SQL Server Express

MS SQL Server Express


Zapytania do wielu tabel - polecenie JOIN

JOIN

Po raz pierwszy w naszym kursie zbudujemy zapytanie do dwóch tabel jednocześnie. Nasze tabele z bazy "nowa_baza" zawierają informacje o ilości sprzedaży produktów do poszczególnych klientów ("sprzedaż") oraz o cenach produktów ("produkty"). Wykorzystując je obie, moglibyśmy pokusić się o wyświetlenie cen i wartości sprzedaży. W tym celu wykorzystamy polecenie JOIN, które pozwoli nam na tę operację (pod warunkiem, że obie tabele posiadają pola, które można wykorzystać do przypisania sobie poszczególnych rekordów):




W tym przypadku powinniśmy podać jawnie nazwy tabel przed nazwami pól, które wybieramy - dzięki temu unikniemy błędów w sytuacji, gdyby poszczególne tabele zawierały pola o takich samych nazwach. Po słowie FROM podajemy nazwę pierwszej tabeli, po JOIN kolejnej wraz z klauzulą ON w której przyrównujemy pola, wg których dane z tabel będą łączone (u nas wiemy, że "id_prod" z tabeli "sprzedaż" odpowiada "id" z tabeli "produkty"). Zauważmy, że wyświetlone zostały tylko i wyłącznie te rekordy, które są sobie równe - czyli dla odpowiednich rekordów w jednej tabeli znaleziono pozycje w drugiej - i tylko te zostały wyświetlone. Nie podanie jakiegokolwiek sformułowania poza JOIN (jak w powyższym przykładzie) oznacza stworzenie tzw. INNER JOIN - czyli szukania części wspólnej wg podanych warunków.

Wspomnieć trzeba, że łączyć można więcej tabel (każdą oddzielając sformułowaniem JOIN i wykorzystując więcej opcji ON), w definicji połączeń możemy używać także operatorów AND oraz OR wraz z nawiasami - jeśli jest taka potrzeba. Dla przykładu zmodyfikujemy powyższe zapytanie nadając odpowiednim tabelom aliasy, a tabelę "produkty" podłączymy dwukrotnie (tylko dla przykładu):




Podanie po nazwie tabeli określonego wyrażenia, tworzymy alias, którym możemy się posługiwać w zapytaniu - u nas to jest "s" dla tabeli "sprzedaz", "p" i "r" dla dwukrotnie podłączanej tabeli "produkty". Po pierwszej sekwencji JOIN ON, następuje ona po raz drugi - "doklejając" kolejny raz (ale z innym aliasem - dla przejrzystości i poprawności polecenia). Nasz przykład jest banalny, ale w rzeczywistości zdarza się, iż określona tabela w ramach jednego polecenia SQL jest podłączana wielokrotnie, przy czym za każdym razem wykorzystywane są inne warunki połączenia - wówczas aliasy są niezbędne. Poza JOIN (INNER JOIN) istnieją definicje innych sprzężeń:

LEFT/RIGHT JOIN

Definicja i użycie jest podobna jak poprzednie polecenie jednak skutek jest inny:




Użycie LEFT powoduje, że zapytanie najpierw wybiera wszystkie rekordy z tabeli pierwszej (po lewej) i dopiero potem wg podanego warunku dokleja te rekordy z tabeli dołączanej, które spełniają warunek je łączący. Jeśli jakieś rekordy z tabeli dołączanej nie spełniają podanego warunku - zapytanie wstawia w te pola wartość "NULL". Jeśli chcemy sytuację odwrócić, musimy użyć RIGHT JOIN:



lub zamienić tabele miejscami i ponownie użyć LEFT JOIN:



FULL JOIN

Specyficzne polecenie, które umożliwia zwrócenie wszystkich rekordów z obu tabel, przy czym tam gdzie nie jest wypełniony warunek łączący tabele - zwracany jest NULL (zaznaczone czerwoną ramką):




Na koniec warto zauważyć, że dzięki połączeniu danych o ilościach i cenach, możemy obliczyć wartości sprzedaży:



Dodaliśmy pole obliczeniowe, które jednocześnie nazwaliśmy jako "wartosc" dzięki użyciu polecenia AS.