分组查询 GROUP BY

  1. GROUP BY{列名|表达式|position}[ASC|DESC],...[WITH ROLLUP]
  1. select 专业名,count(*) as '学生数'
  2. from xs
  3. group by 专业名;
  4. +----------+--------+
  5. | 专业名 | 学生数 |
  6. +----------+--------+
  7. | 电子商务 | 3 |
  8. | 通信工程 | 2 |
  9. +----------+--------+

ROLLUP方法

末尾添加 with rollup;可以在表格最下端添加汇总

  1. -> select 专业名,count(*) as '学生数'
  2. -> from xs
  3. -> group by 专业名
  4. -> with rollup;
  5. +----------+--------+
  6. | 专业名 | 学生数 |
  7. +----------+--------+
  8. | 电子商务 | 3 |
  9. | 通信工程 | 2 |
  10. | NULL | 5 | #汇总
  11. +----------+--------+
  12. 3 rows in set (0.35 sec)

HAVING方法

HAVING 子句和 WHERE 子句非常相似,HAVING 子句支持 WHERE 子句中所有的操作符和语法,但是两者存在几点差异:

  • WHERE 子句主要用于过滤数据行,而 HAVING 子句主要用于过滤分组,即 HAVING 子句基于分组的聚合值而不是特定行的值来过滤数据,主要用来过滤分组。
  • WHERE 子句不可以包含聚合函数,HAVING 子句中的条件可以包含聚合函数。
  • HAVING 子句是在数据分组后进行过滤,WHERE 子句会在数据分组前进行过滤。WHERE 子句排除的行不包含在分组中,可能会影响 HAVING 子句基于这些值过滤掉的分组。
  1. mysql> SELECT dept_id,GROUP_CONCAT(name) AS names
  2. -> FROM tb_students_info
  3. -> GROUP BY dept_id
  4. -> HAVING COUNT(name)>1; #仅显示人数大于一的分组信息
  5. +---------+---------------+
  6. | dept_id | names |
  7. +---------+---------------+
  8. | 1 | Dany,Jane,Jim |
  9. | 2 | Henry,John |
  10. | 3 | Green,Thomas |
  11. | 4 | Susan,Tom |
  12. +---------+---------------+
  13. 4 rows in set (0.07 sec)