group by having

2024-09-03 03:08
文章标签 group

本文主要是介绍group by having,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

 

 

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

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于group by having的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131850

相关文章

MySQL报错sql_mode=only_full_group_by的问题解决

《MySQL报错sql_mode=only_full_group_by的问题解决》本文主要介绍了MySQL报错sql_mode=only_full_group_by的问题解决,文中通过示例代码介绍的非... 目录报错信息DataGrip 报错还原Navicat 报错还原报错原因解决方案查看当前 sql mo

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

AI辅助编程里的 Atom Group 的概念和使用

背景 在我们实际的开发当中,一个需求往往会涉及到多个文件修改,而需求也往往有相似性。 举个例子,我经常需要在 auto-coder中需要添加命令行参数,通常是这样的: /coding 添加一个新的命令行参数 --chat_model 默认值为空 实际上这个需求涉及到以下文件列表: /Users/allwefantasy/projects/auto-coder/src/autocoder/auto

group by 新体会

group by 分组语句中的 select 后面查询的东西,只能是 group by 中的字段或聚合函数,如果含有group by 中的没有的字段,sql 会报错。 表users   例子:  1.select count(1),sex from users group by sex; sql执行正确   2.select count(id),sex from users gr

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景: 本来已经正常运行的平台,突然有一天由于对服务器进行部分操作迁移,发现jar可以正常启动,但是访问功能一直报错,监控后台日志后,发现了问题: 报错的具体信息如下: Caused by: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and conta

group by和order by

order by  是按字段排序       (排序查询asc升序desc降序) group by  是按字段分类    (分组查询having只能用于group by子句,作用于组内,having条件子句可以直接跟函数表达式)       order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。

docker 启动 wurstmeister/zookeeper出错:be owned by root and not group or world-writable docker zookeep

总有一些意想不到的问题,别的环境都好好的,这个环境就是不行,启动脚本 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper 发现 zookeeper启动后直接退出。查看日志 >> docker logs zookeeper>> /var/run/sshd must be owned by root and

SQL 支持使用 GROUP BY多个列

SQL 语言支持使用 GROUP BY 子句对多个列进行分组。当你对多个列进行分组时,SQL 会根据这些列的组合值来分组数据。这意味着只有当所有指定的列在多行中具有相同的值时,这些行才会被分组在一起。 语法 SELECT column1, column2, AGGREGATE_FUNCTION(column3) FROM table_name GROUP BY column1, column2

谈谈分组:sql的group by+聚集函数 和 python的groupby+agg

直接举例子+分析例子+总结来说,我先给几个表: 学生表:student(学号,姓名,年龄,院系); 课程表:course(课程号,课程名,学分); 学生选课表:sc(学号,课程号,分数); 啥时候用分组呢? 我由简至深来谈。 1、比如让我们查询各个课程号及相应的选课人数。 首先定位到sc表上,“各个”很明显就是要按课程分组,group by出场了,分组后对每组去统计选课人数,聚集函数出场了。

OceanBase 关于 place_group_by HINT的使用

PLACE_GROUP_BY Hint 表示在多表关联时,如果满足单表查询后直接进行group by 的情形下,在跟其它表进行关联统计,减少表内部联接。 NO_PLACE_GROUP_BY Hint 表示在多表关联时,在关联后才对结果进行group by。 使用place_group_by 的耗时少于no_place_group_by的耗时,原因可以查看执行计划的COST区别。 直接上图 #不