Oracle
 sql >> Baza danych >  >> RDS >> Oracle

sprzężenie własne vs sprzężenie wewnętrzne

Uważam, że pomocne jest myślenie o wszystkich tabelach w wyrażeniu SELECT jako reprezentujących ich własne zestawy danych.

Zanim zastosujesz jakiekolwiek warunki, możesz pomyśleć, że każdy zestaw danych jest kompletny (na przykład cała tabela).

Połączenie to tylko jeden z kilku sposobów na rozpoczęcie dopracowywania tych zestawów danych, aby znaleźć informacje, których naprawdę potrzebujesz.

Chociaż schemat bazy danych może być zaprojektowany z myślą o pewnych relacjach (klucz podstawowy <-> klucz obcy), te relacje tak naprawdę istnieją tylko w kontekście konkretnego zapytania. Autor zapytań może powiązać wszystko, co chce, z tym, co chce. Przykład tego podam później...

ZŁĄCZENIE WEWNĘTRZNE łączy ze sobą dwa stoły. Często w jednym zapytaniu występuje wiele operacji JOIN, aby połączyć ze sobą wiele tabel. Może to być tak skomplikowane, jak to konieczne. Jako prosty przykład rozważ następujące trzy tabele...

STUDENT

| STUDENTID | LASTNAME | FIRSTNAME |
------------------------------------
      1     |  Smith   |   John
      2     |  Patel   |  Sanjay
      3     |   Lee    |  Kevin
      4     |  Jackson |  Steven
ENROLLMENT

| ENROLLMENT ID | STUDENTID | CLASSID |
---------------------------------------
        1       |     2     |    3
        2       |     3     |    1
        3       |     4     |    2
CLASS

| CLASSID | COURSE | PROFESSOR |
--------------------------------
     1    | CS 101 |   Smith
     2    | CS 201 |  Ghandi
     3    | CS 301 |  McDavid
     4    | CS 401 |  Martinez

Stół STUDENT i stół CLASS zostały zaprojektowane tak, aby były ze sobą powiązane poprzez tabelę ENROLLMENT. Ten rodzaj tabeli nazywa się Tabelą połączeń .

Aby napisać zapytanie wyświetlające wszystkich uczniów i klasy, na które są zapisani, należy użyć dwóch połączenia wewnętrzne...

SELECT stud.LASTNAME, stud.FIRSTNAME, class.COURSE, class.PROFESSOR
FROM STUDENT stud
INNER JOIN ENROLLMENT enr
    ON stud.STUDENTID = enr.STUDENTID
INNER JOIN CLASS class
    ON class.CLASSID = enr.CLASSID;

Przeczytaj uważnie powyższe, a powinieneś zobaczyć, co się dzieje. W zamian otrzymasz następujący zestaw danych...

 | LASTNAME | FIRSTNAME | COURSE | PROFESSOR |
 ---------------------------------------------
     Patel  |   Sanjay  | CS 301 |  McDavid
      Lee   |   Kevin   | CS 101 |   Smith
    Jackson |  Steven   | CS 201 |  Ghandi

Używając klauzul JOIN, ograniczyliśmy zbiory danych wszystkich trzech tabel tylko do tych, które pasują do siebie. „Dopasowania” są definiowane za pomocą opcji klauzule. Pamiętaj, że jeśli uruchomisz to zapytanie, nie zobacz wiersz CLASSID 4 z tabeli CLASS lub wiersz STUDENTID 1 z tabeli STUDENT, ponieważ te identyfikatory nie istnieją w dopasowaniach (w tym przypadku tabela ENROLLMENT). Zajrzyj do „LEFT”/„RIGHT”/„FULL OUTER” JOIN, aby dowiedzieć się, jak sprawić, by to działało trochę inaczej.

Pamiętaj, że zgodnie z moimi wcześniejszymi komentarzami na temat „związków”, nie ma nie ma powodu dlaczego nie można uruchomić zapytania dotyczącego tabeli STUDENT i tabeli CLASS bezpośrednio w kolumnach LASTNAME i PROFESSOR. Te dwie kolumny pasują do typu danych i spójrz na to! Mają nawet wspólną wartość! Prawdopodobnie byłby to dziwny zestaw danych do otrzymania w zamian. Chodzi mi o to, że można to zrobić i nigdy nie wiesz, jakie potrzeby możesz mieć w przyszłości dla ciekawych połączeń w swoich danych. Zrozum projekt bazy danych, ale nie myśl o „relacjach” jako o regułach, których nie można zignorować.

W międzyczasie... SAMO DOŁĄCZA SIĘ!

Rozważ poniższą tabelę...

PERSON

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      1    |     1    |  John
      2    |     1    | Brynn
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim
      6    |     3    | Becca

Jeśli masz ochotę stworzyć bazę danych wszystkich osób, które znasz i które należą do tej samej rodziny, może tak wyglądać.

Jeśli chciałbyś zwrócić jedną osobę, na przykład PERSONID 4, napisałbyś...

SELECT * FROM PERSON WHERE PERSONID = 4;

Dowiesz się, że jest w rodzinie z FAMILYID 2. Potem znajdziesz wszystkie O OSÓB w jego rodzinie napisałbyś...

SELECT * FROM PERSON WHERE FAMILYID = 2;

Gotowe i gotowe! SQL, oczywiście, może to zrobić w jednym zapytaniu, używając, jak zgadłeś, SELF JOIN.

