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