SQLite Group By
我们已经学会了如何查询数据,如何对数据进行排序输出,现在我们想要对数据进行分组统计? SQLite 能否做到呢?
SQLite 提供了 GROUP BY 子句可以对相同的数据进行分组。
GROUP BY 子句通常用在 SELECT 语句中。
GROUP BY 子句在 SELECT 查询中的位置
在 SELECT 语句中, GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 或 HAVING 子句之前。
SELECT FROM WHERE GROUP BY HAVING ORDER BY
GROUP BY 子句的基本语法
SELECT column-list FROM table_name WHERE [ conditions ] GROUP BY column1, column2....columnN ORDER BY column1, column2....columnN
我们可以在 GROUP BY 子句中使用多个列,但要确保使用的分组列在列清单中。
范例
假设 company 表有以下记录:
sqlite> SELECT * FROM company; id name age address salary ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
如果想了解每个客户的工资总额,可以使用 GROUP BY 子句查询
sqlite> SELECT name, SUM(salary) FROM company GROUP BY name; name SUM(salary) ---------- ----------- Allen 15000.0 David 85000.0 James 10000.0 Kim 45000.0 Mark 65000.0 Paul 20000.0 Teddy 20000.0
我们使用下面的 INSERT 语句在 company 表中额外添加三条记录
sqlite> INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00 ); sqlite> INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00 ); sqlite> INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00 );
现在,我们的表就有了重复名称的记录
sqlite> SELECT * FROM company; id name age address salary ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0 8 Paul 24 Houston 20000.0 9 James 44 Norway 5000.0 10 James 45 Texas 5000.0
我们用同样的 GROUP BY 语句来所有记录按 name 列进行分组
sqlite> SELECT name, SUM(salary) FROM company GROUP BY name; name SUM(salary) ---------- ----------- Allen 15000.0 David 85000.0 James 20000.0 Kim 45000.0 Mark 65000.0 Paul 40000.0 Teddy 20000.0
从表中可以看到,James 的薪水是所有 James 的薪水之和
让我们把 ORDER BY 子句与 GROUP BY 子句一起使用,对上面的分组记录按照 name 字段降序排列
sqlite> SELECT name, SUM(salary) FROM company GROUP BY name ORDER BY name; name SUM(salary) ---------- ----------- Allen 15000.0 David 85000.0 James 20000.0 Kim 45000.0 Mark 65000.0 Paul 40000.0 Teddy 20000.0