以下均为个人理解
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 之后的一个或者多个字段分组,字段值相同的为一组。以下面这张图为例
当使用: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】
同理,当使用多个字段分组时,就以多个字段为整体进行分组。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】
而且显示结果只会显示每个组中的第一条数据。所以只使用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语句,