一天学会一点之sqlite—— 6: 选择, 其中, 限定, 计数, 分组, 联合(3)

B站影视 2024-12-13 19:43 1

摘要:SQLite 排序是通过一个或多个表达式对结果进行排序。要对结果集排序,必须使用 ORDER BY 子句,如下所示:

SQLite 排序

SQLite 排序是通过一个或多个表达式对结果进行排序。要对结果集排序,必须使用 ORDER BY 子句,如下所示:

首先,您必须指定 ORDER BY 子句。ORDER BY 子句必须在查询结束时指定;只有 LIMIT 子句可以在其后指定。指定要对数据排序的表达式,该表达式可以是列名或表达式。在表达式之后,可以指定一个可选的排序方向。DESC(降序排序)或 ASC(升序排序)。如果不指定,数据将以升序排序。您可以使用“, ”来指定更多表达式。

示例

在下面的示例中,我们将选择所有按姓名降序排序的学生,然后按系名升序排序:

SELECT s.StudentName , d.DepartmentNameFROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentIdORDER BY d.DepartmentName ASC , s.StudentName DESC;

这将为您提供

SQLite 将首先按系名升序排列所有学生然后,对于每个系名,该系名下的所有学生将按姓名降序显示

SQLite 限制:

通过使用 LIMIT 子句,可以限制 SQL 查询返回的行数。例如,LIMIT 10 将只返回 10 条记录,而忽略所有其他记录。

在 LIMIT 子句中,可以使用 OFFSET 子句从特定位置开始选择特定数量的记录。例如,“ LIMIT 4 OFFSET 4 ”将忽略前 4 行,并从第 5 行开始返回 4 行,因此将得到第 5、6、7 和 8 行。

请注意,OFFSET 子句是可选的,你可以写成“ LIMIT 4, 4 ”,这样就会得到准确的结果。

示例

在下面的示例中,我们将使用查询语句从学生编号 5 开始只返回 3 名学生:

SELECT * FROM Students LIMIT 4,3;

这样,从第 5 行开始就只有三个学生了。因此,它将给出带有 StudentId 5、6 和 7 的行:

如果 SQL 查询返回重复值,可以使用“ DISTINCT ”关键字删除这些重复值,只返回不同的值。您可以在 DISTINCT 关键字后指定多个列。

**示例

下面的查询将返回重复的 “部门名称值”: 在这里,我们有名称为 IT、物理和艺术的重复值。

SELECT d.DepartmentNameFROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ;

这将为您提供部门名称的重复值:

请注意,部门名称有重复值。现在,我们将在同一查询中使用 DISTINCT 关键字,删除这些重复值,只获取唯一值。就像这样

SELECT DISTINCT d.DepartmentNameFROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ;

这样,部门名称列就只有三个唯一值了:

聚合

SQLite 聚合是 SQLite 中定义的内置函数,可将多行的多个值组合成一个值。

以下是 SQLite 支持的聚合函数:

SQLite AVG

返回所有 x 值的平均值。

示例:

在下面的示例中,我们将获得学生在所有考试中取得的平均分:

SELECT AVG(Mark) FROM Marks;

这将得出数值 “18.375”:

这些结果来自所有标记值的总和除以它们的计数。

COUNT - COUNT(X) 或 COUNT(*)

返回 x 值出现的总次数。下面是一些可以与 COUNT 配合使用的选项:

COUNT(x): 只计算 x 值,其中 x 是列名。它将忽略 NULL 值。COUNT(*): 计算所有列中的所有行。COUNT (DISTINCT x): 您可以在 x 之前指定一个 DISTINCT 关键字,这样就可以得到 x 的不同值的计数。

示例

在下面的示例中,我们将使用 COUNT( DepartmentId )、COUNT(*) 和 COUNT(DISTINCT DepartmentId ) 获得各部门的总计数以及它们的不同之处:

SELECT COUNT( DepartmentId ), COUNT(DISTINCT DepartmentId ), COUNT(*) FROM Students;

这将为您提供

如下所示:

COUNT( DepartmentId ) 将给出所有部门 ID 的计数,并忽略空值。COUNT(DISTINCT DepartmentId ) 给出部门 ID 的不同值,只有 3 个。请注意,学生姓名中有 8 个系名的值。但只有三个不同的值,分别是数学、信息技术和物理。COUNT(*) 计算学生表中的行数,10 个学生有 10 行。

GROUP_CONCAT - GROUP_CONCAT(X) 或 GROUP_CONCAT(X,Y)

