`

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


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


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

 

 

 

原文链接 http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html

分享到:
评论

相关推荐

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    geebinf modified by zz.ens

    写中文文章,或者外文,参考文献格式。例如:[1] Niu M, Hu Y, Sun S, et al. A novel hybrid decomposition-ensemble model based on VMD and HGWO for container throughput forecasting[J]. Applied Mathematical...

    word 插入EndNote参考文献 规范 (geebinf modified by zz.ens)

    word 插入EndNote参考文献 规范 (geebinf modified by zz.ens)

    ZZ561401.CAB

    ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB

    ZZ-2021030 网络搭建与应用赛项赛卷《网络环境》.pdf

    ZZ-2021030 网络搭建与应用赛项赛卷《网络环境》.pdf

    wincc AX NF ZZ

    wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。

    ZZ-2022018 制冷与空调设备组装与调试赛项赛题.zip

    "ZZ-2022018 制冷与空调设备组装与调试赛项赛题"正是这样一个针对中职学生的专业赛事,旨在提升学生的实践操作能力和理论知识水平。 赛题的核心内容涵盖以下几个关键知识点: 1. **制冷原理**:参赛者需要了解并...

    ZZ Fibo Trader - MetaTrader 5EA.zip

    在ZZ Fibo Trader中,抛物线止损系统与斐波那契分析相结合,可以在价格走势符合预期时保护盈利,同时在市场反转时减少损失。 ZZFiboTrader.mq5 文件是ZZ Fibo Trader EA的核心源代码,采用MQL5语言编写。MQL5是...

    ZZ_MODIFIED_GEEBINF.ENS.zip endnote的样式文件

    标题中的“ZZ_MODIFIED_GEEBINF.ENS.zip”是一个压缩包文件,主要包含一个名为“ZZ_MODIFIED_GEEBINF.ENS”的文件。这个文件是一种特殊格式,用于定义EndNote的引用样式。EndNote是一款强大的文献管理软件,广泛应用...

    超出NLO QCD的高横向动量的ZZ产生

    我们将我们的预测与NNLO的总包容性横截面的现有结果进行了比较,并找到了很好的协议。 然后,我们为两种实验设置提供了差分分布的结果,一种用于搜索异常三重玻色子玻色子耦合,另一种用于希格斯分析中的四个带电...

    ZZ016网络建设与运维赛项竞赛方案及赛项规程(SW1)

    ZZ016网络建设与运维赛项竞赛方案及赛项规程(SW1)

    zz牌类小游戏24点

    "zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...

    zz CAD快速计算长度插件

    在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。

    ZZ-2022019 电气安装与维修赛项赛题.zip

    《ZZ-2022019 电气安装与维修赛项赛题》是一个针对中职学生设计的技能大赛项目,旨在考核参赛者在电气安装和维修方面的专业技能。这个赛题不仅要求参赛者具备扎实的理论基础,还强调实际操作能力和问题解决能力。...

    ZZ-2022010 机器人技术应用赛项赛题.zip

    中职(中等职业教育)的“机器人技术应用赛项”旨在锻炼学生的实践操作能力,提升他们对机器人系统设计、编程与调试的综合理解。这个赛题,即“ZZ-2022010 机器人技术应用赛项”,是针对这一目标而设立的竞赛项目。 ...

    ZZ-2022015 液压与气动系统装调与维护赛项赛题.zip

    中职学校的学生通过参与“液压与气动系统装调与维护”赛项,可以深入理解和掌握这一领域的核心知识与技能。该赛题主要针对中职阶段的学生,旨在提升他们的实践操作能力和理论知识水平,为将来的职业生涯打下坚实基础...

    zz809.com留言本

    《zz809.com留言本》是一款基于网络的互动交流平台,源于柏图留言本BTB 1.2版本,并经过管理员zz809的定制和优化。这个平台旨在为用户提供一个简便、实用的在线留言功能,使得用户可以方便地在网站上发表评论、交流...

    中医大夫助理信息系统 zz-doctor

    Activity是用户界面的主要构成部分,Service用于后台运行任务,BroadcastReceiver处理系统广播事件,而ContentProvider则负责数据的存储与共享。了解并熟练掌握这些组件的用法,对于构建功能完善的Android应用至关...

    Zz归零.LSP

    cad标高归零,好用的

Global site tag (gtag.js) - Google Analytics