Złączenia wewnętrzne oraz zewnętrzne tabel

Na początku oceniłem zagadnienie jako proste do wyjaśnienia. Po teście na grupie szkoleniowej zmieniłem zdanie. Marcinie nie dlatego, iż zagadnienie jest jakoś specjalnie trudne, ale ma wiele wątków i bardzo łatwo rozwlec, dużo powiedzieć, uczniowie się gubią. Stąd też niewielkie opóźnienie w publikacji tekstu. Co prawda test na grupie szkoleniowej miał miejsce, materiał nieco poprawiłem po nim, ale Marcinie, liczę na Twój wkład w opracowywanie postu, ostatnio tylko oczekujesz, a niewiele uwag od Ciebie mam. Dotyczy to także wszystkich czytelników, proszę o uwagi.

Dla pokazania zagadnienia łączenia tabel wymyśliłem dwie tabele. Pola tabel oraz pełna ich zawartość jest przestawiona na pierwszym, poniższym rysunku.
Tabelę UCZNIOWIE i SZKOLENIA można połączyć ze sobą wykorzystując pola:

  • ID w tabeli UCZNIOWIE oraz
  • ID_UCZESTNIKA w tabeli SZKOLENIA.

Pole ID_UCZESTNIKA nie może przyjąć innej wartości niż NULL (pole niewypełnione) lub dowolna wartość jaka występuje w tabeli UCZNIOWIE w polu pole ID. Ja wiem Marcinie, iż z punktu widzenia zasad tworzenia relacyjnych baz danych występuje tu istotny feler. Powinny być trzy tabele, UCZNIOWIE tj. wykaz uczniów, SZKOLENIA tj. wykaz dostępnych szkoleń i LISTY_OBECNOSCI, tj. spisy przeprowadzonych szkoleń z informacją, kto uczestniczył i jakie to szkolenia było, pamiętaj o tym. Przykład, jaki skonstruowałem i tu używam jest do pokazania idei złączeń :-) Jak już ją zrozumiesz, to pokażę Ci jak to powinno być z użyciem trzech tabel.
 

Kontynuujmy zatem Marcinie.  By cokolwiek złączyć - muszą być tabele, co najmniej dwie (więcej nie jest polecane) i trzeba wskazać warunki-zasady łączenia (o kartezjanach, tj. złączeniach każdy z każdym w ogóle nie myśl). Warunków łączenia musi być n-1 gdzie n to liczba łączonych tabel.
 

Ponieważ w sekcji pomiędzy SELECT a FROM trzeba wymieniać precyzyjnie, które pola i z której tabeli chcesz wyświetlać musisz podawać nazwę tabeli oraz po kropce nazwę pola. Jak pracujesz na jednej tabeli, to ten problem nie występuje. Zatem przy łączeniach, gdzie będziesz miał w obróbce więcej niż jedną tabelę wygodnie jest zatem nadać aliasy i zamiast nazwy tabeli podawać krótki, jednoliterowy  lub dwuliterowy alias, a po kropce nazwę pola. To w przykładach jest doskonale widoczne :-)

Złączenie wewnętrzne – dotyczy jak najbardziej dwóch tabel, jeżeli jednej to byłoby to samozłączenie.
Sformułowanie „Wewnętrzne” oznacza, iż w wyniku zapytania ze złączeniem tabel wystąpią jedynie te rekordy, dla których nastąpiło złączenie. Słowo „wewnętrznie” jest tu stosowane dla odróżnienia od dokładania wierszy, dla których nie występuje złączenie, czyli od złączenie zewnętrznego.
 

Jeszcze raz:
  • wewnętrzne złączenie, w wyniku tylko te rekordy, dla których następuje łączenie w obu tabelach,
  • zewnętrzne lewe, tabela po lewej traktowana jako większa, uboższa ta po prawej, w zależności od notacji należy napisać LEFT OUTER JOIN lub postawić plusik przy uboższej tabeli, po prawej,
  • zewnętrzne prawe, tabela po prawej traktowana jako większa, uboższa ta po lewej, w zależności od notacji należy napisać RIGHT OUTER JOIN lub postawić plusik przy uboższej tabeli, po lewej,
  • zewnętrzne, lewo i prawo, nie ma notacji z plusikiem, jest tylko FULL OUTOR JOIN.
Zwracam uwagę, iż dla złączeń zewnętrznych niezależnie od strony ma miejsce sytuacja, iż z jednej tabeli, dla braku złączenia jest, co wyświetlać, a z drugiej nie, to pola są uzupełniane NULLAMI. 
Zmęczyłem się opisywaniem, zatem dla kolejne obrazki koniecznie zobaczyć, pokazują one to co wyżej napisałem plus extra obrazek opisujący używanie notacji z JOIN. 



Może i wcześniej powinienem objaśnić co to jest notacja z plusikiem, a co ta z JOIN, skucha… Po prostu notacja, sposób łączenia „z plusikiem” działa na bazie ORACLE, a notacja z „JOIN” to standard ANSI SQL 1999 w zakresie składni tworzenia złączeń. Uwaga: bazy Oracle przed wersją 9i nie obsługują standardu z „JOIN” a od 9i w górę możliwe są obie. Notacja „z plusikiem” nie zadziała na innych bazach niż Oracle.
 

Dla przećwiczenia, wykorzystania:

Pozdrawiam,
W.

Brak komentarzy:

Prześlij komentarz