`
cqupt_zlf
  • 浏览: 5894 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多

Group by与having理解

 

注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里。

1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)

 

例如,有如下数据库表:

 

A    B 

1    abc 

1    bcd 

 

1    asdfg

 

 如果有如下查询语句(该语句是错误的,原因见前面的原则)

 

select A,B from table group by A  

 

该查询语句的意图是想得到如下结果(当然只是一相情愿) 

 

A     B 

       abc 

1     bcd 

 

       asdfg 

 

右边3条如何变成一条,所以需要用到聚合函数,如下(下面是正确的写法):

 

select A,count(B) as 数量 from table group by A 

这样的结果就是 

A    数量 

1    3  

 

 

 

2. Having

 

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

 

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

 

having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。例如:

 

SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

 

 

 

3.使用compute和compute by

  使用compute子句允许同时观察查询所得到各列的数据的细节以及统计各列数据所产生的汇总列

      select * from work [查询所得到的各列的数据的细节]

      compute max(基本工资),min(基本工资) [统计之后的结果]

  这个例子中没有使用by关键字,返回的结果是最后添加了一行基本工资的最大值和最小值,也可增加by关键字.

        例:select * from work order by 学历

           compute max(基本工资),min(基本工资) by 学历

        比较:select 学历,max(基本工资),min(基本工资) from work group by 学历

        说明:1:compute子句必须与order by子句用在一起

             2:compute子句可以返回多种结果集.一种是体现数据细节的数据集,可以按分类要求进行正确的分类;另一种在分类的基础上进行汇总产生结果.

             3:而group by子句对每一类数据分类之后只能产生一个结果,不能知道细节

 

 

示例学习Northwind数据库:

 

非相关查询:

 

1:返回每个美国员工都为其处理过订单的所有客户

 

--思路:1:Employees表中获取美国员工总数2:Orders表中查询美国员工处理的Order,对CustomerID分组后,统计其不同的EmployeeID正好等于美国员工总数

 

Select CustomerID From Orders Where EmployeeID In         --得到美国员工服务 的客户

 

(Select EmployeeID From Employees Where Country=N'USA') -- 得到全部美国员工id

 

group by CustomerID                                         --按客户分组

 

Having Count(Distinct EmployeeID)=                    --为其处理订单的distinct 员工数等于美国总员工数

 

(Select Count(*) From Employees Where Country=N'USA')--美国员工总数

 

2:

 

返回在每月最后实际订单日期发生的订单(每月最后订单日期可能不是每月最后一天)

 

--思路:子查询按月分组得到每月最近订单日期

 

Select OrderID,CustomerID,EmployeeID,OrderDate

 

From Orders

 

Where OrderDate In

 

(Select Max(OrderDate) From Orders Group by Convert(char(6),OrderDate,112))--112表示YYYYMMDD char(6)提取YYYYMM

 

 

 

 3.

 

Select字句在逻辑上是SQL语句最后进行处理的最后一步,所以,以下查询会发生错误:

 

SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts

FROM (SELECT YEAR(OrderDate) AS OrderYear, CustomerID

   FROM dbo.Orders) AS D

GROUP BY OrderYear 

;因为group by是在Select之前进行的,那个时候orderYear这个列并没有形成。

 

 

如果要查询成功,可以像下面进行修改:

 

SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts

FROM (SELECT YEAR(OrderDate) AS OrderYear, CustomerID

   FROM dbo.Orders) AS D

GROUP BY OrderYear;还有一种很特殊的写法:

 

SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts

FROM (SELECT YEAR(OrderDate), CustomerID

   FROM dbo.Orders) AS D(OrderYear, CustomerID)

GROUP BY OrderYear;在作者眼里,他是非常喜欢这种写法的,因为更清晰,更明确,更便于维护。

 

 

在查询中使用参数定向产生一批结果,这个技巧没有什么好说的。

 

 

嵌套查询,在处理逻辑上是从里向外进行执行的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    order_by_、group_by_、having的用法

    在SQL查询中,`order_by_`、`group_by_`和`having`是三个非常重要的关键字,它们分别用于不同的数据处理操作。 1. `ORDER BY`:此关键字用于对查询结果进行排序,默认是升序(ASC),也可以指定降序(DESC)。在`...

    mysql group by having 实例代码

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

    order by 、group by 、having的用法

    在SQL查询中,`ORDER BY`、`GROUP BY` 和 `HAVING` 是三个非常重要的子句,它们分别用于不同的数据处理操作。 1. **ORDER BY** 子句: - `ORDER BY` 用于对查询结果进行排序,按照指定的字段进行升序或降序排列。...

    SQL问题详解之_having_Group by

    在SQL查询中,GROUP BY和HAVING子句是数据分析和聚合操作的核心部分,它们帮助我们对数据进行分组和过滤,以获得更有意义的结果。在深入理解这两个子句之前,我们首先需要了解聚合函数,如SUM、COUNT、MAX和AVG等。 ...

    深入浅析SQL中的group by 和 having 用法

    在SQL查询中,`GROUP BY` 和 `HAVING` 是两个非常重要的子句,它们用于处理数据的分组和过滤。下面将详细讲解这两个概念及其用法。 **1. SQL中的`GROUP BY` 用法解析** `GROUP BY` 语句的核心功能是将数据表中的...

    Sequelize中用group by进行分组聚合查询

    其中,`GROUP BY`后的字段指定了分组的依据,`HAVING`用于在分组后对结果进行过滤,而`WITH ROLLUP`则用于生成包含汇总数据的额外行。 2. Sequelize中的分组查询 Sequelize提供了一种直接在模型上使用聚合函数的...

    Oracle中分组查询group by用法规则详解

    `HAVING`子句用于在`GROUP BY`后过滤数据,类似于`WHERE`子句,但它作用于分组后的数据,因此可以使用聚合函数。例如,以下查询返回部门总薪水大于8500的部门编号和总薪水: ```sql SELECT deptno, SUM(sal) ...

    order_by_、group_by_、having的用法区别

    order_by_、group_by_、having的用法区别

    order_by_、group_by_、having的用法区别.doc

    ### SQL中的ORDER BY, GROUP BY, HAVING 的用法区别详解 #### 一、概述 在SQL查询语言中,`ORDER BY`, `GROUP BY`, 和 `HAVING` 是三个非常重要的概念,它们分别用于对查询结果进行排序、分组以及在分组后进一步...

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

    在MySQL中,`GROUP BY` 和 `HAVING` 通常一起用于聚合查询,用来筛选满足特定条件的分组。然而,当没有 `GROUP BY` 子句时,直接使用 `HAVING` 可能会导致非预期的行为。这个问题的探讨主要集中在 `HAVING` 后面直接...

    当数据库复杂查询执行顺序与编写顺序原理及sql案例:同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序

    当同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序时的用法

    group by的详解

    3. **排序顺序**:当同时使用`GROUP BY`、`HAVING`和`ORDER BY`时,`ORDER BY`通常放在最后。在示例中,`ORDER BY p.name`确保结果按供应商名字排序,而Oracle会默认按照`GROUP BY`中的列顺序进行排序,即先按年份、...

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

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

    数据库笔试题之查询语句where,group by,having,order by执行与编写顺序详解

    特别是在WHERE、GROUP BY、HAVING、ORDER BY同时出现时,执行顺序和编写顺序变得尤为重要。本文将详细介绍WHERE、GROUP BY、HAVING、ORDER BY的执行顺序和编写顺序,以及它们之间的关系。 一、WHERE子句的执行顺序 ...

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

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

    sql中的 where 、group by 和 having 用法解析

    在SQL查询中,`WHERE`、`GROUP BY`和`HAVING`子句都是用于数据筛选和分组的重要部分,但它们各自承担不同的任务。理解它们的用法对于编写有效的SQL查询至关重要。 首先,`WHERE`子句是SQL查询中最基本的过滤条件,...

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

    在SQL查询中,`GROUP BY`、`HAVING` 和 `ORDER BY` 是三个非常重要的子句,它们分别用于数据的分组、筛选和排序。接下来我们将深入探讨这三个概念及其用法。 首先,`GROUP BY` 子句用于将数据按照一个或多个列进行...

Global site tag (gtag.js) - Google Analytics