本文讨论SQLite3数据库中的分组查询、使用聚合函数计算列数据、计算行数据,以及case表达式的应用。
首先介绍SQLite3数据库中的聚合函数,这些函数可以对字段数据进行统计。示例中还会使用前一篇文章中创建的t3表和数据。
count()函数的功能为计数,可以统计全部或指定条件的记录有多少,如下面的代码会统计t3表中f2字大于等于80的记录数量。
select count(*) as f2_count from t3 where f2>=80;
代码中,使用count(*)统计记录行数,并使用as关键指定统计字段名为f2_count,查询条件指定f2指定大于等于80,查询结果如下图所示。
本例,count()函数中也可以直接使用字段名,如count(f2)。
sum()和total()函数都可以计算数据的合计,并忽略null值,两个函数的区别在于,如果数据都是null值,sum()函数返回null,而total()函数会返回0.0。下面的代码演示了这两个函数的应用。
select sum(f2) as f2_sum, sum(f3) as f3_total from t3;
代码会计算f2和f3字段所有记录的合计,执行结果如下图所示。
min()和max()函数分别计算数据的最小值和最大值,如下面的代码可以计算t3表中f2字段中的最小值和最大值。
select min(f2) as f2_min, max(f2) as f2_max from t3;
查询结果如下图所示。
min()和max()函数除了作为聚合函数计算列数据,还可以获取两个或多个参数中的最小值和最大值,如下面的代码。
select min(1,2,3),max(1,2,3);
avg()函数可以计算数据的平均数,如果数据都为null则返回null值。如下面的代码会计算t3表中f2字段数据的平均数。
select avg(f2) as f2_avg from t3;
计算结果如下图所示。
group_concat()函数可以将一列数据连接为文本,其中,参数一指定字段名,参数二指定分隔符,如果不指定分隔符,默认使用英文逗号(,)分隔,如下面的代码可以将t3表中f2字段的数据连接为以逗号分隔的文本。
select group_concat(f2) as f2_values from t3;
聚合函数用于计算列数据,如果需要计算每一行的数据,则需要使用运算符书写运算表达式,并可以使用as关键字指定计算列的名称,如下面的代码会计算t3表每条记录中f2、f3、f4字段的合计数和平均数。
select f1,f2,f3,f4, (f2+f3+f4) as row_sum, round((f2+f3+f4)/3.0,1) as row_avg from t3;
本例,在row_avg计算列中还使用了round()函数格式化浮点数,通过第二个参数指定显示1位小数。
case表达式有两种语法,第一种是在case关键字后指定表达式,每一个when...then处理一个值和对应的返回结果,如果没有匹配的值,可以使用else关键字指定默认的返回值,如下面的代码。
select case 1 when 1 then '一季度' when 2 then '二季度' when 3 then '三季度' when 4 then '四季度' else null end as quarter_name;
代码中,从case到end关键字是case表达式部分,其中,在case关键字后指定了需要判断的值,然后,在when部分会根据数据返回季度名称,如果数值不是1到4则返回null值。最后会将查询结果的列名定义为quarter_name,查询结果如下图所示。
case表达式的另一种应用格式是不指定case关键字后的表达式,而是在when关键字后指条件,并按条件返回对应的值。如下面的代码,会根据f2字段的数据显示等级。
select f1,f2, case when f2>=80 then 'A' when f2>=70 and f2<80 then 'B' when f2>=60 and f2<70 then 'C' when f2<60 then 'D' else null end as f2_level from t3;
代码的功能是根据t3表中f2字段数据确定其等级(f2_level),其中,大于等于80为'A'级,小于80且大于等于70为'B'级,小于70且大于等于60为'C'级,小于60为'D'级。查询结果如下图所示。
接下来,在演示分组与计算时使用如下代码创建的t4表和数据。
create table t4(f1 integer,f2 text,f3 integer); insert into t4(f1,f2,f3) values(1,'C',60), (2,'B',70), (1,'D',50), (2,'A',80), (2,'A',90), (1,'A',80), (1,'A',90), (2,'C',60), (1,'B',70), (1,'A',90);
对数据进行分组查询时需要在select语句中使用group by子句,如下面的代码可以统计t4表中f1字段等于1或2的记录分别有多少。
select f1,count(f1) as f1_count from t4 group by f1;
再来看一个示例,如下面的代码可以计算f1为1或2的记录数量和对应的f3字段的平均数。
select f1,count(f1) as f1_count, avg(f3) as f3_avg from t4 group by f1;
工作中,还可以进行多级分组,如下面的代码会统计f1字段为1或2时,f2字段各种数值的记录分别有多少。
select f1,f2,count(*) as row_count from t4 group by f1,f2;
指定分组查询返回结果的条件时需要使用having关键字,如下面的代码可以只返回row_count大于等于2的记录。
select f1,f2,count(*) as row_count from t4 group by f1,f2 having row_count>=2;
对于查询和汇总计算的结果,可以全选并复制,然后粘贴到Excel或WPS表格等电子表格软件中进一步处理。