SQL 聚合函数一定要跟group by以及NULL的关系的案例精讲

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 聚合函数一定要跟group by以及NULL的关系的案例精讲相关的知识,希望对你有一定的参考价值。

SQL 聚合函数与GROUP BY NULL的关系及ALL的使用说明

需求说明

有如下一道SQL题,网友咨询:

1 为啥正确答案是第二项?

2 聚合函数是否一定要跟GROUP BY PARTITION BY?

 问题解答

1 聚合函数(SUM、COUNT、MAX、MIN)等不一定要跟GROUP BY、PARTITION BY,当这种情况出现时即对某一列进行聚合,即当前只有一个分组。

2 NULL值在聚合函数里会不参与运算,会被过滤掉。(当且仅当结果集不全是NULL时)。

3 题目的详细分析见下:

/*
# 0 关于问题
找出GDP比亚洲里任意一个国家都多的所有国家。
注:亚洲的一些国家的GDP可能是NULL值。

#1 关于答案的分析:
条件1:Africa(some countries may hava NULL gdp vlulues),亚洲的一些国家的gdp数据可能是NULL值。

# ans1:
	这里无关子查询SELECT MAX(gdp) FROM bbc WHERE region='Afirca' AND gdp=0 实际已经限定出来的结果为0或者NULL。

# ans2:
	正确选项。
	
# ans3:
	显然用错了聚合函数,应该是MAX。

# ans4:
	在条件1的情况下结果可能是NULL。简言之任何比较符(>、<、=)跟NULL比较都是NULL。

# ans5:
	在#ans4的基础上做了改进,但针对NULL的判断用错了方法,应该用NOT NULL或者not 字段 <=> NULL。

#2 关于总结
这道题考察的是聚合函数、NULL、ALL关键字的使用。
1 聚合函数处理时会过滤NULL值(严谨的说是处理的结果集不全是NULL时)。
2 ALL关键字在做比较时碰到NULL值返回NULL。
3 NULL的比较符号是IS、IS NOT或者 <=> NULL、NOT 字段 <=> NULL
*/
-- # 3 延展案例:
-- 3.1 聚合函数处理时会过滤NULL值(当结果集为NULL时最终还是NULL)。
SELECT MAX(A.sal) MAXA,MAX(B.sal) MAXB FROM (
SELECT sal FROM emp WHERE deptno=20
UNION SELECT NULL
)A,(SELECT sal FROM emp WHERE deptno=20 AND sal=0 
UNION SELECT NULL)B
/*
MAXA	MAXB
3000.00	
*/

-- 3.2 ALL关键字在做比较时碰到NULL值返回NULL。
SELECT empno,sal FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=20 UNION SELECT NULL )

/*
empno	sal

*/
-- 3.3 用 NOT <=> 或者 IS NOT NULL过滤NULL值
SELECT empno,sal FROM emp
WHERE sal > ALL
(
	SELECT * FROM (
	SELECT sal FROM emp WHERE deptno=20 UNION SELECT NULL
	)A
	WHERE not sal <=> NULL
	-- WHERE sal IS NOT NULL 等价于上式
)

/*
empno	sal
7839	5000.00
*/

-- 3.4 MAX、MIN、SUM等聚合函数可以不跟GROUP BY,意思为对某一列求聚合。
-- 它实际等价于下面的写法,即将整个一列作为一个GROUP。
SELECT MAX(sal) 
FROM emp
GROUP BY (SELECT 1)
/*
MAX(sal)
5000.00
*/
 
-- #4 用的表结构及数据,详见:

SQL 100+个最佳入门案例实践(覆盖Oralce、SQL Server、mysql)之基础操作_1_检索数据_数据科学汇集-CSDN博客7.1 数据集见如下SQL,以Oracle为例:-- DROP TABLE EMP;-- DROP TABLE DEPT;-- DROP TABLE BONUS;-- DROP TABLE SALGRADE;CREATE TABLE DEPT(DEPTNO NUMBER(2) NOT NULL CONSTRAINT pk_dept_deptno primary key,DNAME Vhttps://shenliang.blog.csdn.net/article/details/70145965

以上是关于SQL 聚合函数一定要跟group by以及NULL的关系的案例精讲的主要内容,如果未能解决你的问题,请参考以下文章

google bigquery SQL group by 聚合函数

聚合函数 和 group by

postgreSQL使用sql归一化数据表的某列,以及出现“字段 ‘xxx’ 必须出现在 GROUP BY 子句中或者在聚合函数中”错误的可能原因之一

在 sql 查询中使用聚合函数时避免 group by 子句

聚合函数和GROUP BY的问题

sql 聚合函数和group by 联合使用