SQL开发知识:oracle中where 子句和having子句中的区别介绍
Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句。下面分别说明其用法和异同点。
注:本文使用字段为oracle数据库中默认用户scott下面的emp表,sal代表员工工资,deptno代表部门编号。
一、聚合函数
说明前我们先了解下聚合函数:聚合函数有时候也叫统计函数,它们的作用通常是对一组数据的统计,比如说求最大值,最小值,总数,平均值(
MAX,MIN,COUNT, AVG)等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。简单举个例子:SELECT SUM(sal) FROM emp,这里的SUM作用是统计emp表中sal(工资)字段的总和,结果就是该查询只返回一个结果,即工资总和。通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
二、where子句
where自居仅仅用于从from子句中返回的值,from子句返回的每一行数据都会用where子句中的条件进行判断筛选。where子句中允许使用比较运算符( , , =, =, ,!=|等)和逻辑运算符(and,or,not)。由于大家对where子句都比较熟悉,在此不在赘述。
三、having子句
having子句通常是与order by 子句一起使用的。因为having的作用是对使用group by进行分组统计后的结果进行进一步的筛选。举个例子:现在需要找到部门工资总和大于10000的部门编号?
第一步:
select deptno,sum(sal) from emp group by deptno;
筛选结果如下:
DEPTNO SUM(SAL)
-
30 9400
20 10875
10 8750
可以看出我们想要的结果了。不过现在我们如果想要部门工资总和大于10000的呢?那么想到了对分组统计结果进行筛选的having来帮我们完成。
第二步:
select deptno,sum(sal) from emp group by deptno having sum(sal) 10000;
筛选结果如下:
DEPTNO SUM(SAL)
-
20 10875
当然这个结果正是我们想要的。
四、下面我们通过where子句和having子句的对比,更进一步的理解它们。
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行,简单的理解为只有有了统计结果后我才能执行筛选啊。where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count),因为它是一句一句筛选的。HAVING子句可以让我们筛选成组后的对各组数据筛选。,而WHERE子句在聚合前先筛选记录。如:现在我们想要部门号不等于10的部门并且工资总和大于8000的部门编号?
我们这样分析:通过where子句筛选出部门编号不为10的部门,然后在对部门工资进行统计,然后再使用having子句对统计结果进行筛选。
select deptno,sum(sal) from emp
where deptno!= 10 group by deptno
having sum(sal) 8000;
筛选结果如下:
DEPTNO SUM(SAL)
-
30 9400
20 10875
不做太多解释了,这个简单的小例子能够很好的说明where和having的作用。
五、异同点
它们的相似之处就是定义搜索条件,不同之处是where子句为单个筛选而having子句与组有关,而不是与单个的行有关。
最后:理解having子句和where子句最好的方法就是基础select语句中的那些句子的处理次序:where子句只能接收from子句输出的数据,而having子句则可以接受来自group by,where或者from子句的输入。
以上所述是小编给大家介绍的SQL开发知识:oracle中where 子句和having子句中的区别介绍,大家如有疑问可以留言,或者联系站长。感谢亲们支持!!!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 SQL开发知识:oracle中where 子句和having子句中的区别介绍
相关文章
- SQL开发知识:Sql中存储过程的定义、修改和删除操作
- Oracle ADF:快速应用开发深耕利器(oracle的ADF)
- 开发效率的提升:Oracle应用实战(oracle应用实例)
- PL/SQL程序设计:开启Oracle开发之旅(oracleplsql)
- 灵活运用 Oracle 触发器类型实现高效动态管理(oracle触发器类型)
- Oracle 数据更新教程:一步步实现单列数据更新(oracle更新一列数据)
- 使用Oracle表的别名简化SQL查询操作(oracle表别名)
- 字符串Oracle SQL中如何判断字符串(oracle sql判断)
- Oracle 强制终止 SQL 查询操作,如何应对?(oracle终止查询)
- Oracle分区索引创建实战(oracle分区索引创建)
- Oracle 数据库完美掌控企业数据(2 数据库 oracle)
- 深入了解Oracle数据库Deref功能(deref oracle)
- 探究数据库之精髓什么是Oracle OCR(oracle什么是ocr)
- 挖掘Oracle信息精通SQL语法(oracle信语法)
- Oracle中保留数字字母的方法探究(oracle保留数字字母)
- 探索Oracle数据库中的序列特性(oracle中有哪些序列)
- Oracle中文编码设置一次轻松精彩的体验(oracle中文编码设置)
- Oracle中循环处理更快更有效(oracle中循环快吗)
- Oracle Valut保护企业终端数据安全(oracle valut)
- Oracle SQL掌握除法的精髓(oracle sql除法)
- Oracle IN一种SQL语句查询的高效方式(oracle in的定义)