Oracle进阶总结(2)

本文介绍了Oracle SQL中的关键概念,如分组函数、GROUP BY、ORDER BY、HAVING子句等,详细讲解了单行和多行子查询的应用,以及如何进行层次查询和分页操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle知识点总结

1.分组函数


1) MIN 求最小值
2) MAX 求最大值
3)SUM 求和
4)AVG 求平均值
5)COUNT 求满足条件的记录数

2.GROUP BY


通过GROUP BY 子句可将表中满足WHERE条件
的记录按照指定的列划分成若干个小组
注意 (1).SELECT deptno, COUNT(ename) FROM emp;
错误: [Err] ORA-00937: not a single-group group function

3.ORDER BY 子句


根据列名排序 默认降序(DESC),升序(ASC)

4.使用HAVING 子句限制组


– 记录已经分组.
–使用过组函数.
– 与HAVING 子句匹配的结果才输出

SELECT deptno, max(sal)
 FROM emp
 GROUP BY deptno
 HAVING max(sal)>2900;
 结果:
 DEPTNO MAX(SAL)
--------- ---------
 10 5000
 20 3000

5.SELECT语句执行过程


–1.通过FROM子句中找到需要查询的表;
– 2.通过WHERE子句进行非分组函数筛选判断;
– 3.通过GROUP BY子句完成分组操作;
– 4.通过HAVING子句完成组函数筛选判断;
– 5.通过SELECT子句选择显示的列或表达式及组函数;
–6.通过ORDER BY子句进行排序操作。

6.子查询


1)单行子查询

• 子查询只返回一行一列
• 使用单行运算符
实例:
显示和雇员7369从事相同工作并且工资大于雇员7876的雇员的姓名和工作

SELECT ename, job
 FROM emp
 WHERE job = CLERK
 (SELECT job
 FROM emp
 WHERE empno =7369)
AND  sal >
   (SELECT sal
   FROM emp
   WHERE empno = 7876);
2)多行子查询

子查询返回记录的条数 可以是一条或多条。多行操作符包括:
• IN 判断是否与子查询的任意一个返回值相同
• ANY 表示和子查询的任意一行结果进行比较,有一个满足条件即可。
• ALL 表示和子查询的所有行结果进行比较,每一行必须都满足条件。

3)嵌套子查询

在通常的子查询中,子查询是以嵌套的方式写在父查询的WHERE、HAVING、FROM子句中
写法

SELECT empno,ename,sal
FROM emp e ,(SELECT deptno,avg(sal) avgsal FROM emp GROUP BY deptno) d
WHERE e.deptno =d.deptno
AND e.sal >d.avgsal;
4)相关子查询

当子查询中引用了父查询表中的一个列时,Oracle服务器执行相关子查询。
•在WHERE子句中使用相关子查询;
•在SELECT子句中使用相关子查询;

例:查询至少调过2次岗位的员工编号,姓名,岗位
相关子查询 SELECT e.empno, ename, e.job FROM emp e WHERE 2 <= (SELECT COUNT(*) FROM emp_jobhistory WHERE empno = e.empno);

相关子查询还可使用EXISTS和 NOT EXISTS操作符来进行操作

例:查询哪些人是经理?
SELECT ename , job, sal, deptno FROM emp e WHERE EXISTS (SELECT '1' FROM emp WHERE mgr= e.empno);

7.层次查询

SELECT [LEVEL], column, expr...
FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)]

– LEVEL:节点的层次,伪列,由查询的起点开始算起为1,依次类推。
– START WITH:指定层次的根行 (起点)。这个子句对于一个正确的分级查询是必须的。
– CONNECT BY PRIOR:指定存在父与子行的关系列。对于分级查询该子句是
必须的。

从顶向下遍历,用EMP 表
... CONNECT BY PRIOR empno = mgr
用LEVEL 伪列将行分等级
SELECT LEVEL,EMPNO,ENAME,JOB,MGR FROM EMP START WITH ENAME='KING' CONNECT BY PRIOR EMPNO=MGR
1   7839    KING    PRESIDENT   
2   7566    JONES   MANAGER 7839
3   7788    SCOTT   ANALYST 7566
4   7876    ADAMS   CLERK   7788
3   7902    FORD    ANALYST 7566
4   7369    SMITH   CLERK   7902
2   7698    BLAKE   MANAGER 7839
3   7499    ALLEN   SALESMAN    7698
3   7521    WARD    SALESMAN    7698
3   7654    MARTIN  SALESMAN    7698

8.分页


SELECT b.*
FROM (SELECT ROWNUM rn,[列名1,列名2,....列名n]
FROM 表名1,[表名2,...表名n]
[WHERE 条件表达式]) b
WHERE rn <=目标页数*每页记录数and rn > (目标页数-1)*每页记录数

9.集合运算


1)联合运算UNION

返回由任一查询结果集包含的行,并且去除重复行,并且按照查询结果集的第一列升序排序

2)完全联合运算 UNION ALL

返回由任一查询结果集包含的行,并且包含重复行,默认情况下不对结果集进行排

3)相交 INTERSECT

返回多个查询结果集的公有行。

4)相减 MINUS

返回第一个查询中存在而第二个查询中不存在的行记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值