Skip to main content

SQLite子查询:SQLite新手的终极指南

SQLite子查询简介

子查询是嵌套在另一条语句中的SELECT语句。见以下陈述。

SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);

以下查询是外部查询:

SELECT column_1
FROM table_1
WHERE colum_1 =

下面的查询是子查询。

(SELECT column_1
FROM table_2)

必须用一对括号括起子查询。请注意,可以将一个子查询嵌套在另一个子查询中,并具有一定的深度。

通常,子查询会返回一行作为原子值,尽管它可能会返回多行以与IN运算符进行比较。

可以在SELECT、FROM、WHERE和JOIN子句中使用子查询。

SQLite子查询示例

我们将使用示例数据库中的曲目和唱片表进行演示。

1) WHERE子句示例中的SQLite子查询

可以使用简单的子查询作为搜索条件。例如,下面的语句返回专辑中标题为Let There Rock的所有曲目

SELECT trackid,
name,
albumid
FROM tracks
WHERE albumid = (
SELECT albumid
FROM albums
WHERE title = 'Let There Be Rock'
);

SQLite Subquery example

子查询返回标题为“Let There Rock”的专辑id。查询使用相等运算符(=)将子查询返回的albumid与tracks表中的albumid进行比较。

如果子查询返回多个值,则可以使用IN运算符对照一组值检查单个值是否存在。

请参见示例数据库中的以下员工和客户表:

例如,以下查询返回其销售代表在加拿大的客户。

SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);

SQLite Subquery with IN operator example

子查询返回位于加拿大的员工的ID列表。外部查询使用IN运算符查找列表中具有销售代表id的客户。

2) FROM子句示例中的SQLite子查询

有时,您希望对一列多次应用聚合函数。例如,首先,要计算相册大小的总和,然后计算所有相册的平均大小。您可能会提出以下问题。

SELECT AVG(SUM(bytes) 
FROM tracks
GROUP BY albumid;

此查询无效。

要修复它,可以在FROM子句中使用子查询,如下所示:

SELECT
AVG(album.size)
FROM
(
SELECT
SUM(bytes) SIZE
FROM
tracks
GROUP BY
albumid
) AS album;

在本例中,SQLite首先执行FROM子句中的子查询,并返回一个结果集。然后,SQLite将此结果集用作外部查询中的派生表。

SQLite相关子查询

到目前为止,您看到的所有子查询都可以独立执行。换句话说,它不依赖于外部查询。

相关子查询是使用外部查询中的值的子查询。与顺序子查询不同,相关子查询不能独立执行。

相关子查询效率不高,因为它针对外部查询处理的每一行进行计算。

下面的查询使用相关子查询返回大小小于10MB的相册。

SELECT albumid,
title
FROM albums
WHERE 10000000 > (
SELECT sum(bytes)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
ORDER BY title;

SQLite Correlated Subquery Example

查询是如何工作的。

SELECT子句示例中的SQLite相关子查询

下面的查询使用SELECT子句中的相关子查询返回相册中的曲目数。

SELECT albumid,
title,
(
SELECT count(trackid)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
tracks_count
FROM albums
ORDER BY tracks_count DESC;

SQLite Subquery in SELECT clause example

在本教程中,我们向您介绍了子查询,并展示了在查询中使用子查询从表中选择数据的各种方法。