GROUP_CONCAT 聚合函数用逗号将多个值连接成一个值。它有以下选项:

group_concat(x): 将 x 的所有值连接成一个字符串,值与值之间用逗号“, ”分隔。空值将被忽略。group_concat(x,y): 将 x 的值连接成一个字符串,每个值之间的分隔符是 y,而不是默认的分隔符“,”。NULL 值也将被忽略。group_concat(distinct x): 将 x 的所有不同值连接成一个字符串,在各值之间使用逗号“, ”作为分隔符。空值将被忽略。

GROUP_CONCAT(DepartmentName) 示例

下面的查询将把学生表和院系表中的所有院系名称值连接成一个以逗号分隔的字符串。这样就不会返回一个值列表,而是每行一个值。它将只返回一行中的一个值,所有值用逗号分隔:

SELECT GROUP_CONCAT( d.DepartmentName )FROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ;

这将为您提供

这样就可以将 8 个部门的名称值连接成一个字符串,用逗号分隔。

GROUP_CONCAT(DISTINCTDepartmentName) 示例

下面的查询将把学生和院系表中不同的院系名称值连接成一个以逗号分隔的字符串:

SELECT GROUP_CONCAT(DISTINCT d.DepartmentName )FROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ;

这将为您提供

请注意结果与前一个结果的不同之处:只返回三个值,即不同的部门名称,重复值已被删除。

GROUP_CONCAT(DepartmentName,'&') 示例

下面的查询将把学生和院系表中院系名称列的所有值连接成一个字符串,但用字符“&”代替逗号作为分隔符:

SELECT GROUP_CONCAT( d.DepartmentName , '&')FROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ;

这将为您提供

请注意如何使用字符“&”而不是默认字符“, ”来分隔数值。

SQLite MAX & MIN

MAX(X) 返回 X 值中的最高值。如果 x 的所有值都为空,MAX 将返回一个 NULL 值。而 MIN(X) 将返回 X 值中最小的值。如果 X 的所有值都为空,MIN 将返回一个 NULL 值。

示例

在下面的查询中,我们将使用 MIN 和 MAX 函数从 “分数”表中获取最高分和最低分:

SELECT MAX(Mark), MIN(Mark) FROM Marks;

这将为您提供

SQLite SUM(x)、Total(x)

它们都会返回所有 x 值的总和。但它们在以下方面有所不同:

如果所有值都为空,SUM 将返回空值,但 Total 将返回 0。TOTAL 总是返回浮点数。如果所有 x 值都是整数,SUM 返回整数值。但是,如果数值不是整数,它将返回浮点数。

示例

在下面的查询中,我们将使用 SUM 和 total 获得 “分数”表中所有分数的总和:

SELECT SUM(Mark), TOTAL(Mark) FROM Marks;

这将为您提供

可以看出,TOTAL 返回的总是浮点数。但 SUM 返回的是整数值,因为 “Mark ”列中的值可能是整数。

SUM 和 TOTAL 的区别示例:

在下面的查询中,我们将展示 SUM 和 TOTAL 在获取 NULL 值的 SUM 时的区别:

SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;

这将为您提供

请注意,TestId = 4 没有标记,因此该测试的值为空。SUM 返回空值,而 TOTAL 返回 0。

GROUP BY

GROUP BY 子句用于指定用于将记录分组的一列或多列。具有相同值的记录将被集中(排列)到一组中。

对于未包含在 GROUP BY 列中的其他列,可以使用聚合函数。

示例

通过下面的查询,可以得到每个系的学生总人数。

SELECT d.DepartmentName , COUNT( s.StudentId ) AS StudentsCountFROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentIdGROUP BY d. DepartmentName ;

这将为您提供

GROUPBY DepartmentName 子句将把所有学生分组,每个系为一组。对于每个 “系 ”分组,它将计算其中的学生人数。

HAVING 子句

如果要过滤 GROUP BY 子句返回的分组,可以在 GROUP BY 后指定一个带表达式的 “HAVING ”子句。表达式将用于过滤这些组。

示例

在下面的查询中,我们将选择那些只有两名学生的系:

SELECT d.DepartmentName , COUNT( s.StudentId ) AS StudentsCountFROM Students AS sINNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentIdGROUP BY d. DepartmentNameHAVING COUNT( s.StudentId ) = 2;

这将为您提供

子句 HAVING COUNT( S.StudentId ) = 2 将对返回的组进行过滤,只返回其中包含两名学生的组。在我们的例子中,艺术系有 2 名学生,因此在输出中显示出来。

来源:天哥教育

相关推荐