poniedziałek, 24 września 2018

SQLite połączenia


SQLite - JOINS

Klauzula SQLite joins (połączenia)  jest stosowana do łączenia zapisów z dwóch lub więcej tabel w bazie danych. JOIN jest środkiem do łączenia pól z dwóch tabel przy użyciu wspólnych wartości.
SQL definiuje trzy główne typy połączeń -
  • CROSS JOIN
  • INNER JOIN
  • OUTER JOIN
Zanim przejdziemy dalej, rozważmy dwie tabele FIRMA i DZIAŁ. Widzieliśmy już instrukcje INSERT do wypełnienia tabeli PRACOWNIK. Przyjmijmy więc listę rekordów dostępnych w tabeli PRACOWNIK:
id          nazwisko    wiek        adres       pensja
----------  ----------  ----------  ----------  ----------
1           Adam        32          Warszawa    2000.0
2           Piotr       25          Piaseczno   1500.0
3           Tomasz      23          Grodzisk    2000.0
4           Marek       25          Płock       6500.0
5           Dawid       27          Halinów     8500.0
6           Katarzyna   22          Marki       4500.0
7           Jan         24          Kraków      4500.0
8           Paweł       24          Zielonka    3500.0
9           Jan         44          Kobyłka     5000.0
10          Jan         45          Nieporęt    5000.0
Kolejna tabela to DZiAL o następującej definicji:
CREATE TABLE DZIAL(
   id INT PRIMARY KEY      NOT NULL,
   dzial           CHAR(50) NOT NULL,
   prac_id         INT      NOT NULL
);
Oto lista instrukcji INSERT do wypełnienia tabeli DZIAL:
INSERT INTO DZIAL (id, dzial, prac_id)
VALUES (1, 'IT', 1 );

INSERT INTO DZIAL (id, dzial, prac_id)
VALUES (2, 'Logistyka', 2 );

INSERT INTO DZIAL (id, dzial, prac_id)
VALUES (3, 'Finanse', 7 );
Na koniec mamy następującą listę rekordów dostępnych w tabeli DEPARTAMENT -
id          dzial       prac_id
----------  ----------  ----------
1           IT          1
2           Logistyka   2
3           Finanse     7

CROSS JOIN

CROSS JOIN dopasowuje każdy wiersz pierwszej tabeli do każdego wiersza w drugiej tabeli. Jeśli tabele wejściowe mają odpowiednio wiersz x i y, wynikowa tabela będzie miała wiersz x * y. Ponieważ CROSS JOIN mają potencjał generowania bardzo dużych tabel, należy zachować ostrożność, aby używać ich tylko w razie potrzeby.
Poniżej znajduje się składnia CROSS JOIN:
SELECT ... FROM tabela1 CROSS JOIN tabela2 ...
Na podstawie powyższych tabel możesz napisać CROSS JOIN w następujący sposób:
sqlite> SELECT prac_id, nazwisko, dzial FROM pracownik CROSS JOIN dzial;
Powyższe zapytanie da następujący wynik:
prac_id     nazwisko    dzial
----------  ----------  ----------
1           Adam        IT
2           Adam        Logistyka
7           Adam        Finanse
1           Piotr       IT
2           Piotr       Logistyka
7           Piotr       Finanse
1           Tomasz      IT
2           Tomasz      Logistyka
7           Tomasz      Finanse
1           Marek       IT
2           Marek       Logistyka
7           Marek       Finanse
1           Dawid       IT
2           Dawid       Logistyka
7           Dawid       Finanse
1           Katarzyna   IT
2           Katarzyna   Logistyka
7           Katarzyna   Finanse
1           Jan         IT
2           Jan         Logistyka
7           Jan         Finanse
1           Paweł       IT
2           Paweł       Logistyka
7           Paweł       Finanse
1           Jan         IT
2           Jan         Logistyka
7           Jan         Finanse
1           Jan         IT
2           Jan         Logistyka
7           Jan         Finanse

INNER JOIN

INNER JOIN tworzy nową tabelę wyników, łącząc wartości kolumn dwóch tabel (tabela 1 i tabela 2) na podstawie predykatu łączenia. Zapytanie porównuje każdy wiersz tabeli1 z każdym wierszem tabeli2, 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 A i B są łączone w wiersz wyników.
INNER JOIN jest najczęściej używanym i domyślnym typem łączenia. Możesz opcjonalnie użyć słowa kluczowego INNER.
Poniżej znajduje się składnia INNER JOIN:
SELECT ... FROM tabela1 [INNER] JOIN tabela2 ON wyrażenie_warunkowe ...
Aby uniknąć nadmiarowości i zachować krótsze sformułowanie, warunki INNER JOIN można deklarować za pomocą wyrażenia USING. To wyrażenie określa listę jednej lub więcej kolumn.
SELECT ... FROM tabela1 JOIN tabela2 USING ( kolumna1 ,... ) ...
NATURAL JOIN jest podobny do JOIN ... USING , tylko automatycznie testuje równość między wartościami każdej kolumny, która istnieje w obu tabelach -
SELECT ... FROM tabela1 NATURAL JOIN tabela2...
Na podstawie powyższych tabel możesz napisać INNER JOIN w następujący sposób:
sqlite> SELECT prac_id, nazwisko, dzial FROM pracownik INNER JOIN dzial
   ON pracownik.id = dzial.prac_id;
Powyższe zapytanie da następujący wynik:
prac_id     nazwisko    dzial
----------  ----------  ----------
1           Adam        IT
2           Piotr       Logistyka
7           Jan         Finanse

OUTER JOIN

OUTER JOIN jest rozszerzeniem INNER JOIN. Chociaż standard SQL definiuje trzy typy outer join: left, right i full, SQLite obsługuje LEFT OUTER JOIN.
OUTER JOIN mają warunek identyczny z INNER JOIN wyrażone za pomocą słowa kluczowego ON, USING, lub NATURAL. Tabela wyników początkowych jest obliczana w ten sam sposób. Po obliczeniu głównego JOIN, OUTER JOIN przyjme dowolne niepołączone wiersze z jednej lub obu tabel, wypełnią je wartościami NULL i dołączą je do wynikowej tabeli.
Poniżej znajduje się składnia LEFT OUTER JOIN -
SELECT ... FROM tabela1 LEFT OUTER JOIN tabela2 ON wyrażenie_warunkowe ...
Aby uniknąć nadmiarowości i zachować krótsze frazowanie, warunki OUTER JOIN można deklarować za pomocą wyrażenia USING. To wyrażenie określa listę jednej lub więcej kolumn.
SELECT ... FROM tabela1 LEFT OUTER JOIN tabela2 USING ( kolumna1 ,... ) ...
W oparciu o powyższe tabele, możesz napisać połączenie wewnętrzne w następujący sposób:
sqlite> SELECT prac_id, nazwisko, dzial FROM pracownik LEFT OUTER JOIN dzial
   ON pracownik.id = dzial.prac_id;
Powyższe zapytanie da następujący wynik:
prac_id     nazwisko    dzial
----------  ----------  ----------
1           Adam        IT
2           Piotr       Logistyka
            Tomasz
            Marek
            Dawid
            Katarzyna
7           Jan         Finanse
            Paweł
            Jan
            Jan


Brak komentarzy:

Prześlij komentarz