MYSQL-分组查询

370 阅读2分钟
  • 分组查询
GROUP BY { <列名> | <表达式> | <位置> } [ASC | DESC]

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

根据dept_id对tb_students_info表中的数据进行分组统计,输入的SQL语句和执行结果如下所示。

SELECT dept_id, COUNT(*) AS total FROM tb_students_info GROUP BY dept_id;

根据dept_id对tb_students_info表中的数据进行分组,将每个学院的学生姓名显示出来,输入的SQL语句和执行结果如下所示。

SELECT dept_id, GROUP_CONCAT(name) AS names FROM tb_students_info GROUP BY dept_id;

  • 使用HAVING关键字设置条件

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

    • WHERE子句主要用于过滤数据行,而HAVING子句主要用于过滤分组,即HAVING子句基于分组的聚合值而不是特定行的值来过滤数据,主要用来过滤分组。

    • WHERE子句不可以包含聚合函数,HAVING子句中的条件可以包含聚合函数。

    • HAVING子句是在数据分组后进行过滤,WHERE子句会在数据分组前进行过滤。WHERE子句排除的行不包含在分组中,可能会影响HAVING子句基于这些值过滤掉的分组。

  • 根据dept_id对tb_students_info表中的数据进行分组,并显示学生人数大于1的分组信息,输入的SQL语句和执行结果如下所示。

SELECT dept_id, GROUP_CONCAT(name) AS names FROM tb_students_info GROUP BY dept_id HAVING COUNT(name)>1;

  • 案例

CREATE TABLE class ( id INT(11) PRIMARY KEY, name VARCHAR(25), grade VARCHAR(10), t_name VARCHAR(10) );

CREATE TABLE stu (id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL, sex VARCHAR(2) NOT NULL, class_id INT, age INT, login_date DATE, CONSTRAINT fk_class_student FOREIGN KEY(class_id) REFERENCES class(id));

INSERT INTO class VALUES (01,'MATH','One','JONH'), (02,'HISTORY','Two','SIMON'), (03,'PHYSICS','Three','JACKSON');

INSERT INTO stu VALUES (101,'JAMES','M',01,20,'2014-07-31'), (102,'HOWARD','M',01,24,'2015-07-31'), (103,'SMITH','M',01,22,'2013-03-15'), (201,'ALLEN','F',02,21,'2017-05-01'), (202,'JONES','F',02,23,'2015-07-31'), (301,'KING','F',03,22,'2013-01-01'), (302,'ADAMS','M',03,20,'2014-06-01');
  • 在表stu中,查询每个班级年龄最大的学生的信息。
SELECT a.class_id, b.name, MAX(a.age) FROM stu a, class b WHERE a.class_id=b.id;

  • 查询学生JAMES所在班级的名称和班主任姓名。
SELECT a.name, b.name, b.t_name FROM stu a, class b WHERE a.class_id=b.id AND a.name='James';

  • 使用连接查询,查询所有学生的班级信息。
SELECT a.id, a.name, b.name FROM stu a, class b WHERE a.class_id=b.id;

  • 在stu表中,计算每个班级各有多少名学生。
SELECT b.name, COUNT(*) FROM stu a, class b WHERE a.class_id=b.id GROUP BY b.name;

  • 在stu表中,计算不同班级学生的平均年龄。
SELECT b.name, AVG(age) FROM stu a, class b WHERE a.class_id=b.id GROUP BY b.name;