oracle入门之对表数据查询(二)

oracle表复杂查询

在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家介绍较为复杂的select语句

数据分组-max,min,avg,sum,count

如何显示所有员工中最高工资和最低工资

SQL>select max(sal) "最高工资",min(sal) "最低工资" from emp;

请查询最高年工资

SQL>select max(sal*13+nvl(comm,0)*13) "最高年工资",min(sal*13+nvl(comm,0)*13) "最低年工资" from emp;

显示所有员工的平均工资和工资总和

SQL>select avg(sal) "平均工资",sum(sal) "工资总和" from emp;

特别注意:avg(sal)不会把sal为null的行进行统计,因此我们要注意,如果,你希望为空值也考虑,则我们可以这样做

SQL>selec sum(sal)/count(*) from emp;

计算共有多少员工

SQL>select count(*) "共有员工" from emp;

扩展要求:

请显示工资最高的员工的名字,工作岗位

SQL>select ename,job from emp where sal=(select max(sal) from emp);

特别注意:select语句执行的顺序是从右向左执行,正好和书写的方式相反。

SQL>select ename,job from emp where sal=(select max(sal) from emp);

oracle会先执行select max(sal) from emp这个语句,得出最大工资后。再执行where条件前的语句。

请显示工资高于平均工资的员工信息

SQL>select * from emp where sal>(select avg(sal) from emp);

SQL>select * from emp where sal>(select sum(sal)/count(*) from emp);

oracle表复杂查询

group by和having子句

group by用于对查询的结果分组统计;

having子句用于限制(过滤)分组显示结果。

如何显示每个部门的平均工资和最高工资

SQL>select avg(sal) "平均工资",max(sal) "最高工资",deptno "部门编号" from emp group by deptno;

显示每个部门的每种岗位的平均工资和最低工资

SQL>select avg(sal) "平均工资",min(sal) "最低工资",job "职位",deptno "部门编号" from emp group by deptno,job order by deptno;

显示部门平均工资低于2000的部门号和它的平均工资

SQL>select avg(sal) "平均工资",deptno "部门编号" from emp group by deptno having avg(sal)<2000;

对数据分组的总结:

1、分组函数(avg...)只能出现在选择列表、having、order by子句中;

2、如果在select语句中同时包含有group by/having/order by那么他们的顺序是group by/having/order by;

3、在选择列中如果有列、表达式和分组函数,那么这些列和表达式必需有一个出现在group by子句中,否则会出错。

如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;

这里deptno就一定要出现在group by 中。

oracle表复杂查询--多表查询

说明:

多表查询是指基于两个和两个以上的表或是视图的查询,在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp表)

显示雇员名,雇员工资及所在的部门的名字[笛卡尔集]

规定:多表查询的条件是至少不能少于表的个数-1

注意:笛卡尔集,在多表查询的时候,如果不带任何条件,则会出现笛卡尔集,避免笛卡尔集多表查询的条件是,至少不能少于表的个数-1

SQL>select e.ename,e.sal,d.dname from emp e,dept d where d.deptno=e.deptno;

如何显示部门为10的部门名、员工名和工资

SQL>select d.dname,e.ename,e.sal,e.deptno from emp e,dept d where d.deptno=e.deptno and e.deptno=10;

显示各个员工的姓名、工资及其工资的级别

SQL>select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;

注意:在多表查询时,不同的表中列名相同时要加表名,不同时可不加。(为增强可读性,建议都加表名或别名)

扩展要求:

显示雇员名,雇员工资及所在部门的名字,并按部门排序。

SQL>select e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno order by d.dname;

oracle表复杂查询--多表查询

自连接

自连接是指在同一张表的连接查询

显示员工的上级领导的姓名

SQL>select e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;

比如显示'FORD'的上级

SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e1.mgr=e2.empno and e1.ename='FORD';

扩展要求:

显示各员工的姓名和他的上级领导姓名

SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e1.mgr=e2.empno;

疑惑:这里我们看到king没有显示,因为king没有上级。如果我们希望把没有上级的员工也显示出来,则需要使用到外连接。外连接包括左外连接和右外连接。此处提到外连接,后面会详细讲解。

左外连接:select 列名,.. from 表名1 left join 表名2 on 条件;

SQL>select e1.ename "员工姓名",e2.ename "直接上级领导" from emp e1 left join emp e2 on e1.mgr=e2.empno;

或者使用(+)在右边也可以实现左外连接。

SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e1.mgr=e2.empno(+);

右外连接:select 列名,.. from 表名1 right join 表名2 on 条件;

SQL>select e1.ename "员工姓名",e2.ename "直接上级领导" from emp e2 right join emp e1 on e1.mgr=e2.empno;

或者使用(+)在左边也可以实现右外连接。

SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e2.empno(+)=e1.mgr;

左外连接和右外连接在这里提到,后面会详细讲解。

上一篇:高并发数据库之MySql性能优化


下一篇:了解ip相关知识