Резюме :в този урок ще научите за различни видове SQLite присъединявания за запитване на данни от две или повече таблици.
За демонстрацията ще използваме artists и albums таблици от примерната база данни.
Един изпълнител може да има нула или много албуми, докато албумът принадлежи на един изпълнител.
За да поискате данни и от двамата artists и albums таблици, които използвате, можете да използвате INNER JOIN , LEFT JOIN , или CROSS JOIN клауза. Всяка клауза за присъединяване определя как SQLite използва данни от една таблица, за да съвпадне с редове в друга таблица.
Имайте предвид, че SQLite не поддържа директно RIGHT JOIN и FULL OUTER JOIN .
SQLite INNER JOIN
Следното изявление връща заглавията на албумите и имената на техните изпълнители:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;
Code language: SQL (Structured Query Language) (sql) Ето частичния изход:
В този пример INNER JOIN клаузата съответства на всеки ред от albums таблица с всеки ред от artists таблица въз основа на условието за присъединяване (artists.ArtistId = albums.ArtistId ) посочен след ON ключова дума.
Ако условието за присъединяване е вярно (или 1), колоните с редове от двата albums и artists таблиците са включени в набора от резултати.
Тази заявка използва псевдоними на таблици (l за albums таблица и r за artists таблица), за да съкратите заявката:
SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;
Code language: SQL (Structured Query Language) (sql)
В случай, че имената на колоните на обединените таблици са едни и същи, например ArtistId , можете да използвате USING синтаксис, както следва:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);Code language: SQL (Structured Query Language) (sql)
Клаузата USING(ArtistId) е еквивалентен на клаузата ON artists.ArtistId = albums.ArtistId .
SQLite LEFT JOIN
Това изявление избира имената на изпълнители и заглавията на албуми от artists и albums таблици с помощта на LEFT JOIN клауза:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql) Ето изхода:
LEFT JOIN клаузата избира данни, започващи от лявата таблица (artists ) и съвпадащи редове в дясната таблица (albums ) въз основа на условието за присъединяване (artists.ArtistId = albums.ArtistId ) .
Лявото присъединяване връща всички редове от artists таблица (или лява таблица) и съвпадащите редове от albums таблица (или дясна маса).
Ако ред от лявата таблица няма съвпадащ ред в дясната таблица, SQLite включва колони от редовете в лявата таблица и NULL за колоните на дясната таблица.
Подобно на INNER JOIN клауза, можете да използвате USING синтаксис за условието за присъединяване, както следва:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;Code language: SQL (Structured Query Language) (sql)
Ако искате да намерите изпълнители, които нямат албуми, можете да добавите WHERE клауза, както е показано в следната заявка:
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) Тази снимка показва частичния изход:
По принцип този тип заявка ви позволява да намерите редове, които са налични в лявата таблица, но нямат съответни редове в дясната таблица.
Обърнете внимание, че LEFT JOIN и LEFT OUTER JOIN са синоними.
SQLite CROSS JOIN
CROSS JOIN клаузата създава декартово произведение на редове от обединените таблици.
За разлика от INNER JOIN и LEFT JOIN клаузи, CROSS JOIN няма условие за присъединяване. Ето основния синтаксис на CROSS JOIN клауза:
SELECT
select_list
FROM table1
CROSS JOIN table2;
Code language: SQL (Structured Query Language) (sql)
CROSS JOIN комбинира всеки ред от първата таблица (table1 ) с всеки ред от втората таблица (table2 ), за да образувате резултатния набор.
Ако първата таблица има N редове, втората таблица има M редове, крайният резултат ще има NxM редове.
Практичен пример за CROSS JOIN клауза е да се комбинират два набора от данни за формиране на първоначален набор от данни за по-нататъшна обработка. Например имате списък с продукти и месеци и искате да направите план кога можете да продавате кои продукти.
Следният скрипт създава products и calendars таблици:
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)
Тази заявка използва CROSS JOIN клауза за комбиниране на продуктите с месеците:
SELECT *
FROM products
CROSS JOIN calendars;
Code language: SQL (Structured Query Language) (sql) Ето изхода:
В този урок научихте различни видове SQLite съединения, които ви позволяват да правите заявки от множество таблици.