Aggregation
我们也可以使用相同的
SELECT
语句对多条记录进行聚合操作对 a group of rows 进行计算
我们可以使用
MAX、MIN、COUNT和SUM
函数从我们的初始表中获取更多的信息。COUNT
计算row
的个数count(distinct name)
-> 计算name
的种类
聚合函数也会取
table
中的某一个row
但结果有多个
row
对应,则会取其中任意一行avg
函数有可能取不出row
sqlite> SELECT name, MAX(salary) FROM records; Oliver Warbucks|150000
使用特殊
COUNT(*)
语法,我们可以统计表中的行数,以查看该公司的员工人数。sqlite> SELECT COUNT(*) from RECORDS; 9
Group
到目前位置的所有 select
都只有一个 group
,the only one final group
table
中的 rows
可以被 grouped
, aggregation
在各个组起作用
select [columns] from [table] group by [expression] having [expression];
group by [expression]
group
的数量是group
的[expression]
中独特值的个数(数的种类)
可以通过
HAVING
子句过滤被聚合的组的集合与
WHERE
子句不同的是,WHERE
子句过滤掉的是行,HAVING
子句过滤掉的是整个组。sqlite> SELECT title FROM records GROUP BY title HAVING count(*) > 1; -- 过滤组数少于 1 的组 Programmer
用 Python 描述 SQL Aggregation
我们可以使用GROUP BY和HAVING 将行划分为组,并仅选择组的子集。
output_table = [] # 输出多个 table
for input_group in GROUP_BY(FROM(*input_tables)): # GROUP_BY 划分了子集
output_group = []
for row in input_group:
if WHERE(row):
output_group += [row] # 每个子集内部的 row 用 WHERE 筛选
if HAVING(output_group): # group 本身用 HAVING 筛选
output_table += [SELECT(output_group)]
if ORDER_BY:
output_table = ORDER_BY(output_table)
if LIMIT:
output_table = output_table[:LIMIT]
Last updated
Was this helpful?