Oracle基础知识(二)

发布于:2025-05-22 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

1.聚合函数

2.COUNT(1)&COUNT(*)&COUNT(字段)区别(面试常问)

3.分组聚合——group by

4.去重:DISTINCT 、GROUP BY

5.聚合函数的过滤HAVING

6.oracle中having与where的区别  (面试常问)

7.ROUND与TRUNC函数

8.ROLLUP上卷与CUBE各维度汇总

9.子查询

单行子查询案例:

多行子查询案例:


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的区别  (面试常问)

  1. where 不能放在 group by 的后面
  2. HAVING 是跟 GROUP BY 连在一起用的,放在 GROUP BY 后面,此时的作用相当于WHERE
  3. 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);

网站公告

今日签到

点亮在社区的每一天
去签到