Oracle数据库的高级查询(基础部分)

虽然标题写的是Oralce数据库,但对于SQL语句,是大同小异的,因此其他数据库也可以参照下面的逻辑。每个程序员都知道,在项目中,在增删改查中用得最多的,最复杂的还是查询功能。各种查询,各种检索,项目中的查询条件因客户需求而改变。在这里,我介绍几种比较常见的高级查询。所谓高级查询就是除select * from user; 这样的以外的查询了。

在以下的实例中,我针对一个员工表(EMP)来查询,员工工资字段为(SAL),员工号(EMPNO)

1.查询员工平均工资(这里介绍三种方法)

<span style="white-space:pre"></span>SELECT AVG(SAL) FROM EMP;<span style="white-space:pre"></span>SELECT SUM(SAL)/COUNT(*) FROM EMP;<span style="white-space:pre"></span>SELECT SUM(SAL)/COUNT(SAL) FROM EMP;2.查询员工工资总和

<span style="white-space:pre"></span>SELECT SUM(SAL) FROM EMP;3.查询员工最高工资

<span style="white-space:pre"></span>SELECT MAX(SAL) FROM EMP;4.查询员工最底工资

<span style="white-space:pre"></span>SELECT MIN(SAL) FROM EMP;5.查询员工表中有多少条记录

<span style="white-space:pre"></span>SELECT COUNT(*) FROM EMP;6.查询员工表中所有的员工号(得到的结果和上面第5个事例是一样的)<span style="white-space:pre"></span>SELECT COUNT(EMPNO) FROM EMP;7.查询员工表中所有的员工号(去除重复的员工号,注:因为有时候我们查出来的数据是有重复的,而我们又不需要这些重复数据时,就可以使用下面的DISTINCT语句)<span style="white-space:pre"></span>SELECT COUNT(DISTINCT EMPNO) FROM MEP;8.分组函数非空判断(NVL)上面第1条查询平均工资时,如果有人的工资是空的,也就是没有工资值,那三种方法中的第一第三查询方法就有问题,他把工资空值的员工去除了,这是不合常理的,因为没有工资的员工,他也是公司员工。因此求公司员工平均工资时,也要把空值算进去才行。我解释一下下面的语句,COUNT()自然是算个数了,而NVL(SAL,0) 这的意思是:如果SAL为空,那我们就取第二个值,也就是0,如果不为空,我们就取SAL本来的值,这样工资为空的员工就赋予一个0值给他,得到的结果就是SELECT COUNT(*) FROM EMP;是等同的。当然,如果你的需求是计算有工资的员工人数,那就不用判断非空问题了。

<span style="white-space:pre"></span>SELECT COUNT(NVL(SAL,0)) FROM EMP;9.WHERE与HAVING的区别(他们都是条件查询,唯一不同的就是,WHERE里的条件是不可以是函数或是分组函数,反之,HAVING就可以更加实用了,接下来我们来一个实例,求出员工工资平均工资大于3000的人数);GROUP BY为分组 DEPTNO为员工字段部门编号

<span style="white-space:pre"></span>SELECT COUNT(*) FROM EMP WHERE AVG(SAL) > 3000 <span style="font-family: Arial, Helvetica, sans-serif;">GROUP BY DEPTNO</span><span style="font-family: Arial, Helvetica, sans-serif;">;//这样写是错误的,语句不通,会报错,WHERE条件里有函数存在,</span><span style="white-space:pre"></span>SELECT COUNT(*) FROM EMP <span style="font-family: Arial, Helvetica, sans-serif;">GROUP BY DEPTNO</span><span style="font-family: Arial, Helvetica, sans-serif;"> HAVING AVG(SAL) > 3000;//使用HAVING就可以正确执行并得到我们所要的结果了。</span>9.1按下面的语句中,都可以得到我们想要的结果,那我们是使用哪一种条件查询呢,从SQL优化的角度来说,尽量使用WHERE语句,因为他们的执行顺序不同,WHERE是先过滤再分组,这样查询速度也更快,而HAVING正好相反,是先分组后过滤,这样分组是很庞大的,然后再一一过滤。WHERE使得分组记录数大大降低,,从而提高SQL执行效率。这就是为什么我们熟悉WHERE条件查询,却对HAVING不怎么常用的道理了。

<span style="white-space:pre"></span>SELECT COUNT(*) FROM EMP WHERE SAL > 3000 GROUP BY DEPTNO; 和 SELECT COUNT(*) FROM EMP GROUP BY DEPTON HAVING SAL > 3000; // 这两条查询都是正常的10.排序 ORDER BY

<span style="white-space:pre"></span>SELECT * FROM EMP WHERE 1=1 ORDER BY SAL DESC // 按员工工资降序排序11.分组函数的嵌套查询(查询平均工资的最大值)

<span style="white-space:pre"></span>SELECT MAX(AVG(SAL)) FROM EMP GROUP BY DEPTNO;

版权声明:本文为博主原创文章,未经博主允许不得转载。

在乎的是看风景的心情,旅行不会因为美丽的风景终止。

Oracle数据库的高级查询(基础部分)

相关文章:

你感兴趣的文章:

标签云: