Skip to main content

SQLite HAVING子句及实例

SQLite HAVING子句简介

SQLite HAVING子句是SELECT语句的可选子句。HAVING子句指定组的搜索条件。

你经常在GROUP BY子句中使用HAVING子句。GROUP BY子句将一组行分组为一组摘要行或组。然后HAVING子句根据指定的条件过滤组。

如果使用HAVING子句,则必须包含groupby子句;否则,将出现以下错误:

Error: a GROUP BY clause is required before HAVING

注意HAVING子句在groupby子句之后应用,而WHERE子句在groupby子句之前应用。

下面说明HAVING子句的语法:

SELECT
column_1,
column_2,
aggregate_function (column_3)
FROM
table
GROUP BY
column_1,
column_2
HAVING
search_condition;

在这种语法中,HAVING子句将每个组的搜索条件作为布尔表达式进行计算。如果评估结果为真,它只在最终结果集中包含一个组。

SQLite有子句示例

我们将使用示例数据库中的tracks表进行演示。

要查找每个专辑的曲目数,请使用GROUP BY子句,如下所示:

SELECT
albumid,
COUNT(trackid)
FROM
tracks
GROUP BY
albumid;

试试看

SQLite HAVING clause with COUNT function

要查找id为1的专辑的曲目数,我们在以下语句中添加HAVING子句:

SELECT
albumid,
COUNT(trackid)
FROM
tracks
GROUP BY
albumid
HAVING albumid = 1;

试试看

SQLite HAVING with WHERE clause

我们在HAVING子句中提到了AlbumId列。

要查找曲目数在18到20之间的相册,请使用HAVING子句中的聚合函数,如下所示:

SELECT
albumid,
COUNT(trackid)
FROM
tracks
GROUP BY
albumid
HAVING
COUNT(albumid) BETWEEN 18 AND 20
ORDER BY albumid;

试试看

SQLite HAVING COUNT example

SQLite HAVING子句与内部连接示例

下面的语句使用内部联接查询曲目和相册表中的数据,以查找总长度大于60000000毫秒的相册。

SELECT
tracks.AlbumId,
title,
SUM(Milliseconds) AS length
FROM
tracks
INNER JOIN albums ON albums.AlbumId = tracks.AlbumId
GROUP BY
tracks.AlbumId
HAVING
length > 60000000;

试试看

SQLite HAVING with greater than operator example

在本教程中,您学习了如何使用SQLite HAVING子句来指定组的搜索条件。