目录
2.COUNT(1)&COUNT(*)&COUNT(字段)区别(面试常问)
6.oracle中having与where的区别 (面试常问)
1.聚合函数
聚合函数:可以同时对多行进行操作,并返回一个结果
聚合函数有:
(1)avg(x):返回x的平均值;
(2)count(x):查询返回的行数;
(3)max(x):返回x的最大值;
(4)min(x):返回x的最小值;
(5)median(x):返回x的中位数;
(6)sum(x):返回x的和;
2.COUNT(1)&COUNT(*)&COUNT(字段)区别(面试常问)
COUNT(1)&COUNT(*) 都是统计行数 得到的结果都是一样的
但是 COUNT(1) 比 COUNT(*) 性能要好一点,因为COUNT(*)需要先得到表的字段信息然后再计数。
而COUNT(1)相当于新增一列,然后对该列进行直接计数。
COUNT(字段)是统计该字段非空的行数(不把为空的行统计进去)
3.分组聚合——group by
分组的情况下,group by后面有什么字段,select 才可以查对应的字段
4.去重:DISTINCT 、GROUP BY
特性 | DISTINCT | GROUP BY |
---|---|---|
主要用途 | 去除查询结果中的重复行 | 对数据进行分组并允许使用聚合函数 |
是否可与聚合函数一起使用 | 不可以 | 可以 |
对输出的影响 | 返回去重后的结果集 | 根据分组条件返回每组的汇总信息 |
性能考虑 | 对于简单去重操作较为直接有效 | 更适合需要汇总、统计等复杂查询 |
示例 | SELECT DISTINCT department_id FROM employees; |
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id; |
5.聚合函数的过滤HAVING
HAVING必须和group by 配合使用,且having必须在group by后面
HAVING 关键字和 WHERE 关键字都可以用来过滤数据,
且 HAVING 支持 WHERE 关键字中所有的操作符和语法。
注意:使用聚合函数之前尽量先用where进行过滤,先过滤再分组
避免查*,用到哪些字段就查询哪些字段
6.oracle中having与where的区别 (面试常问)
- where 不能放在 group by 的后面
- HAVING 是跟 GROUP BY 连在一起用的,放在 GROUP BY 后面,此时的作用相当于WHERE
- WHERE 后面的条件中不能有聚合函数,比如 SUM()、AVG()等,而 HAVING 可以
示例1:找出部门平均薪资大于1000 并且 部门编号不为10的 部门和部门平均薪资
select deptno,avg(sal) avg_sal
from emp
where deptno<>10
group by deptno
having avg(sal)>1000;
7.ROUND与TRUNC函数
ROUND(x,y)--四舍五入至y位小数
ROUND(x)--四舍五入至整数
TRUNC(x,y)--根据指定的小数位数截断数值(不进行四舍五入)。
8.ROLLUP上卷与CUBE各维度汇总
特性 | ROLLUP(job, deptno) |
CUBE(job, deptno) |
---|---|---|
汇总层级 | 层次化汇总 | 所有可能组合 |
包含哪些分组 | (job, deptno), (job), () | (job, deptno), (job), (deptno), () |
是否包含部门小计 | ❌ 不包含只按部门的小计 | ✅ 包含 |
结果行数 | 较少 | 更多 |
9.子查询
--单行子查询,返回的结果里只有一条数据 SELECT COUNT(1) FROM EMP;
--多行子查询,返回的结果集里有多条数据 SELECT ENAME FROM EMP;
单行子查询案例:
示例:查询EMP,找出哪些人薪资比SCOTT用户高
SELECT SAL
FROM EMP
WHERE ENAME = 'SCOTT';
--
SELECT ENAME
FROM EMP
WHERE SAL > 3000;
--
SELECT ENAME
FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE ENAME = 'SCOTT');
多行子查询案例:
示例:在10 和 20 部门中找出工作岗位和30部门中存在的任意一个岗位相同的员工的信息
SELECT DISTINCT JOB
FROM EMP
WHERE DEPTNO = 30;
SELECT *
FROM EMP
WHERE DEPTNO IN (10, 20)
AND JOB IN (SELECT DISTINCT JOB
FROM EMP
WHERE DEPTNO = 30);