Pobierz dane z wielu tabel
Wyświetlanie danych z wielu tabel
Powiązane tabele dużej bazy danych są połączone za pomocą kluczy obcych i podstawowych lub często określanych jako wspólne kolumny. Możliwość łączenia tabel umożliwi nadanie większego znaczenia utworzonej tabeli wynikowej. Aby tabele liczbowe `` n '' zostały połączone w zapytaniu, wymagane jest minimum (n-1) warunków łączenia. Na podstawie warunków łączenia Oracle łączy pasującą parę wierszy i wyświetla ten, który spełnia warunek łączenia.
Połączenia są klasyfikowane jak poniżej
Łączenie naturalne (nazywane również równaniem lub łączeniem prostym) - tworzy sprzężenie przy użyciu powszechnie nazwanej i zdefiniowanej kolumny.
Łączenie w przypadku braku równości - Łączy tabele, gdy nie ma równoważnych wierszy w tabelach do połączenia - na przykład w celu dopasowania wartości w jednej kolumnie tabeli do zakresu wartości w innej tabeli.
Łączenie własne - Łączy stół ze sobą.
Sprzężenie zewnętrzne - obejmuje rekordy tabeli w danych wyjściowych, gdy w drugiej tabeli nie ma pasującego rekordu.
Łączenie kartezjańskie (znane również jako iloczyn kartezjański lub sprzężenie krzyżowe) - replikuje każdy wiersz z pierwszej tabeli z każdym wierszem z drugiej tabeli. Tworzy sprzężenie między tabelami, wyświetlając każdą możliwą kombinację rekordów.
Połączenie naturalne
Słowo kluczowe NATURAL może uprościć składnię equijoin. NATURAL JOIN jest możliwe, gdy dwie (lub więcej) tabele mają kolumny o tej samej nazwie, a kolumny są zgodne z łączeniami, tj. Kolumny mają wspólną domenę wartości. operacja łączy wiersze z tabel, które mają równe wartości kolumn dla tych samych nazwanych kolumn.
Weź pod uwagę relację jeden do wielu między tabelami DEPARTMENTS i EMPLOYEES. Każda tabela ma kolumnę o nazwie DEPARTMENT_ID. Ta kolumna jest kluczem podstawowym tabeli DEPARTMENTS i kluczem obcym tabeli EMPLOYEES.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;
FIRST_NAME DNAME
---------- ------
MILLER DEPT 1
JOHN DEPT 1
MARTIN DEPT 2
EDWIN DEPT 2
Poniższe zapytanie SELECT łączy dwie tabele przez jawne określenie warunku łączenia za pomocą słowa kluczowego ON.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);
Istnieją pewne ograniczenia dotyczące NATURAL JOIN. Nie można określić kolumny LOB z NATURAL JOIN, a także kolumn biorących udział w łączeniu nie można kwalifikować za pomocą nazwy tabeli ani aliasu.
Klauzula KORZYSTANIE
Korzystając z łączeń naturalnych, Oracle niejawnie identyfikuje kolumny, które stanowią podstawę łączenia. Wiele sytuacji wymaga wyraźnej deklaracji warunków łączenia. W takich przypadkach używamy klauzuli USING do określenia kryteriów łączenia. Ponieważ klauzula USING łączy tabele na podstawie równości kolumn, jest również znana jako Equijoin. Są również znane jako łączenia wewnętrzne lub łączenia proste.
Składnia:
SELECT <column list>
FROM TABLE1 JOIN TABLE2
USING (column name)
Rozważ poniższe zapytanie SELECT, tabela EMPLOYEES i tabela DEPARTMENTS są łączone za pomocą wspólnej kolumny DEPARTMENT_ID.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);
Dołącz do siebie
Operacja SELF-JOIN tworzy tabelę wynikową, gdy interesująca relacja istnieje między wierszami przechowywanymi w jednej tabeli. Innymi słowy, gdy tabela jest łączona ze sobą, łączenie jest nazywane łączeniem własnym.
Rozważ tabelę EMPLOYEES, która zawiera pracowników i ich podległych menedżerów. Znalezienie nazwiska kierownika dla pracownika wymagałoby dołączenia w samej tabeli EMP. To jest typowy kandydat do samodzielnego dołączenia.
SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;
Non Equijoins
Sprzężenie nierówności jest używane, gdy powiązane kolumny nie mogą być połączone znakiem równości, co oznacza, że nie ma równoważnych wierszy w tabelach do połączenia. Sprzężenie nierówności umożliwia przechowywanie minimalnej wartości zakresu w jednej kolumnie rekordu i wartość maksymalną w innej kolumnie. Zamiast więc znajdować dopasowanie kolumna-kolumna, możesz użyć sprzężenia o braku równości, aby określić, czy wysyłany przedmiot mieści się w zakresie między minimalnym a maksymalnym zakresem w kolumnach.Jeśli sprzężenie znajdzie pasujący zakres dla elementu, odpowiadająca mu wysyłka opłata może zostać zwrócona w wynikach. Podobnie jak w przypadku tradycyjnej metody łączeń równości, łączenie w przypadku braku równości można wykonać w klauzuli WHERE. Ponadto słowa kluczowego JOIN można używać z klauzulą ON w celu określenia odpowiednich kolumn dla łączenia.
SELECT E.first_name,
J.job_hisal,
J.job_losal,
E.salary
FROM employees E JOIN job_sal J
ON (E.salary BETWEEN J.job_losal AND J.job_losal);
Możemy wykorzystać wszystkie omówione wcześniej parametry porównania, takie jak operatory równości i nierówności, BETWEEN, IS NULL, IS NOT NULL i RELATIONAL.
Połączenia zewnętrzne
Łączenie zewnętrzne służy do identyfikowania sytuacji, w których wiersze w jednej tabeli nie pasują do wierszy w drugiej tabeli, nawet jeśli te dwie tabele są powiązane.
Istnieją trzy typy połączeń zewnętrznych: LEFT, RIGHT i FULL OUTER JOIN. Wszystkie zaczynają się od WEWNĘTRZNEGO JOIN, a następnie dodają z powrotem niektóre opuszczone wiersze. LEFT OUTER JOIN dodaje z powrotem wszystkie wiersze, które są usuwane z pierwszej (lewej) tabeli w warunku łączenia, a kolumny wyjściowe z drugiej (prawej) tabeli są ustawiane na NULL. RIGHT OUTER JOIN dodaje z powrotem wszystkie wiersze, które są usuwane z drugiej (prawej) tabeli w warunku łączenia, a kolumny wyjściowe z pierwszej (lewej) tabeli są ustawiane na NULL. FULL OUTER JOIN dodaje z powrotem wszystkie wiersze, które są usuwane z obu tabel.
Prawe połączenie zewnętrzne
RIGHT OUTER JOIN dodaje z powrotem wszystkie wiersze, które są usuwane z drugiej (prawej) tabeli w warunku łączenia, a kolumny wyjściowe z pierwszej (lewej) tabeli są ustawiane na NULL. Zwróć uwagę, że poniższe zapytanie zawiera listę pracowników i odpowiadające im działy. Do działu 30 nie przypisano również żadnego pracownika.
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
Lewe połączenie zewnętrzne
LEFT OUTER JOIN dodaje z powrotem wszystkie wiersze, które są usuwane z pierwszej (lewej) tabeli w warunku łączenia, a kolumny wyjściowe z drugiej (prawej) tabeli są ustawiane na NULL. Przedstawione powyżej zapytanie może służyć do zademonstrowania lewego sprzężenia zewnętrznego, zamieniając pozycję znaku (+).
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
Pełne połączenie zewnętrzne
FULL OUTER JOIN dodaje z powrotem wszystkie wiersze, które są usuwane z obu tabel. Poniższe zapytanie pokazuje listę pracowników i ich działów. Zwróć uwagę, że pracownikowi „MAN” nie przypisano dotychczas żadnego działu (jest to NULL), a dział 30 nie jest przypisany do żadnego pracownika.
SELECT nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;
FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN -
JOHN 10
EDWIN 20
MILLER 10
MARTIN 20
- 30
6 rows selected.
Iloczyn kartezjański lub połączenie krzyżowe
W przypadku dwóch jednostek A i B A * B jest znane jako iloczyn kartezjański. Iloczyn kartezjański składa się ze wszystkich możliwych kombinacji wierszy z każdej z tabel. Dlatego też, gdy tabela z 10 wierszami jest połączona z tabelą z 20 wierszami, iloczyn kartezjański wynosi 200 wierszy (10 * 20 = 200). Kartezjańska tabela produktów z 24 wierszami (8 * 3 = 24).
Łączenie krzyżowe odnosi się do iloczynu kartezjańskiego dwóch tabel. Tworzy iloczyn krzyżowy dwóch tabel. Powyższe zapytanie można zapisać za pomocą klauzuli CROSS JOIN.
Tabela wyników iloczynu kartezjańskiego zwykle nie jest zbyt przydatna. W rzeczywistości taka tabela wyników może być strasznie myląca. Jeśli wykonasz poniższe zapytanie dla tabel PRACOWNICY i DZIAŁY, z tabeli wynikowej wynika, że każdy pracownik ma relację z każdym działem, a wiemy, że tak nie jest!
SELECT E.first_name, D.DNAME
FROM employees E,departments D;
Łączenie krzyżowe można zapisać jako,
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;