Group by与having理解

原创 2015年07月10日 17:37:15

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;在作者眼里,他是非常喜欢这种写法的,因为更清晰,更明确,更便于维护。


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


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

sql exists,in,group by,having

语法: EXISTS subquery 参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。 结果类型: Boolean 。如果子查...
  • maladoufu
  • maladoufu
  • 2012年11月17日 20:37
  • 3896

Group By 和 Having, Where ,Order by语句的执行顺序:

一. group by  1.GROUP BY子句主要用于对WHERE中得到的结果进行分组,也就是说它是在WHERE子句之后执行,对经过WHERE筛选后的结果按照某些列进行分组,之后进行相应的处理工...
  • zhangyuehuan
  • zhangyuehuan
  • 2014年04月10日 22:24
  • 1433

having和group by结合的使用

这是一个学生成绩表: mysql> desc sc; +——-+————-+——+—–+———+——-+ | Field | Type | Null | Key |...
  • jiaobuchong
  • jiaobuchong
  • 2016年01月12日 18:51
  • 671

group by, where, having的使用方法和之间区别

select 后的字段,必须要么包含在group by中,要么包含在having后的聚合函数里。(?) 1、group by是分组查询,一般group by是和聚合函数配合使用       gro...
  • lsq_java_4
  • lsq_java_4
  • 2016年04月05日 23:04
  • 1954

Group by与having理解

注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里。 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 g...
  • qkillq
  • qkillq
  • 2013年11月26日 22:16
  • 480

Mysql中Group By使用Having语句配合查询

注意 :having语句是必须和GROUP BY一起使用的,语句中可以只有GROUP,但是不可以只有Having,当然可以而这可以同时出现的。Having短语与WHERE的区别!!! WHERE子句...
  • Gpwner
  • Gpwner
  • 2016年05月30日 20:00
  • 4362

mysql必知必会——GROUP BY和HAVING

GROUP BY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 select子句中的列名必须为分组列或列函数,列函数对于group by子句定义的每个组返回一个结果...
  • bingogirl
  • bingogirl
  • 2016年09月16日 23:58
  • 21516

SQL中的Where,Group By,Order By和Having

数据库,每个程序或多或少都会有所接触。 说到SQL语句,大家最开始想到的就是他的查询语句: select * from tableName; 这是最简单的一种查询方式,不带有任何的条件。...
  • qitian0008
  • qitian0008
  • 2012年08月07日 22:37
  • 8114

关于group by 、group by having、where group by与 group by order by

现有表 score name      kecheng     fenshu 张三     语文       81 张三     数学       75 李四     语文     ...
  • qq_28007533
  • qq_28007533
  • 2017年06月04日 16:29
  • 377

oracle中的having ,group by ,where之间联系与区别

having子句与where有相似之处但也有区别,都是设定条件的语句。 在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执...
  • gao454917848
  • gao454917848
  • 2014年06月21日 08:36
  • 1986
收藏助手
不良信息举报
您举报文章:Group by与having理解
举报原因:
原因补充:

(最多只允许输入30个字)