MySql分组函数-Group by与having理解

注意:select 后的字段,必需要么包含在group by中,要么包含在having 后的聚合函数里。
1. GROUP BY 是分组查询, 通常 GROUP BY 是和聚合函数配合使用

group by 有一个原则,就是 select 后面的全部列中,没有使用聚合函数的列,必须出如今 group by 后面(重要)数据库

例如,有以下数据库表:函数

A    B 
1    abc 
1    bcd post

1    asdfg学习

 若是有以下查询语句(该语句是错误的,缘由见前面的原则)spa

select A,B from table group by A  it

该查询语句的意图是想获得以下结果(固然只是一相情愿) table

A     B 
       abc 
1     bcd class

       asdfg 基础

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

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 NumCustsFROM (SELECT YEAR(OrderDate) AS OrderYear, CustomerID   FROM dbo.Orders) AS DGROUP BY OrderYear;还有一种很特殊的写法:

相关文章
相关标签/搜索