Podsumowanie :w tym samouczku dowiesz się o różnych rodzajach złączeń SQLite w celu zapytania o dane z dwóch lub więcej tabel.
Do demonstracji użyjemy artists i albums tabele z przykładowej bazy danych.
Wykonawca może mieć zero lub wiele albumów, podczas gdy album należy do jednego artysty.
Aby zapytać o dane od obu artists i albums tabele, których używasz, możesz użyć INNER JOIN , LEFT JOIN lub CROSS JOIN klauzula. Każda klauzula join określa, w jaki sposób SQLite używa danych z jednej tabeli, aby dopasować się do wierszy w innej tabeli.
Zauważ, że SQLite nie obsługuje bezpośrednio RIGHT JOIN i FULL OUTER JOIN .
SQLite INNER JOIN
Poniższe stwierdzenie zwraca tytuły albumów i ich nazwy wykonawców:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;
Code language: SQL (Structured Query Language) (sql) Oto częściowe wyjście:
W tym przykładzie INNER JOIN klauzula pasuje do każdego wiersza z albums tabela z każdym wierszem od artists tabela na podstawie warunku łączenia (artists.ArtistId = albums.ArtistId ) określony po ON słowo kluczowe.
Jeśli warunek łączenia ma wartość true (lub 1), kolumny wierszy z obu albums i artists tabele są zawarte w zestawie wyników.
To zapytanie używa aliasów tabeli (l dla albums table i r dla artists tabela), aby skrócić zapytanie:
SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;
Code language: SQL (Structured Query Language) (sql)
W przypadku, gdy nazwy kolumn połączonych tabel są takie same, np. ArtistId , możesz użyć USING składnia w następujący sposób:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);Code language: SQL (Structured Query Language) (sql)
Klauzula USING(ArtistId) jest równoważny z klauzulą ON artists.ArtistId = albums.ArtistId .
SQLite LEFT JOIN
To stwierdzenie wybiera nazwy wykonawców i tytuły albumów z listy artists i albums tabele za pomocą LEFT JOIN klauzula:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql) Oto wynik:
LEFT JOIN klauzula wybiera dane zaczynając od lewej tabeli (artists ) i pasujące wiersze w prawej tabeli (albums ) na podstawie warunku przyłączenia (artists.ArtistId = albums.ArtistId ).
Lewe sprzężenie zwraca wszystkie wiersze od artists tabela (lub tabela po lewej) i pasujące wiersze z albums stół (lub prawy stół).
Jeśli wiersz z lewej tabeli nie ma pasującego wiersza w prawej tabeli, SQLite dołącza kolumny wierszy w lewej tabeli i NULL dla kolumn prawej tabeli.
Podobne do INNER JOIN klauzula, możesz użyć USING składnia warunku złączenia w następujący sposób:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;Code language: SQL (Structured Query Language) (sql)
Jeśli chcesz znaleźć wykonawców, którzy nie mają żadnych albumów, możesz dodać WHERE klauzula, jak pokazano w następującym zapytaniu:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
WHERE Title IS NULL
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql) Ten obrazek pokazuje częściowe dane wyjściowe:
Ogólnie rzecz biorąc, ten typ zapytania pozwala znaleźć wiersze, które są dostępne w lewej tabeli, ale nie mają odpowiadających wierszy w prawej tabeli.
Zwróć uwagę, że LEFT JOIN i LEFT OUTER JOIN są synonimami.
SQLite CROSS JOIN
CROSS JOIN klauzula tworzy iloczyn kartezjański wierszy z połączonych tabel.
W przeciwieństwie do INNER JOIN i LEFT JOIN klauzul, CROSS JOIN nie ma warunku dołączenia. Oto podstawowa składnia CROSS JOIN klauzula:
SELECT
select_list
FROM table1
CROSS JOIN table2;
Code language: SQL (Structured Query Language) (sql)
CROSS JOIN łączy każdy wiersz z pierwszej tabeli (table1 ) z każdym wierszem z drugiej tabeli (table2 ), aby utworzyć zestaw wyników.
Jeśli pierwsza tabela zawiera N wierszy, druga tabela ma M wierszy, wynik końcowy będzie miał NxM wiersze.
Praktyczny przykład CROSS JOIN klauzulą jest połączenie dwóch zestawów danych w celu utworzenia wstępnego zbioru danych do dalszego przetwarzania. Na przykład masz listę produktów i miesięcy i chcesz zaplanować, kiedy będziesz mógł sprzedawać które produkty.
Poniższy skrypt tworzy products i calendars stoły:
CREATE TABLE products(
product text NOT null
);
INSERT INTO products(product)
VALUES('P1'),('P2'),('P3');
CREATE TABLE calendars(
y int NOT NULL,
m int NOT NULL
);
INSERT INTO calendars(y,m)
VALUES
(2019,1),
(2019,2),
(2019,3),
(2019,4),
(2019,5),
(2019,6),
(2019,7),
(2019,8),
(2019,9),
(2019,10),
(2019,11),
(2019,12);
Code language: SQL (Structured Query Language) (sql)
To zapytanie używa CROSS JOIN klauzula łączenia produktów z miesiącami:
SELECT *
FROM products
CROSS JOIN calendars;
Code language: SQL (Structured Query Language) (sql) Oto wynik:
W tym samouczku nauczyłeś się różnych rodzajów złączeń SQLite, które umożliwiają wykonywanie zapytań z wielu tabel.