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'
);
子查询返回标题为“Let There Rock”的专辑id。查询使用相等运算符(=)将子查询返回的albumid与tracks表中的albumid进行比较。
如果子查询返回多个值,则可以使用IN运算符对照一组值检查单个值是否存在。
请参见示例数据库中的以下员工和客户表:
例如,以下查询返回其销售代表在加拿大的客户。
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
子查询返回位于加拿大的员工的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;
查询是如何工作的。
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;
在本教程中,我们向您介绍了子查询,并展示了在查询中使用子查询从表中选择数据的各种方法。