PostgreSQL - DOŁĄCZA

PostgreSQL JoinsKlauzula służy do łączenia rekordów z dwóch lub więcej tabel w bazie danych. JOIN to sposób łączenia pól z dwóch tabel przy użyciu wspólnych wartości.

Typy złączeń w PostgreSQL to -

  • CROSS JOIN
  • WEWNĘTRZNE DOŁĄCZENIE
  • POŁĄCZENIE LEWE ZEWNĘTRZNE
  • WŁAŚCIWE POŁĄCZENIE ZEWNĘTRZNE
  • PEŁNE DOŁĄCZENIE ZEWNĘTRZNE

Zanim przejdziemy dalej, rozważmy dwie tabele, FIRMA i DZIAŁ. Widzieliśmy już instrukcje INSERT wypełniające tabelę COMPANY. Przyjmijmy więc listę rekordów dostępnych w tabeli FIRMA -

id | name  | age | address   | salary | join_date
----+-------+-----+-----------+--------+-----------
  1 | Paul  |  32 | California|  20000 | 2001-07-13
  3 | Teddy |  23 | Norway    |  20000 |
  4 | Mark  |  25 | Rich-Mond |  65000 | 2007-12-13
  5 | David |  27 | Texas     |  85000 | 2007-12-13
  2 | Allen |  25 | Texas     |        | 2007-12-13
  8 | Paul  |  24 | Houston   |  20000 | 2005-07-13
  9 | James |  44 | Norway    |   5000 | 2005-07-13
 10 | James |  45 | Texas     |   5000 | 2005-07-13

Kolejna tabela to DEPARTMENT, ma następującą definicję -

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

Oto lista instrukcji INSERT do wypełnienia tabeli DEPARTMENT -

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

Na koniec mamy następującą listę rekordów dostępnych w tabeli DEPARTMENT -

id | dept        | emp_id
----+-------------+--------
  1 | IT Billing  |  1
  2 | Engineering |  2
  3 | Finance     |  7

CROSS JOIN

CROSS JOIN dopasowuje każdy wiersz pierwszej tabeli do każdego wiersza drugiej tabeli. Jeśli tabele wejściowe mają odpowiednio kolumny x i y, wynikowa tabela będzie miała kolumny x + y. Ponieważ połączenia CROSS JOIN mogą generować bardzo duże tabele, należy uważać, aby ich używać tylko wtedy, gdy jest to właściwe.

Poniżej znajduje się składnia CROSS JOIN -

SELECT ... FROM table1 CROSS JOIN table2 ...

Na podstawie powyższych tabel możemy napisać CROSS JOIN w następujący sposób -

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

Powyższe zapytanie da następujący wynik -

emp_id| name  |  dept
------|-------|--------------
    1 | Paul  | IT Billing
    1 | Teddy | IT Billing
    1 | Mark  | IT Billing
    1 | David | IT Billing
    1 | Allen | IT Billing
    1 | Paul  | IT Billing
    1 | James | IT Billing
    1 | James | IT Billing
    2 | Paul  | Engineering
    2 | Teddy | Engineering
    2 | Mark  | Engineering
    2 | David | Engineering
    2 | Allen | Engineering
    2 | Paul  | Engineering
    2 | James | Engineering
    2 | James | Engineering
    7 | Paul  | Finance
    7 | Teddy | Finance
    7 | Mark  | Finance
    7 | David | Finance
    7 | Allen | Finance
    7 | Paul  | Finance
    7 | James | Finance
    7 | James | Finance

WEWNĘTRZNE DOŁĄCZENIE

INNER JOIN tworzy nową tabelę wynikową, łącząc wartości kolumn z dwóch tabel (tabela1 i tabela2) na podstawie predykatu łączenia. Zapytanie porównuje każdy wiersz tabeli tabela1 z każdym wierszem tabeli tabela2, aby znaleźć wszystkie pary wierszy, które spełniają predykat łączenia. Gdy predykat łączenia jest spełniony, wartości kolumn dla każdej dopasowanej pary wierszy tabela1 i tabela2 są łączone w wiersz wynikowy.

SPRZĘŻENIE WEWNĘTRZNE jest najpowszechniejszym typem sprzężenia i domyślnym typem sprzężenia. Opcjonalnie można użyć słowa kluczowego INNER.

Poniżej przedstawiono składnię INNER JOIN -

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;

Na podstawie powyższych tabel możemy napisać INNER JOIN w następujący sposób -

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

Powyższe zapytanie da następujący wynik -

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering

POŁĄCZENIE LEWE ZEWNĘTRZNE

OUTER JOIN jest rozszerzeniem INNER JOIN. Standard SQL definiuje trzy typy POŁĄCZEŃ ZEWNĘTRZNYCH: LEFT, RIGHT i FULL, a PostgreSQL obsługuje je wszystkie.

W przypadku LEFT OUTER JOIN, najpierw wykonywane jest sprzężenie wewnętrzne. Następnie dla każdego wiersza w tabeli T1, który nie spełnia warunku łączenia z żadnym wierszem w tabeli T2, do połączonego wiersza dodawane są wartości null w kolumnach T2. Zatem połączona tabela zawsze ma co najmniej jeden wiersz na każdy wiersz w T1.

Poniżej przedstawiono składnię LEFT OUTER JOIN -

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

Na podstawie powyższych tabel możemy napisać sprzężenie wewnętrzne w następujący sposób -

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

Powyższe zapytanie da następujący wynik -

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |

WŁAŚCIWE POŁĄCZENIE ZEWNĘTRZNE

Najpierw wykonywane jest sprzężenie wewnętrzne. Następnie dla każdego wiersza w tabeli T2, który nie spełnia warunku łączenia z żadnym wierszem w tabeli T1, do połączonego wiersza dodawane są wartości null w kolumnach T1. To jest odwrotność złączenia lewostronnego; tabela wynikowa zawsze będzie miała wiersz dla każdego wiersza w T2.

Oto składnia RIGHT OUTER JOIN -

SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...

Na podstawie powyższych tabel możemy napisać sprzężenie wewnętrzne w następujący sposób -

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

Powyższe zapytanie da następujący wynik -

emp_id | name  | dept
--------+-------+--------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance

PEŁNE DOŁĄCZENIE ZEWNĘTRZNE

Najpierw wykonywane jest sprzężenie wewnętrzne. Następnie dla każdego wiersza w tabeli T1, który nie spełnia warunku łączenia z żadnym wierszem w tabeli T2, do połączonego wiersza dodawane są wartości null w kolumnach T2. Ponadto dla każdego wiersza T2, który nie spełnia warunku łączenia z żadnym wierszem w T1, dodawany jest połączony wiersz z wartościami null w kolumnach T1.

Poniżej znajduje się składnia FULL OUTER JOIN -

SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

Na podstawie powyższych tabel możemy napisać sprzężenie wewnętrzne w następujący sposób -

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

Powyższe zapytanie da następujący wynik -

emp_id | name  | dept
--------+-------+---------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |