Skip to main content

SQLite联接的直观解释

对于演示,我们将使用示例数据库中的艺术家和专辑表。

一位艺术家可以拥有零张或多张专辑,而一张专辑属于一位艺术家。

要从艺术家和相册表中查询数据,可以使用内部联接、左联接或交叉联接子句。每个join子句确定SQLite如何使用一个表中的数据与另一个表中的行进行匹配。

请注意,SQLite不直接支持右连接和完全外部连接。

SQLite内部连接

以下语句返回专辑标题及其艺术家姓名:

SELECT 
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;

以下是部分输出:

在本例中,内部JOIN子句根据on关键字后指定的连接条件(artists.ArtistId=albums.ArtistId),将albums表中的每一行与artists表中的每一行相匹配。

如果联接条件的计算结果为true(或1),则albums和Artisters表中的行列都将包含在结果集中。

此查询使用表别名(l代表albums表,r代表artists表)缩短查询:

SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;

如果联接表的列名相同,例如ArtistId,则可以使用以下USING语法:

SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);

使用(ArtistId)的条款与关于艺术家的条款相等。ArtistId=专辑。艺术家。

SQLite左连接

此语句使用LEFT JOIN子句从艺术家和专辑表中选择艺术家姓名和专辑标题:

SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
ORDER BY Name;

以下是输出:

sqlite join - left join example

LEFT JOIN子句根据连接条件(artists.ArtistId=albums.ArtistId)选择从左表(艺术家)开始的数据和右表(相册)中匹配的行。

左连接返回艺术家表(或左表)中的所有行以及相册表(或右表)中的匹配行。

如果左表中的一行在右表中没有匹配的行,SQLite将包括左表中的行的列,右表中的列为NULL。

与内部连接子句类似,您可以对连接条件使用如下语法:

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 join - left join with a where clause example

通常,这种类型的查询允许您查找左表中可用但右表中没有相应行的行。

注意左连接和左外连接是同义词。

SQLite交叉连接

CROSS-JOIN子句从连接的表中创建行的笛卡尔积。

与内部联接和左联接子句不同,交叉联接没有联接条件。以下是交叉连接子句的基本语法:

SELECT
select_list
FROM table1
CROSS JOIN table2;

交叉联接将第一个表(表1)中的每一行与第二个表(表2)中的每一行组合起来,形成结果集。

如果第一个表有N行,第二个表有M行,那么最终结果将有NxM行。

交叉连接子句的一个实际例子是组合两组数据以形成初始数据集以供进一步处理。例如,你有一个产品和月份的清单,你想制定一个计划,什么时候可以销售哪些产品。

以下脚本创建产品和日历表:

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);

此查询使用交叉连接子句将产品与月份组合在一起:

SELECT * 
FROM products
CROSS JOIN calendars;

以下是输出:

在本教程中,您学习了各种各样的SQLite联接,它们允许您从多个表中进行查询。