oracle表连接查询逗号隔开_Oracle表连接与子查询示例

本文通过一系列Oracle SQL查询示例,涵盖了表连接、子查询、分组统计、排序及条件过滤等操作,如部门平均薪资排名、员工与经理关系、薪水分段统计等,旨在提升对Oracle数据库高级查询的理解和应用。
摘要由CSDN通过智能技术生成

--把雇员按部门分组, 求最高薪水, 部门号, 过滤掉名字中第二个字母是'A'的, 要求分组后的平均薪水

>1500, 按照部门编号倒序排列

--求每个人的名字和他的经理人的名字,用外连接把KING也取出来

--哪些人的薪水在部门的平均薪水之上

--求部门中哪些人的薪水最高

--求部门平均薪水的等级

--求部门平均的薪水等级

--雇员中有哪些人是经理人

--不准用组函数,求薪水的最高值(面试题)

--求平均薪水最高的部门的部门编号

--求平均薪水最高的部门的部门名称

--求平均薪水的等级最低的部门的部门名称

--求部门经理人中平均薪水最低的部门名称 (思考题)

--求比普通员工的最高薪水还要高的经理人名称

--求薪水最高的前5名雇员

--求薪水最高的第6到第10名雇员(重点掌握)

--练习: 求最后入职的5名员工

--求每个部门中薪水最高的前两名雇员

--面试题: 比较效率

--求分段显示薪水的个数

如:

scale  total

<800  0

800-1000 2

1001-2000 3

2001-5000 6

>5000  8

或者显示成为

800-1000 1001-2000 2000-5000

2  3  6

或者显示成为

DEPTNO   800-2000  2001-5000

------ ---------- ----------

30          5          1

20          2          3

10          1          2

--

========================第一份答案=======================

--把雇员按部门分组, 求最高薪水, 部门号, 过滤掉名字中第二个字母是'A'的,

要求分组后的平均薪水>1500, 按照部门编号倒序排列

selecte1.ename, e2.ename

fromemp e1leftjoinemp e2on(e1.mgr = e2.empno)

--哪些人的薪水在部门的平均薪水之上

selectename, sal

fromempjoin

(selectdeptno,max(sal) max_sal

fromemp

groupbydeptno) t

on(emp.deptno = t.deptnoandemp.sal = t.max_sal)

--求部门平均薪水的等级

selectdeptno, avg_sal, grade

fromsalgrade sjoin

(selectdeptno,avg(sal) avg_sal

fromemp

groupbydeptno) t

on(t.avg_salbetweens.losalands.hisal) sql 代码

--求部门平均的薪水等级

selectenamefromempwhereempnoin(selectdistinctmgrfromemp)

--不准用组函数,求薪水的最高值(面试题)

sql 代码

selectenamefromempwhereempnonotin

