oracle-having条件过滤与where条件过滤

本文详细解释了SQL中HAVING子句与WHERE子句的区别,包括它们如何对数据进行过滤及何时使用。通过实例展示了在分组查询中,当需要使用聚合函数进行条件判断时,HAVING子句的应用。

HAVING 与 WHERE 类似,可用来决定选择哪个记录。

在使用 GROUP BY对这些记录分组后,HAVING 会决定应显示的记录,

不同的是where对分组前的结果集条件过滤,而having对分组后的结果集过滤;

having何以跟聚合函数,而where则不能。

  现在举个例子:

范例:要求显示平均工资大于2000的部门编号和平均工资

Select deptno,avg(sal) from emp where avg(sal)>2000 group by deptno;

出现错误,where语句中不允许使用分组函数,使用having解决

Select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

 

### Oracle 查询中的多条件过滤Oracle 数据库中,`AND` 和 `OR` 是逻辑运算符,用于组合多个条件以构建复杂的查询。以下是关于如何使用它们以及分组条件的相关说明。 #### 1. 使用 AND 组合条件 当需要同时满足多个条件时,可以使用 `AND` 运算符。它会返回那些满足所有指定条件的记录。例如: ```sql SELECT * FROM emp WHERE deptno = 10 AND sal > 2000; ``` 上述 SQL 语句表示从 `emp` 表中查找部门编号为 10 并且薪资大于 2000 的员工信息[^1]。 #### 2. 使用 OR 组合条件 如果希望只要满足任意一个条件即可,则可以使用 `OR` 运算符。这将返回至少满足其中一个条件的所有记录。例如: ```sql SELECT * FROM emp WHERE deptno = 10 OR sal > 2000; ``` 此查询将会获取属于部门 10 或者薪资超过 2000 的所有员工的信息。 #### 3. 结合 AND 和 OR 有时可能需要混合使用 `AND` 和 `OR` 来创建更复杂的选择标准。为了确保逻辑表达式的正确解析,通常建议使用括号明确优先级。例如: ```sql SELECT * FROM emp WHERE (deptno = 10 OR deptno = 20) AND sal > 2000; ``` 这段代码的意思是从 `emp` 表里选出既隶属于部门 10 或者 20 同时薪水又高于 2000 的雇员资料。 #### 4. 利用 IN 关键字简化多值匹配 对于涉及多个离散数值的情况,可以用 `IN` 替代一系列重复的 `OR` 操作。比如要找出工资等于特定几个金额之一的职员,可写成这样: ```sql SELECT * FROM emp WHERE sal IN (1000, 3000); ``` 这种方法不仅使书写更加简洁明了,而且性能表现也往往优于单独罗列许多次比较操作[^3]。 #### 5. 分组聚合函数配合条件筛选 除了基本字段上的简单对比外,在实际应用当中还经常遇到基于某些统计指标再做进一步限定的需求场景。这时就需要借助 GROUP BY 子句加上 HAVING 子句共同作用来达成目标。举个例子来说吧,假设想看各个不同职位类别下平均薪酬水平达到一定高度以上的具体分布状况的话,那么就可以按照下面这种方式编写相应的SQL脚本: ```sql SELECT job, AVG(sal) AS avg_salary FROM emp GROUP BY job HAVING AVG(sal) >= 2500; ``` 在这里面我们先是按职业种类进行了分类汇总计算每种工作的人员数量及其对应的均薪情况;然后再利用 having部分设定阈值只保留那些整体收入水准较高的岗位群体作为最终输出结果的一部分呈现出来给使用者查看。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值