SQLite Join
SQLite Join
在本教程中,您将了解各种 SQLite 连接以从两个或多个表中查询数据。

一名艺术家(artist) 可以有多张专辑(album).一张专辑属于一名艺术家。
要查询艺术家和专辑表中的数据,您可以使用 INNER JOIN、LEFT JOIN 或 CROSS JOIN 子句。每个连接子句决定 SQLite 如何使用一个表中的数据与另一个表中的行进行匹配。
SQLite INNER JOIN 内连接
以下语句返回专辑标题和相应的艺术家姓名:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists ON artists.ArtistId = albums.ArtistId;
在此示例中,INNER JOIN 子句根据 ON 关键字后指定的连接条件 (artists.ArtistId = albums.ArtistId) 将 albums 表中的每一行与 artist 表中的每一行进行匹配。
如果连接表的列名相同(例如 ArtistId),则可以使用 USING 语法,如下所示:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING (ArtistId);
子句 USING(ArtistId) 相当于子句 ON arts.ArtistId = albums.ArtistId。
SQLite Left join 左连接
此语句使用带有 LEFT JOIN 子句的 SELECT 语句从艺术家和专辑表中检索艺术家姓名和专辑标题:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON artists.ArtistId = albums.ArtistId
ORDER BY
Name;

LEFT JOIN 子句根据连接条件 (artists.ArtistId = albums.ArtistId) 从左表(艺术家)开始选择数据,并匹配右表(专辑)中的行。
左连接返回艺术家表(或左表)中的所有行以及专辑表(或右表)中的匹配行。
如果左表中的某一行在右表中没有匹配的行,则 SQLite 将包含左表中该行的列,并将右表的列包含 NULL。
与 INNER JOIN 子句类似,可以使用 USING 语法来定义连接条件,如下所示:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;
如果要查找没有任何专辑的艺术家,可以添加 WHERE 子句,如以下查询所示:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON artists.ArtistId = albums.ArtistId
WHERE
Title IS NULL
ORDER BY
Name;

通常,这种类型的查询允许您找到左表中有但在右表中没有对应行的行。
SQLite CROSS JOIN
CROSS JOIN用于创建连接表中的笛卡尔积。与 INNER JOIN 和 LEFT JOIN 子句不同,CROSS JOIN 没有连接条件。以下是 CROSS JOIN 子句的基本语法:
SELECT
select_list
FROM
table1
CROSS JOIN table2;
CROSS JOIN 将第一个表(table1)中的每一行与第二个表(table2)中的每一行组合起来形成结果集。
如果第一个表有n行,第二个表有m行,则最终的结果有n*m行。
CROSS JOIN 子句的一个实际示例是将两组数据组合起来形成初始数据集以供进一步处理。例如,您有一个产品和月份列表,并且想要制定一个计划,确定何时可以销售哪些产品
以下脚本创建产品和日历表:
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);
此查询使用 CROSS JOIN 子句将产品与月份组合:
SELECT
*
FROM
products
CROSS JOIN calendars;
product y m
------- ---- --
P1 2019 1
P1 2019 2
P1 2019 3
P1 2019 4
P1 2019 5
P1 2019 6
P1 2019 7
P1 2019 8
P1 2019 9
P1 2019 10
P1 2019 11
P1 2019 12
P2 2019 1
P2 2019 2
P2 2019 3
P2 2019 4
P2 2019 5
P2 2019 6
P2 2019 7
P2 2019 8
P2 2019 9
P2 2019 10
P2 2019 11
P2 2019 12
P3 2019 1
P3 2019 2
P3 2019 3
P3 2019 4
P3 2019 5
P3 2019 6
P3 2019 7
P3 2019 8
P3 2019 9
P3 2019 10
P3 2019 11
P3 2019 12
浙公网安备 33010602011771号