(selectdistincte1.empnofromemp e1joinemp e2on(e1.sal 

排序,取第一个

--求平均薪水最高的部门的部门编号

selectdeptnofrom

(selectdeptno,avg(sal) avg_salfromempgroupbydeptno) t

whereavg_sal =

(selectmax(avg_sal)from

(selectdeptno,avg(sal) avg_salfromempgroupbydeptno) t)

selectmax(avg(sal))fromempgroupbydeptno --组函数嵌套

--求平均薪水最高的部门的部门名称

selectdnamefromdeptwheredeptno =

(selectdeptnofrom

(selectdeptno,avg(sal) avg_salfromempgroupbydeptno) t

whereavg_sal =

(selectmax(avg_sal)from

(selectdeptno,avg(sal) avg_salfromempgroupbydeptno) t)

)

--求平均薪水的等级最低的部门的部门名称

selectdept.deptno,dnamefrom

(

selectdeptno, avg_sal, gradefromsalgrade sjoin

(selectdeptno,avg(sal) avg_salfromempgroupbydeptno) t

on(t.avg_salbetweens.losalands.hisal)

) t1joindepton

(t1.deptno = dept.deptno)

wheregrade =

(selectmin(grade)from

(

selectdeptno, avg_sal, gradefromsalgrade sjoin

(selectdeptno,avg(sal) avg_salfromempgroupbydeptno) t

on(t.avg_salbetweens.losalands.hisal)

)

)

reateviewv$_dept_infoas

selectdeptno, avg_sal, gradefromsalgrade sjoin

(selectdeptno,avg(sal) avg_salfromempgroupbydeptno) t

on(t.avg_salbetweens.losalands.hisal)

elect deptnofromv$_dept_infowheregrade = (selectmin(grade)fromv$_dept_info);

--求部门经理人中平均薪水最低的部门名称 (思考题)

//....

--求比普通员工的最高薪水还要高的经理人名称

sql 代码

selectempno, ename, salfromempwheresal >

(

selectmax(sal)from

(selectempno,ename, sal

fromempwhereempnonotin(selectdistinctnvl(mgr, -1)fromemp ))

)andempnoin(selectdistinctmgrfromemp)

selectdistinctmgrfromempwheremgrisnotnull

--求薪水最高的前5名雇员

--求薪水最高的第6到第10名雇员(重点掌握)

selectename, salfrom

(

selectename, sal, rownum rfrom

(

selectename, salfromemporderbysaldesc

)

whererownum <=10

)

wherer > 5andr <= 10

--求每个部门中薪水最高的前两名雇员

selectdeptno, ename, salfromemporderbydeptno, saldesc

selectdeptno, ename, sal , rownum rfrom

(selectdeptno, ename, salfromemporderbydeptno, saldesc);

createviewvasselectdeptno, ename, sal , rownum rfrom

(selectdeptno, ename, salfromemporderbydeptno, saldesc);

selectdeptno,min(r) min_rfromvgroupbydeptno;

selectv.deptno, ename, sal , rfromvjoin

(

selectdeptno,min(r) min_rfromvgroupbydeptno

) t

on(v.deptno = t.deptnoandv.r >= t.min_randv.r <= t.min_r + 1)

orderbyv.deptno, saldesc;

--练习: 求最后入职的5名员工

selectename, hiredatefrom

(

selectename ,hiredatefromemporderbyhiredatedesc

)

whererownum <= 5

--面试题: 比较效率

select*fromempwheredeptno = 10andenamelike'%A%';--这种是最高的

select*fromempwhereenamelike'%A%'anddeptno = 10;

--求分段显示薪水的个数

如:

scale      total

<800  0

801-1000 2

1001-2000 3

2001-5000 6

>5000  8

select'<800'asscale ,count(*)astotalfromempwheresal 

union

select'800-1000'asscale ,count(*)astotalfromempwheresalbetween800and1000

union

select'2000-5000'asscale ,count(*)astotalfromempwheresalbetween2000and5000;

...

或者显示成为

800-1000 1001-2000 2000-5000

2  3  6

sql 代码

select*from

(selectcount(*)as"800-1000"fromempwheresalbetween800and1000 )

,

(selectcount(*)as"1001-2000"fromempwheresalbetween1001and2000 );

...

或者显示成为

DEPTNO   800-2000  2001-5000

------ ---------- ----------

30          5          1

20          2          3

10          1          2

sql 代码

selectt1.deptno,"800-2000","2001-5000"from

(

selectdeptno ,count(*)as"800-2000"fromempwheresalbetween800and2000

groupbydeptno

) t1

join

(

selectdeptno ,count(*)as"2001-5000"fromempwheresalbetween2001and5000

groupbydeptno

) t2

on

t1.deptno = t2.deptno

selectename, sal

from

(selectename, salfromemporderbysaldesc)

whererownum <=5;

sql 代码

selectdeptno,avg(grade)from

(selectdeptno, sal , grade

fromemp ejoinsalgrade son

(e.salbetweens.losalands.hisal)

) t

groupbydeptno

--雇员中有哪些人是经理人

sql 代码

selectename, sal

fromempjoin

(selectdeptno,avg(sal) avg_sal

fromemp

groupbydeptno) t

on(emp.deptno = t.deptnoandemp.sal > t.avg_sal)

--求部门中哪些人的薪水最高

sql 代码

selectmax(sal), deptnofromemp

whereenamenotlike'_A%'

groupbydeptno

havingavg(sal) > 1500

orderbydeptnodesc;

--求每个人的名字和他的经理人的名字,用外连接把KING也取出来

sql 代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值