Oracle 查询03

本文围绕Oracle数据库展开,介绍了HAVING子句,它用于对分组统计函数结果过滤,并说明了其执行顺序。还讲解了多种子查询,如WHERE、FROM、HAVING、EXISTS子查询,分别用于作为判断条件、数据来源等。此外,介绍了ROWNUM伪列,它在查询中动态生成且从1开始。

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

HAVING 子句

HAVING 子句是对分组统计函数的结果进行过滤的子句

格式

SELECT *

​ FROM 数据源,数据源…

​ WHERE 条件判断语句

​ GROUP BY 需要分组的字段

​ HAVING 对统计函数进行筛选

​ ORDER BY 排序的字段 排序的方式


执行顺序:第一步执行:FROM 子句。

​ 第二步执行:WHERE子句。

​ 第三步执行:GROUP BY子句。

​ 第四步执行:HAVING 子句。

​ 第五步执行:SELECT 子句 。

​ 第六步执行:ORDER BY 子句

延用上次的例子:查询出平均薪资大与2000的职位以及名称

子查询

子查询就是将一个查询的结果当作另一个查询的数据来源或判断条件,常见的子查询有,WHERE子查询,FROM子查询,SELECT子查询,HAVING子查询,EXISTS子查询。子查询都需要用小括号括起来。

WHERE子查询

将一个查询的结果当作另一个查询的判断条件

列如:查询出薪资比经理职位中最高薪资低的员工信息

第一步现查询出经理职位中薪资最高的

SELECT MAX(sal)
	FROM emp 
	 GROUP BY job
	  HAVING job = 'MANAGER';

然后再把第一步查询的结果作为判断条件

SELECT *
	FROM emp 
	 WHERE sal <(
         		SELECT MAX(sal)
					FROM emp 
					 GROUP BY job
					  HAVING job = 'MANAGER');

在这里插入图片描述

FROM 子查询

将一个查询的结果当作另一个查询的数据来源

例如:查询各部门工资大以该部门平均工资的员工信息

SELECT *
	FROM emp e INNER JOIN (
        				SELECT deptno, AVG(sal) avgsal
							FROM emp 
							 GROUP BY deptno) temp ON e.deptno = temp.deptno
	 WHERE e.sal > temp.avgsal;

在这里插入图片描述

HAVING 子查询

HAVING 子查询是对分组统计函数进行过滤的子句

例如:查询出平均薪资高于所有员工平均薪资的职位名称,以及职位的人数,这些高于平均工资的职位的平均工资。


SELECT job ,COUNT(*),AVG(sal)
	FROM emp 
	 GROUP BY job
	   HAVING AVG(sal)>(
					SELECT AVG(sal) avgsal
						 FROM emp);	

在这里插入图片描述

EXISTS子查询

EXISTS子查询的特征:将主查询中的数据带到子查询中验证,如果验证成功则子查询返回true,当主查询接收到true的时候被验证的数据就会显示,如果子查询中验证失败则返回false,当主查询接收到false的时候验证的数据就不会显示。

例如:查询出有部门的员工信息

SELECT *
	FROM emp e
	 WHERE EXISTS (
				SELECT deptno
					FROM dept d 
					 WHERE e.deptno = d.deptno
				   );

在这里插入图片描述

/*
	查询出没有部门的员工信息
	使用NOT EXISTS 的时候也是将主查询中的数据带入子查询中验证,如果验证成功返回false,主	  查询接受到false则不显示数据,反正则显示数据。
 */
SELECT *
	FROM emp e
	 WHERE NOT EXISTS (
				SELECT deptno
					FROM dept d 
					 WHERE e.deptno = d.deptno
				   );

ROWNUM 伪列

ROWNUM是在查询过程中动态的生成一个列,该列其实也很像一个字段,但是这个列不是数据表,而是在查询中动态生成的,且该列必须从1开始。

SELECT ROWNUM AS rn ,empno , ename ,job ,sal, hiredate ,mgr
	FROM emp;

在这里插入图片描述

例:显示后5条数据

SELECT *
	FROM (
    	SELECT ROWNUM AS rn ,empno , ename ,job ,sal, hiredate ,mgr
			FROM emp) temp
	 WHERE temp.rn >= 10;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值