Mysql之group by 用法

group by 用法解析

group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。

SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。

某个员工信息表结构和数据如下:

id  name  dept  salary  edlevel  hiredate

1 张三 开发部 2000 3 2009-10-11

2 李四 开发部 2500 3 2009-10-01

3 王五 设计部 2600 5 2010-10-02

4 王六 设计部 2300 4 2010-10-03

5 马七 设计部 2100 4 2010-10-06

6 赵八 销售部 3000 5 2010-10-05

7 钱九 销售部 3100 7 2010-10-07

8 孙十 销售部 3500 7 2010-10-06

例如,要想列出每个部门最高薪水的结果,sql语句如下:

SELECT DEPT, MAX(SALARY) AS MAXIMUM

FROM STAFF

GROUP BY DEPT

查询结果如下:

DEPT  MAXIMUM

开发部 2500

设计部 2600

销售部 3500

解释一下这个结果:

1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY DEPT中包含的列DEPT。

2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”,根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。

注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。

例如,查询每个部门的总的薪水数

SELECT DEPT, sum( SALARY ) AS total

FROM STAFF

GROUP BY DEPT

查询结果如下:

DEPT  total

开发部 4500

设计部 7000

销售部 9600

将 WHERE 子句与 GROUP BY 子句一起使用

分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。

例如,查询公司2010年入职的各个部门每个级别里的最高薪水

SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM

FROM staff

WHERE HIREDATE > ‘2010-01-01‘

GROUP BY DEPT, EDLEVEL

ORDER BY DEPT, EDLEVEL

查询结果如下:

DEPT  EDLEVEL  MAXIMUM

设计部 4 2300

设计部 5 2600

销售部 5 3000

销售部 7 3500

注意:在SELECT语句中指定的每个列名也在GROUP BY子句中提到。未在这两个地方提到的列名将产生错误。

GROUP BY子句对DEPT和EDLEVEL的每个唯一组合各返回一行。

在GROUP BY子句之后使用HAVING子句

可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY子句后面包含一个HAVING子句。HAVING子句可包含一个或多个用AND和OR连接的谓词。每个谓词将组特性(如AVG(SALARY))与下列之一进行比较:

例如:寻找雇员数超过2个的部门的最高和最低薪水:

SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM

FROM staff

GROUP BY DEPT

HAVING COUNT( * ) >2

ORDER BY DEPT

查询结果如下:

DEPT  MAXIMUM  MINIMUM

设计部 2600 2100

销售部 3500 3000

例如:寻找雇员平均工资大于3000的部门的最高和最低薪水:

SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM

FROM staff

GROUP BY DEPT

HAVING AVG( SALARY ) >3000

ORDER BY DEPT

查询结果如下:

DEPT  MAXIMUM  MINIMUM

销售部 3500 3000

例子2:统计baobao_num_id 中有重复的记录有多少条?

1.首先根据group by baobao_num_id 将数据表分组汇总好,然后根据having by 条件筛选,得到满足要求的。

2。为了统计有多少条记录,需要将分类出来的baobao_num_id作为一个临时表as b,进行最后的统计!

<span style="font-size:18px;">select count(*) from (select baobao_num_id from members_user where 1=1 group by baobao_num_id having count(baobao_num_id) > 1) as b;</span>
时间: 2024-08-25 13:48:36

Mysql之group by 用法的相关文章

MySQL之GROUP BY用法误解

1.说明  “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理.(只是简单说明这个语句的作用,不是这篇文章的重点) 2.使用举例: 2.1表结构类型 mysql> desc actor; +-------------+----------------------+------+-----+-------------------+--------------------------

mysql group by 用法解析(详细)

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案 下面先来看看例子:

mysql distinct&amp;group by 应用

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案 下面先来看看例子:

MySQL优化GROUP BY-松散索引扫描与紧凑索引扫描

满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有).在某些情况中,MySQL能够做得更好,即通过索引访问而不用创建临时表. 为GROUP BY使用索引的最重要的前提条件是所有GROUP BY列引用同一索引的属性,并且索引按顺序保存其关键字.是否用索引访问来代替临时表的使用还取决于在查询中使用了哪部分索引.为该部分指定的条件,以及选择的累积函数. 由于GROUP BY 实际上也同样会进行排序操作,而

mysql中group by和order by混用 结果不是理想结果

在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是理想中的结果,那么怎么才能使用group by 和order by得到理想中的数据结果呢? 例如 有一个 帖子的回复表,posts( id , tid , subject , message ,  dateline ) , id为 自动增长字段, tid为该回复的主题帖子的id(外键关联),  subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳

mysql获取group by的总记录行数方法

mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数. mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: 代码如下 复制代码 SELECT COUNT(*) from `table` WHERE ......; 查出符合条件的记录总数 代码如下 复制代码 SELECT * FROM `table` WHERE ...... limit M,N; 查询当页要显示的数据 这样的语句可以改成: 代码如下 复

MySQL触发器的正确用法

一.创建触发器的基本语法: CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 触发器语句 触发事件包括:INSERT.UPDATE.DELETE 二.正确案例演示 如果想在sql文件中直接创建触发器,下面为一个完整的sql文件创建(含触发器的创建)示例: use mysql drop database if exists myTest; create database myTest default charset=gb2312; u

mysql中UNION ALL用法

MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 union select * from table2 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序. MySQL中的UNION ALL UNION ALL只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集

mysql使用GROUP BY分组实现取前N条记录的方法

MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT JOIN aa b ON a.ClsNo=b.ClsNo AND a.Score<b.Score group by a.id,a.