以下均为个人理解

DB2的语法:

1、查询重复字段,查询表中某个字段的数量大于二。group by 表示分组,以一个或者多个字段分组。

SELECT NUM FROM COHOTABLE GROUP BY  NUM HAVING COUNT(NUM) > 2

SELECT NUM,COUNT(*) FROM COHOTABLE GROUP BY  NUM HAVING COUNT(NUM) > 2

备注:经测试,貌似在DB2中,select之后不能含有 group by后没有显示的字段。也就是查询的的字段,必须来自于分组字段。不然会报错: DB2 SQL Error: SQLCODE=-119, SQLSTATE=42803。这点和mysql有点差别。

-- 错误
SELECT NUM,AGE FROM COHOTABLE GROUP BY  NUM HAVING COUNT(NUM) > 2

-- 正确
SELECT NUM,AGE FROM COHOTABLE GROUP BY  NUM,AGE  HAVING COUNT(NUM) > 2
-- 正确
SELECT STU_NAME FROM  COHO GROUP BY STU_SUB,SCORE

拓展(以mysql为例):GROUP BY 又叫分组聚合,其语句用于结合(非必须)聚合函数,根据一个或多个列对结果集进行分组

常见的聚合函数:count() 计数,sum() 求和,avg() 平均数,max() 最大数,min() 最小数。

-- 以名字进行分组。然后对每组内的数据按照score字段计数,也就是每组内,
-- 数据条数大于等于二的返回。默认返回第一条数据。以下同理
select * from coho group by stu_name having count(score) >=2

SELECT NUM FROM COHOTABLE GROUP BY  NUM HAVING SUM(NUM) > 10

SELECT NUM FROM COHOTABLE GROUP BY  NUM HAVING AVG(NUM) > 2

select * from coho group by stu_name,stu_sub having max(score) >=98 

SELECT NUM FROM COHOTABLE GROUP BY  NUM HAVING MIN(NUM) > 1

 

GROUP BY 分组查询的实现逻辑(以mysql为例):

在查询的时候,sql会根据group by 之后的一个或者多个字段分组,字段值相同的为一组。以下面这张图为例

mysql 查询大于23点的数据 sql查询数量大于2的数据_数据

当使用:select *  from  coho group by stu_no以stu_no 为聚合字段查询时,表中数据会按照stu_no进行分组。stu_no相同的为一组。

0010239    张家栋    男    语文    100,0010239    张家栋    男    英文    99】,

0010240    李良玉    男    语文    78】

0010248    温小雅    女    数学    98,0010248    温小雅    女    英文    100】,

0010245    王霄    男    英文    99,0010245    王霄    男    数学    100】,

0010247    李玲玉    女    语文    98,0010247    李玲玉    女    数学    98,0010247    李玲玉    女    英文    98】

mysql 查询大于23点的数据 sql查询数量大于2的数据_mysql 查询大于23点的数据_02

同理,当使用多个字段分组时,就以多个字段为整体进行分组。select * from coho group by stu_sub,score

   stu_no  stu_name  sex  stu_sub  sorce

【0010245    王霄    男    数学    100】,

【0010248    温小雅    女    数学    98,0010247    李玲玉    女    数学    98】,

【0010248    温小雅    女    英文    100】,

【0010247    李玲玉    女    英文    98】,

【0010239    张家栋    男    英文    99,0010245    王霄    男    英文    99】,

【0010239    张家栋    男    语文    100】,

【0010240    李良玉    男    语文    78】,

【0010247    李玲玉    女    语文    98】

mysql 查询大于23点的数据 sql查询数量大于2的数据_mysql 查询大于23点的数据_03

而且显示结果只会显示每个组中的第一条数据。所以只使用group by,不加聚合函数的使用意思不大。

 

我们最常见的查询方式都是:group by + having

having的作用,字面上和where一样,而且having只能和group by结合使用。

having和where的区别

  • HAVING是在分组后对数据进行过滤,WHERE是在分组前对数据进行过滤
  • HAVING后面可以使用分组函数(统计函数),WHERE后面不可以使用分组函数
  • HAVING子句中可以使用字段别名,而WHERE不能使用
  • HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句,WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句,