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.