2018-06-27 第五十二天 oracle

简介: 一、相关子查询 --1:查询本部门的最高工资的员工的信息 --查询10部门的最高工资的员工的信息 --10部门的最高工资 select max(sal) from emp where deptno=10 select * from emp where deptno=10 and sal=(sele.

一、相关子查询

--1:查询本部门的最高工资的员工的信息

--查询10部门的最高工资的员工的信息

--10部门的最高工资

select max(sal) from emp where deptno=10

select * from emp where deptno=10 and sal=(select max(sal) from emp where deptno=10)

select * from emp where deptno=20 and sal=(select max(sal) from emp where deptno=20)

select * from emp where deptno=30 and sal=(select max(sal) from emp where deptno=30)

select * from emp where deptno=40 and sal=(select max(sal) from emp where deptno=40)

 

select * from emp e where  sal=(select max(sal) from emp where deptno=e.deptno)

 

--2:查询工资高于其所在部门的平均工资的员工的信息

--查询工资高于10部门的平均工资的10部门员工的信息

--10部门的平均工资

select avg(sal) from emp where deptno=10

select * from emp where deptno=10 and sal > (select avg(sal) from emp where deptno=10)--1

select * from emp where deptno=20 and sal > (select avg(sal) from emp where deptno=20)--3

select * from emp where deptno=30 and sal > (select avg(sal) from emp where deptno=30)--2

select * from emp where deptno=40 and sal > (select avg(sal) from emp where deptno=40)--0

 

select e.*,(select avg(sal) from emp where deptno = e.deptno)平均工资

from emp e

where sal>(select avg(sal) from emp where deptno = e.deptno)

 

--3:查询本部门的最高工资的员工的信息

-- 使用不相关的子查询实现

--把所有部门的最高的工资求出

select deptno,max(sal) from emp group by deptno

select deptno,sal from emp

 

select * from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno)

 

二、练习

-- 1 、列出所有员工的年工资,按年薪从低到高排序。

select ename, sal*12+nvl(comm,0)*12 year_sal from emp order by year_sal

 

-- 2 、列出薪金比 SMITH 多的所有员工。

select * from emp where sal>(select sal from emp where ename='SMITH')

 

-- 3 、列出所有员工的姓名及其直接上级的姓名。 sql92 , sql99

--sql92

select e1.ename,e2.ename

from emp e1, emp e2

where e1.mgr= e2.empno

--sql99

select e1.ename,e2.ename

from emp e1 join emp e2

on e1.mgr= e2.empno

 

-- 4 、列出受雇日期早于其直接上级的所有员工。

--sql99

select e1.*

from emp e1 join emp e2

on e1.mgr=e2.empno

where e1.hiredate < e2.hiredate

 

-- 5 、列出部门名称和这些部门的员工信息,包括那些没有员工的部门。

select d.dname,e.*

from emp e right join dept d

on e.deptno=d.deptno

 

-- 6 、列出所有job  CLERK (办事员)的姓名及其部门名称。

select e.ename,d.dname

from emp e join dept d

Using(deptno)

where e.job='CLERK'

 

-- 7 、列出最低薪金大于1500 的各种工作。

select job, min(sal)

from emp

group by job

having min(sal) > 1500

 

-- 8 、列出在部门 SALES (销售部)工作的员工的姓名,假定不知道销售部的部门编号。 

select e.deptno,e.ename

from emp e join dept d

on e.deptno=d.deptno

where d.dname='SALES'

 

-- 9 、列出薪金高于公司平均薪金的所有员工。

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

 

-- 10 、列出与 SCOTT 从事相同工作的所有员工。

select * from emp where job=(select job from emp where ename='SCOTT') and ename<>'SCOTT'

 

-- 11 、列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金。

select ename,sal from emp where sal>all(select sal from emp where deptno=30)

 

-- 12 、列出在每个部门工作的员工数量、平均工资和平均服务期限(年)。

select deptno, count(*), avg(sal) , avg(to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY')) 平均服务年限

from emp

group by deptno

 

-- 13 、列出所有员工的姓名、部门名称和工资。

select e.ename,d.dname,e.sal

from emp e natural join dept d

 

-- 14 、列出从事同一种工作但属于不同部门的员工的一种组合。

select e1.ename,e1.job ,e1.deptno,e2.ename,e2.job,e2.deptno

from emp e1 join emp e2

on e1.job=e2.job and e1.deptno<>e2.deptno and e1.ename >e2.ename

 

-- 15 、列出所有部门的详细信息和部门人数。

select d.*, count(*)

from emp e join dept d

on e.deptno=d.deptno

group by d.deptno,d.dname,d.loc

 

select d.*,count(e.ename) from dept d left join emp e

on d.deptno = e.deptno 

group by d.deptno,d.dname,d.loc

 

-- 16 、列出各种工作的最低工资。

select job,min(sal)

from emp

group by job

 

-- 17 、列出各个部门的 MANAGER (经理)的最低薪金。

select deptno,min(sal)

from emp

where job='MANAGER'

group by deptno

 

-- 18 、列出至少有一个员工的所有部门。

select d.*,count(*)

from emp e join dept d

on e.deptno=d.deptno

group by d.deptno,d.dname,d.loc

having count(*)>0

 

-- 19 、人数最多部门的信息

--1

select *

from dept d

where deptno = (select deptno

from (select deptno,count(deptno) count_dept from emp group by deptno) 

where count_dept = (select max(count_dept) from (select deptno,count(deptno) count_dept from empgroup by deptno)))

 

--2

select *

from dept d

where deptno = (select deptno from emp group by deptno having (count(*) >= 

all(select count(deptno) from emp group by deptno)))

 


目录
相关文章
|
6月前
|
Oracle 关系型数据库 MySQL
【已解决】oracle获取最近2学年的数据
【已解决】oracle获取最近2学年的数据
70 1
|
关系型数据库 数据库 Oracle
|
SQL 关系型数据库 Oracle
|
SQL Oracle 关系型数据库
|
SQL 关系型数据库 Java
|
SQL Oracle 关系型数据库
oracle培训第四天
1.DML操作及名称空间 模式与对象名称空间的关系 模式(schema)是一种逻辑结构,它对应于用户,每建一个用户就有一套模式与之对应。
1052 0
|
存储 监控 Oracle
oracle培训第五天
1.oracle体系架构 实例和数据库 oracle server :database + instance database :data file ,control file...
945 0
|
Oracle 关系型数据库 索引
oracle培训第三天
1.约束 约束是数据库能够实现业务规则以及保证数据遵循ER模型的一种手段。 约束的语法 列级约束:只能引用一个列,表中可以有多个列级约束 表级约束:引用一个或多个列,通常用来定义主键 追加...
733 0