`

mysql group by where having 用法详情(转)

 
阅读更多

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

 

来源:http://www.5iphp.com/node/62

分享到:
评论

相关推荐

    mysql group by having 实例代码

    在MySQL数据库中,`GROUP BY` 和 `HAVING` 是两个非常重要的SQL子句,它们在数据分析和报表生成中扮演着关键角色。`GROUP BY` 用于将数据按照指定的一个或多个列进行分组,而 `HAVING` 则用于在分组后对这些分组进行...

    mysql group by用法

    **注意:**`WHERE`子句通常用于筛选分组前的数据,而`GROUP BY`后的筛选应使用`HAVING`子句。 **示例 3:**与`HAVING`子句连用 ```sql select course, max(score) from t_student group by course having max...

    MySQL中无GROUP BY情况下直接使用HAVING语句的问题探究

    总结来说,尽管在没有 `GROUP BY` 的情况下使用 `HAVING` 是不标准的,但MySQL允许这种用法并将其解释为 `GROUP BY NULL`。这就意味着 `HAVING` 后面跟着的聚合函数(如 `MIN` 或 `MAX`)会在整个数据集上运算,而...

    Mysql中order by、group by、having的区别深入分析

    在MySQL数据库中,ORDER BY、GROUP BY 和 HAVING 子句是SQL查询中用于数据处理的关键组成部分,它们各自承担不同的任务,以帮助我们从数据库中提取有用的信息。 ORDER BY 子句主要用于对查询结果集进行排序。当你...

    深度分析mysql GROUP BY 与 ORDER BY

    本文就和大家一起深入研究下mysql中group by与order by.下面是我模拟我的内容表   我现在需要取出每个分类中最新的内容 select * from test group by category_id order by `date` 结果如下   明显。这不是我想...

    MySQL无GROUP BY直接HAVING返回空的问题分析

    MySQL在使用HAVING子句时规定,HAVING必须配合GROUP BY子句使用,因此在没有GROUP BY子句的情况下使用HAVING子句是不符合SQL标准的。但MySQL为了灵活处理某些特殊场景,会自动将没有GROUP BY子句的SQL语句重写,增加...

    mysql中group by与having合用注意事项分享

    而 `HAVING` 语句则是在 `GROUP BY` 后面添加的,用于对分组后的数据进行过滤,它相当于 `WHERE` 语句针对聚合后的结果。 首先,让我们来看看 `GROUP BY` 的基本使用规则。当我们在 `SELECT` 语句中使用了非聚合列...

    简单讲解sql语句中的group by的使用方法

    下面我们将详细讨论`GROUP BY`的使用方法及其相关知识点。 1. **`GROUP BY`的基本概念** `GROUP BY`关键字用于将数据表中的数据根据一个或多个列的值进行分组。通过分组,你可以对每个组应用聚合函数,这有助于...

    mysqlhaving用法共2页.pdf.zip

    - `HAVING`子句紧跟在`SELECT`和`GROUP BY`之后,用法类似`WHERE`,但不支持非聚合列。 - 示例:找出销售额超过平均销售额的部门。 ```sql SELECT department, AVG(sales) as avg_sales FROM sales_table ...

    having-mysql

    为了更好地理解`GROUP BY`和`HAVING`子句的用法,我们可以通过一个具体的例子来进行分析: 假设我们有一个名为`bbc`的表,其中包含了不同国家的信息,包括国家名称(`name`)、地区(`region`)、人口数量(`population`...

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

    在MySQL数据库中,当执行`GROUP BY`语句时,通常是为了对数据进行分组并进行聚合计算,如计算每个组的总数、平均值等。然而,标准的`GROUP BY`查询并不直接提供每个组的行数,而是返回每个组的一行数据。如果需要...

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

    以下将详细讨论三种在MySQL中使用GROUP BY分组获取前N条记录的方法。 ### 方法一:LEFT JOIN + HAVING子句 这种方法利用LEFT JOIN和HAVING子句来找出每个分组内的前两名学生。首先,将原始表与自身进行LEFT JOIN,...

    mysql having用法解析

    having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。 SQL实例: 一、显示每个地区的总人口数和总面积. ...

    MySQL中USING 和 HAVING 用法实例简析

    在这个查询中,WHERE子句首先筛选出指定的客户,然后GROUP BY将这些客户的订单进行分组,最后HAVING筛选出每个客户订单总额大于1500的记录。 总结一下,USING和HAVING是MySQL查询中的两个重要工具。USING简化了JOIN...

    group by,having,order by的用法详解

    值得注意的是,`GROUP BY` 后的列可以使用 `HAVING` 进行条件判断,但不能使用 `WHERE`;相反,`WHERE` 可以操作 `GROUP BY` 前的所有列,但不能操作聚合函数。在嵌套使用分组函数时,通常先执行 `WHERE` 过滤数据,...

    关于mysql数据查询中 count()等聚集函数,关键字limit,group by,having的一些用法

    对于初学者来说,一般用学生及其选课等信息这些基本的操作入手。...group by 表示 以······分组, 查询表中被选人数少于3的课程及人数: having 后跟附加条件, 4、其他聚集函数的应用: 最大值max()、最

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    在一个SQL查询中,执行顺序通常是这样的:`FROM` - `WHERE` - `GROUP BY` - `HAVING` - `SELECT` - `ORDER BY`。当`ORDER BY`和`GROUP BY`同时存在时,`GROUP BY`先于`ORDER BY`执行,这意味着数据首先按`GROUP BY`...

Global site tag (gtag.js) - Google Analytics