设为首页 收藏本站
查看: 1062|回复: 0

[经验分享] Oracle group by

[复制链接]

尚未签到

发表于 2018-9-14 08:35:02 | 显示全部楼层 |阅读模式
Group By
注意: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
  groupby CustomerID           --按客户分组
  HavingCount(Distinct EmployeeID)=     --为其处理订单的distinct 员工数等于美国总员工数
  (SelectCount(*)From Employees Where Country=N'USA')--美国员工总数
  2:
  返回在每月最后实际订单日期发生的订单(每月最后订单日期可能不是每月最后一天)
  --思路:子查询按月分组得到每月最近订单日期
  Select OrderID,CustomerID,EmployeeID,OrderDate
  From Orders
  Where OrderDate In
  (SelectMax(OrderDate)From Orders GroupbyConvert(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;在作者眼里,他是非常喜欢这种写法的,因为更清晰,更明确,更便于维护。
  在查询中使用参数定向产生一批结果,这个技巧没有什么好说的。
  嵌套查询,在处理逻辑上是从里向外进行执行的。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-581742-1-1.html 上篇帖子: case when在sqlserver和oracle的不同写法 下篇帖子: oracle修改归档日志的路径
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表