Co tak naprawdę wywołuje potrzebę SELF JOIN tutaj jest to, że tabela zawiera unikalną kolumnę (PERSONID) i kolumnę, która służy jako rodzaj „Kategorii” (FAMILYID). Ta koncepcja nazywa się kardynalność a w tym przypadku oznacza jeden do wielu lub 1:M relacja. Jest tylko jeden każdej OSOBIE ale jest wiele Osoby w RODZINIE .

Zatem to, co chcemy zwrócić, to wszystko członków rodziny, jeśli jeden członek rodziny PERSONID jest znany...

SELECT fam.*
FROM PERSON per
JOIN PERSON fam
    ON per.FamilyID = fam.FamilyID
WHERE per.PERSONID = 4;

Oto, co otrzymasz...

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim

Zwróćmy uwagę na kilka rzeczy. Słowa SAMO DOŁĄCZ nie występują nigdzie. To dlatego, że SELF JOIN to tylko koncepcja. Słowo DOŁĄCZ w powyższym zapytaniu mogło być LEFT JOIN zamiast tego wydarzyłyby się inne rzeczy. Punkt SAMO DOŁĄCZENIA jest to, że używasz tej samej tabeli dwa razy.

Rozważ moje mydelniczki z wcześniejszych zestawów danych. Tutaj dwukrotnie zaczęliśmy od zestawu danych z tabeli PERSON. Ani instancja zbioru danych wpływa na drugi, chyba że powiemy, że tak.

Zacznijmy od dołu zapytania. na zbiór danych jest ograniczony tylko do tych wierszy, w których PERSONID =4. Znając tabelę wiemy, że zwróci dokładnie jeden wiersz. Kolumna FAMILYID w tym wierszu ma wartość 2.

W klauzuli ON ograniczamy rodzinę zestaw danych (który w tym momencie jest nadal całą tabelą PERSON) tylko do tych wierszy, w których wartość FAMILYID pasuje do jednego lub więcej FAMILYID na zbiór danych. Jak już wspomnieliśmy, znamy na zestaw danych ma tylko jeden wiersz, a zatem jedną wartość FAMILYID. Dlatego rodzina zestaw danych zawiera teraz tylko wiersze, w których FAMILYID =2.

Na koniec, u góry zapytania, wybieramy wszystkie wiersze w fam zestaw danych.

Voila! Dwa zapytania w jednym.

Podsumowując, DOŁĄCZENIE WEWNĘTRZNE jest jednym z kilku rodzajów operacji JOIN. Chciałbym zdecydowanie zasugeruj dalsze czytanie LEFT, RIGHT i FULL OUTER JOIN (łącznie nazywane OUTER JOIN ). Osobiście raz przegapiłem okazję do pracy, ponieważ miałem słabą wiedzę na temat OUTER JOIN i nie pozwolę, aby to się powtórzyło!

SAMO DOŁĄCZENIE to po prostu dowolna operacja JOIN, w której łączysz tabelę z nią samą. Sposób, w jaki zdecydujesz się DOŁĄCZYĆ do tego stołu, może użyć INNER JOIN lub ZŁĄCZENIE ZEWNĘTRZNE. Pamiętaj, że z SELF JOIN , aby nie pomylić swojego silnika SQL, musisz używaj aliasów tabeli (fam i per z powyższych. Uzupełnij to, co ma sens dla zapytania) lub nie ma sposobu na rozróżnienie różnych wersji tego samego stołu.

Teraz, gdy rozumiesz różnicę, otwórz swój umysł ładnie i szeroko i zdaj sobie sprawę, że jedno zapytanie może zawierać jednocześnie wszystkie różne rodzaje JOIN. To tylko kwestia tego, jakich danych chcesz i jak musisz przekręcać i naginać zapytanie, aby je uzyskać. Jeśli uruchamiasz jedno zapytanie i bierzesz wynik tego zapytania i używasz go jako danych wejściowych innego zapytania, prawdopodobnie możesz użyć JOIN aby zamiast tego było to jedno zapytanie.

Aby pobawić się SQL, odwiedź W3Schools.com Jest tam przechowywana lokalnie baza danych z mnóstwem tabel, które są zaprojektowane tak, aby były ze sobą powiązane na różne sposoby i jest wypełniona danymi! Możesz TWORZYĆ, UPUSZCZAĆ, WSTAWIĆ, UAKTUALNIĆ i WYBRAĆ wszystko, co chcesz i przywrócić bazę danych z powrotem do wartości domyślnych w dowolnym momencie. Wypróbuj wszystkie rodzaje SQL, aby poeksperymentować z różnymi sztuczkami. Wiele się tam nauczyłem.

Przepraszam, jeśli było to trochę rozwlekłe, ale osobiście zmagałem się z koncepcją JOIN, kiedy zaczynałem uczyć się SQL i wyjaśniając koncepcję za pomocą szeregu innych złożonych koncepcji, ugrzęzł mnie. Najlepiej czasami zacząć od dołu.

Mam nadzieję, że to pomoże. Jeśli możesz włożyć JOIN do tylnej kieszeni, możesz zdziałać magię z SQL!

Miłego zadawania pytań!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Connect By Loop w danych użytkownika

  2. wybierz najnowszy wpis

  3. Wyzwanie testowania bazy danych Oracle — Porównaj dane schematu

  4. Utwórz tabelę zagnieżdżoną i wstawiaj dane tylko do tabeli wewnętrznej

  5. Zapytanie z parametrami IN oddzielonymi przecinkami w PLSQL