Резюме :в този урок ще научите за различни видове 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 съединения, които ви позволяват да правите заявки от множество таблици.