`
wang_zhi_peng2007
  • 浏览: 241869 次
  • 性别: 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.使用computecompute 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的用法

    order by 、group by 、having的用法区别 order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。 group by 从英文里理解就是分组。必须有“聚合函数”来...

    SQL问题详解之_having_Group by

    该文由浅入深,用浅显的例子给大家以启发,对深入理解having,group by 有很好的帮助!

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

    sql经典教程,非常全面。包括比较难理解的group by以及having指令的使用。对sql语句的执行顺序也有部分介绍,总之,是不可多得的学习sql的文档。真是居家旅行。。。

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

     Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。  作用:通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。  注意:group by 是先排序后...

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

    --sql中的 where 、group by 和 having 用法解析 --如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术 select DepartmentID as '部门名称',COUNT(*)...

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

     group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。 什么是“聚合函数”? 像sum()、count()、avg()等都是“聚合函数” 使用group by 的目的就是要将数据分类...

    mysql中order by与group by的区别

    order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是... 您可能感兴趣的文章:sql中 order by 和 group by的区别深度分析mysql GROUP BY 与 ORDER BYgroup by,having,o

    SQL语句文档教程 PDF

    sql经典教程,非常全面。包括比较难理解的group by以及having指令的使用。对sql语句的执行顺序也有部分介绍,总之,是不可多得的学习sql的文档。

    T-SQL高级查询

    select count(*), age from student group by age having count(age) >= 2; 按照cid和性别组合分组,过滤条件是cid大于1,cid的最大值大于2 select count(*), cid, sex from student group by cid, sex having cid...

    MySQL DQL - 执行顺序.md

    3. `GROUP BY`子句:将结果分组,并对每个分组进行聚合计算; 4. `HAVING`子句:对分组后的结果进行筛选; 5. `SELECT`子句:计算和选择要显示的列; 6. `ORDER BY`子句:对查询结果进行排序; 7. `LIMIT`子句:限制...

    mysql笔记.txt

    mysql笔记,包含联合查询,多表查询等,是小白初入mysql的好帮手,有对于mysql关键字查询顺序的好理解,还有group by 分组函数 having 过滤函数。

    Oracle数据库Sql语句详解大全

    使用Group By对查询数据分组 使用HAVING子句对分组后的数据进行过滤 第六章 子查询 第七章 数据建模及数据库设计 了解系统开发的步骤 数据关系的定义 理解实体关系映射图(E-R图) 第八章 创建表 掌握创建表的...

    详解SQL Server的简单查询语句

    所有复杂的语句都是由简单的语句组成基本都是由SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等组成,当然还包括一些谓词等等。比如当我们要查询某表中所有数据时我们会像如下进行。 SELECT * FROM TABLE 到这里...

    MySQL命令大全

    grant update,delete on mydb.TestTable to NewUserName@HostName identified by “password”; 若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表...

    MySQL优化中B树索引知识点总结

    select from join on where 条件 group by 分组 having过滤组 order by排序 limit限制查询个数 我们虽然是这样去写的,但是它mysql的引擎去解析时,并不是依照我们以上编写的这样的顺序; 它并不是先解析select 而是...

    MYSQL常用命令大全

    grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password"; 若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的...

    情境四-公司管理数据库系统的查询.doc

    ] [ GROUP BY 〈列名1> [HAVING 〈表达式〉 ] ] [ ORDER BY 〈列名2> [ ASC " DESC ] ] 其中,包含子句SELECT ,INTO,FROM,WHERE,GROUP BY,HAVING,ORDER BY等,每个子句都有各自的用法和功能。 SELECT子句:...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合函数 114 4.4 小结 114 第5章 关于问题 116 5.1 问出好的问题 116 5.2 提问的目的 117 5.3 问题的种类 117 5.4 关于问题的问题 119 5.5 关于数据的问题...

    第6章 分组函数

    通过本章学习,学员应达到如下目标: 理解单行函数和分组函数的区别;...掌握分组 GROUP BY语句; 掌握过滤分组后的记录 HAVING 语句; 掌握SELECT语句6个子句的执行顺序; 利用分组函数和分组语句能解决常见问题;

Global site tag (gtag.js) - Google Analytics