`
ihyperwin
  • 浏览: 434633 次
  • 性别: 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** 子句: - `ORDER BY` 用于对查询结果进行排序,按照指定的字段进行升序或降序排列。...

    SQL问题详解之_having_Group by

    理解GROUP BY和HAVING子句的关键在于区分它们的使用时机。GROUP BY用于将数据分组,而HAVING则用于筛选这些分组,提供了一种在聚合数据级别应用条件的方法。这两个子句常与聚合函数一起使用,帮助我们从大量数据中...

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

    - `HAVING` 子句通常与 `GROUP BY` 子句一起使用。 - 与 `WHERE` 子句不同的是,`HAVING` 子句可以在分组之后过滤数据,并且可以包含聚合函数。 **2. 语法** ```sql SELECT column1, aggregate_function(column...

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

    这种行为在处理大型数据集或复杂查询时可能导致混淆,所以理解 `GROUP BY` 和 `HAVING` 的正确用法至关重要,以避免潜在的错误和性能问题。在实际开发中,应尽量遵循SQL的标准规范,使用 `GROUP BY` 来配合 `HAVING`...

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

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

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

    在MySQL中,`GROUP BY` ...总之,理解和正确使用 `GROUP BY` 和 `HAVING` 是进行复杂数据分析的关键,它们可以帮助我们从大量数据中提取出有用的信息。在实际操作中,确保遵守SQL标准,以保证查询的稳定性和可移植性。

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

    接下来,`HAVING`子句是用来在分组后对组进行过滤的,它与`WHERE`子句类似,但`WHERE`子句在分组之前就应用于原始数据,而`HAVING`则在`GROUP BY`之后应用,即在聚合函数计算完成之后。这意味着`HAVING`可以基于聚合...

    mysql group by having 实例代码

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

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

    接下来,`GROUP BY`子句用于将数据按照一个或多个列进行分组,通常与聚合函数(如`COUNT`, `SUM`, `AVG`, `MAX`, `MIN`等)一起使用,以对每个组进行统计计算。例如,如果你想知道每个部门的员工人数: ```sql ...

    group by的详解

    综上所述,`GROUP BY`和`HAVING`在Oracle数据库中是用于数据统计和分析的重要工具,正确理解并掌握它们的用法对于编写有效的SQL查询至关重要。通过合理运用这两者,数据库管理员可以生成满足各种复杂业务需求的报表...

    sql语句教程(包括比较难理解的group by以及having指令的使用)

    我们将特别关注那些较为复杂的SQL指令,如`GROUP BY`和`HAVING`等。 #### 二、SQL基础指令详解 ##### 1. SELECT **用途**:`SELECT`是最常用的SQL指令之一,主要用于从数据库中选取数据。 **语法**: ```sql ...

    《Pro Oracle SQL》Chapter7--7.10GROUP BY Restrictions

    5. HAVING子句:GROUP BY通常与HAVING子句结合使用,HAVING用于在分组后过滤结果,而WHERE则在分组前过滤。HAVING条件可以基于聚合函数的结果,这是WHERE子句做不到的。 6. 分组嵌套:可以使用多级GROUP BY来创建...

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

    通过理解和熟练运用`GROUP BY`,你可以更有效地处理大量数据,生成更有价值的分析结果。记住,合理使用`GROUP BY`和相关的聚合函数是数据分析和报表制作的关键步骤。希望这些信息能帮助你更好地理解和运用`GROUP BY`...

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

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

    SQL GROUP BY 语句详解

    GROUP BY 语句还有其他高级用法,比如配合 HAVING 子句进行分组后的条件筛选,或者与子查询和联接操作结合使用,以实现更复杂的分析需求。总的来说,理解并熟练运用 GROUP BY 语句对于在 SQL 查询中进行数据分析至关...

    group by用法.doc

    理解并熟练运用`GROUP BY`和相关的聚合函数、`HAVING`、`WITH ROLLUP`和`WITH CUBE`,对于进行复杂的SQL数据分析和报表生成至关重要。这些技巧可以帮助你更有效地从数据库中提取信息,满足业务分析的需求。

Global site tag (gtag.js) - Google Analytics