其实Oracle并不难——这十天,跟着我一起学习数据库(第五天)
mhr18 2024-09-17 23:19 17 浏览 0 评论
/*
1.子查询:就是嵌套查询,也叫作内部查询。
就是将一个查询的结果(子查询)为另一个查询条件(主查询)。
子查询可以写在:显示列表?from子句、where子句、having子句等;
2.子查询的使用方式:
子查询要用括号括起来;
将子查询放在比较运算符的右边;
对于单行子查询要用单行运算符;
对于多行子查询要用多行运算符;
3.子查询的分类:
根据子查询返回的行数和列数:
A:单行子查询:查询结果集至多只有一行记录(一般常用分组函数或等值);
B:多行子查询:查询结果集有多行记录(与之搭配使用的操作符有(not) in,any,all)
C:单列子查询:查询结果集有一列是单列子查询;
D:多列子查询:查询结果集有多列是多列子查询;
单行单列子查询:至多有一条记录一列
与之搭配使用的操作符有 > >= < <= <> =
多行单列子查询:有多行记录显示一列;
与之搭配使用的操作符有not in any all
多行多列子查询;要求匹配条件字段列表和子查询结果集的字段列表具有一一对应关系(类似于Java函数调用时的实参和形参的关系)
要求;匹配条件字段和子查询结果集字段类型兼容、顺序一致;
匹配条件字段之间是整行匹配的关系
多行子查询
ANY:表示和子查询的任意一行结果进行比较,有一个满足条件即可。
ALL:表示和子查询的所有行结果进行比较,每一行必须都满足条件。
IN 和ANY 进行搭配使用:
> ANY---大于子查询中的任意一个值即可
等价于 > MIN()
< ANY---小于子查询中的任意一个值即可
等价于 < MAX()
= ANY---等于子查询中的任意一个值即可
等价于 IN()
IN 和ALL 进行搭配使用:
> ALL---大于子查询结果集中的所有的值即可
等价于 > MAX()
< ALL---小于子查询结果集中的所有的值即可
等价于 < MIN()
= ALL---等于子查询结果集中的所有的值即可,没有实际意义
注意:如果业务描述中出现“任意”“任一”等字样,考虑使用ANY关键字的子查询;
如果业务描述中出现“所有”“全部”等字样,考虑使用ALL关键字的子查询;
4.子查询中的空值null
子查询返回的结果中含有空值--->对于含有空值的子查询不能使用not in操作符。
因为子查询中的结果中有一条空值,这条空值导致主查询没有记录返回。
这是因为所有的条件和空值比较结果都是空值。
因此,无论什么时候只要空值有可能成为子查询结果集合中的一部分,就不能使用not in运算符。
5.在from子句中使用子查询
from子句中使用子查询作为一个查询表对象;该表不是实际存在的表,而是一个缓存;
from子句中子查询的角色就是一张表的作用;
6.ROWNUM虚拟列
ROWNUM是一个伪列,伪列是使用上类似于表中的列,而实际并没有存储在表中的特殊列;
ROWNUM的功能是在每次查询时,返回结果集的顺序号,这个顺序号是在记录输出时才一步
一步产生的,第一行为1,第二行为2,以此类推。
注意有查询结果才有ROWNUM,ROWNUM是伴随查询结果产生而产生的;而且每次都是从1开始编排;
使用ROWNUM以及子查询完成分页查询
*/
--------------子查询--------------------------
---**********单行单列子查询************--
--查询工资比Jones工资高的员工信息
--子查询--Jones的工资
SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('Jones');
--主查询
SELECT * FROM EMP E WHERE E.SAL>2975;
--嵌套主查询
SELECT * FROM EMP E WHERE E.SAL>(SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('Jones'));
--显示和雇员7369从事相同工作并且工资大于7876的雇员的姓名和工作
--子查询--雇员7369的工作
SELECT E.JOB FROM EMP E WHERE E.EMPNO=7369;
--子查询--雇员7876的工资
SELECT E.SAL FROM EMP E WHERE E.EMPNO=7876
--主查询
SELECT E.ENAME,E.JOB FROM EMP E WHERE E.JOB='CLERK' AND E.SAL>1100.00;
--嵌套主查询
SELECT E.ENAME,E.JOB FROM EMP E WHERE
UPPER(E.JOB)=(SELECT UPPER(E.JOB) FROM EMP E WHERE E.EMPNO=7369)
AND E.SAL>(SELECT E.SAL FROM EMP E WHERE E.EMPNO=7876);
--------------ppt7练习1-----------------
--1.查询入职日期最早的员工姓名,入职日期
SELECT E.ENAME,E.HIREDATE FROM EMP E WHERE E.HIREDATE=(SELECT MIN(HIREDATE) FROM EMP);
--2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称
SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH');---子查询
SELECT E.ENAME,E.SAL,D.DNAME FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO
WHERE E.SAL>(SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'))
AND D.LOC='CHICAGO';
--3.查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期
--方法2:子查询
SELECT MIN(HIREDATE) FROM EMP WHERE DEPTNO=20;---子查询
SELECT E.ENAME,E.HIREDATE FROM EMP E
WHERE E.HIREDATE<(
SELECT MIN(HIREDATE) FROM EMP WHERE DEPTNO=20);
--方法2:分组查询
SELECT E.ENAME,E.HIREDATE FROM EMP E
WHERE E.HIREDATE<(
SELECT MIN(HIREDATE) FROM EMP GROUP BY DEPTNO HAVING DEPTNO=20);
--4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
SELECT D.DEPTNO,D.DNAME,COUNT(*) DEPTEMPCOUNT FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO
GROUP BY D.DEPTNO,D.DNAME
HAVING COUNT(*)>(
SELECT (SELECT COUNT(*) FROM EMP E)/(SELECT COUNT(DISTINCT D.DEPTNO) FROM DEPT D)FROM DUAL
);
---关联(全外连接)
SELECT D.DEPTNO,D.DNAME,COUNT(*) DEPTEMPCOUNT FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO
GROUP BY D.DEPTNO,D.DNAME
HAVING COUNT(*)>(
SELECT COUNT(DISTINCT E.EMPNO)/COUNT(DISTINCT D.DEPTNO) FROM EMP E FULL JOIN DEPT D ON E.DEPTNO=D.DEPTNO
);
SELECT * FROM DEPT D;
SELECT * FROM EMP E;
---**********多行子查询************--
--查询是经理的姓名,工资
SELECT DISTINCT E.MGR FROM EMP E WHERE E.MGR IS NOT NULL;--查询经理的员工编号
SELECT E.ENAME,E.SAL FROM EMP E WHERE E.EMPNO IN(
SELECT DISTINCT E.MGR FROM EMP E WHERE E.MGR IS NOT NULL);
--=any 等价于 in
SELECT E.ENAME,E.SAL FROM EMP E WHERE E.EMPNO=ANY(
SELECT DISTINCT E.MGR FROM EMP E WHERE E.MGR IS NOT NULL);
--查询部门编号不为10,且工资比10部门任意一名员工工资高的员工编号,姓名,职位,工资。
SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E
WHERE E.DEPTNO<>10 AND E.SAL>ANY(
SELECT DISTINCT E.SAL FROM EMP E WHERE E.DEPTNO=10);
--> ANY 等价于 >min()
SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E
WHERE E.DEPTNO<>10 AND E.SAL>(
SELECT MIN(E.SAL) FROM EMP E WHERE E.DEPTNO=10);
--查询部门编号不为10,且工资比10部门所有员工工资高的员工编号,姓名,职位,工资。
SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E
WHERE E.DEPTNO<>10 AND E.SAL>ALL(
SELECT DISTINCT E.SAL FROM EMP E WHERE E.DEPTNO=10);
--> ALL 等价于 >MAX()
SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E
WHERE E.DEPTNO<>10 AND E.SAL>(
SELECT MAX(E.SAL) FROM EMP E WHERE E.DEPTNO=10);
--------------ppt7练习2-----------------
--1.查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
SELECT E.ENAME,E.HIREDATE FROM EMP E
WHERE E.DEPTNO<>10 AND E.HIREDATE>ANY(
SELECT E.HIREDATE FROM EMP E WHERE E.DEPTNO=10);
--2.查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
SELECT E.ENAME,E.HIREDATE FROM EMP E
WHERE E.DEPTNO<>10 AND E.HIREDATE>ALL(
SELECT E.HIREDATE FROM EMP E WHERE E.DEPTNO=10);
--3.查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
SELECT E.ENAME,E.JOB FROM EMP E
WHERE E.DEPTNO<>10 AND E.JOB=ANY(
SELECT E.JOB FROM EMP E WHERE E.DEPTNO=10);
--多行多列子查询;要求匹配条件字段列表和子查询结果集的字段列表具有一一对应关系
----(类似于Java函数调用时的实参和形参的关系
--查询出和1981年入职的任意一个员工的部门和职位完全相同员工姓名、部门、职位、入职日期,不包括1981年入职员工。
SELECT E.ENAME,E.DEPTNO,E.JOB,E.HIREDATE FROM EMP E
WHERE TO_CHAR(E.HIREDATE,'YYYY')<>'1981'
AND (E.DEPTNO,E.JOB)=ANY(SELECT E.DEPTNO,E.JOB FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981);
--------------不等价于----注意两者之间的区分逻辑----------------
SELECT E.ENAME,E.DEPTNO,E.JOB,E.HIREDATE FROM EMP E
WHERE TO_CHAR(E.HIREDATE,'YYYY')<>'1981'
AND (E.DEPTNO=ANY(SELECT E.DEPTNO FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981)
AND E.JOB=ANY(SELECT E.JOB FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981));
----------------------------------------------------------------
--查询出和1981年入职的任意一个员工的部门或职位相同员工姓名、部门、职位、入职日期,不包括1981年入职员工。
SELECT E.ENAME,E.DEPTNO,E.JOB,E.HIREDATE FROM EMP E
WHERE TO_CHAR(E.HIREDATE,'YYYY')<>'1981'
AND (E.DEPTNO=ANY(SELECT E.DEPTNO FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981)
OR E.JOB=ANY(SELECT E.JOB FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981));
---------子查询中控制null的处理------------
---查询不是经理的员工姓名
--使用not in的子查询注意需要对子查询结果集进行nvl()处理
SELECT * FROM EMP E WHERE E.EMPNO NOT IN(SELECT E.MGR FROM EMP E);----注意null的处理
SELECT * FROM EMP E WHERE E.EMPNO NOT IN(SELECT NVL(E.MGR,0) FROM EMP E);
---from子句中是子查询---
---查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资
---子查询:自己部门的平均工资
SELECT E.DEPTNO SELFDEPTNO,AVG(E.SAL) AVGSAL FROM EMP E GROUP BY E.DEPTNO;
---主查询:
SELECT E.ENAME,E.SAL,E.DEPTNO,S.AVGSAL
FROM EMP E,(SELECT AVG(E.SAL) AVGSAL,E.DEPTNO SELFDEPTNO FROM EMP E GROUP BY E.DEPTNO) S
WHERE E.DEPTNO=S.SELFDEPTNO AND E.SAL>S.AVGSAL ;
----分页查询
SELECT ROWNUM RN,E.* FROM EMP E;
SELECT ROWNUM RN,E.* FROM EMP E WHERE E.DEPTNO=30;
---分页显示;每页显示5条记录:要求显示EMP表中的第1-5条记录
SELECT ROWNUM RN,E.* FROM EMP E WHERE ROWNUM<=5;
---分页显示;每页显示5条记录:要求显示EMP表中的第6-10条记录(产生是在有了1-5的基础上才有6-10)
SELECT ROWNUM RN,E.* FROM EMP E WHERE ROWNUM>5 AND ROWNUM<=10;---不正确
---使用子查询进行分页显示:每页显示5条记录:要求显示EMP表中的第6-10条记录
SELECT * FROM (SELECT ROWNUM RN,E.* FROM EMP E) T WHERE T.RN>5 AND T.RN<=10;
--------------ppt7练习3-----------------
--1.查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名,职位,不包括10部门员工
SELECT E.ENAME,E.JOB FROM EMP E
WHERE (E.JOB,E.MGR)=ANY(SELECT E.JOB,E.MGR FROM EMP E WHERE E.DEPTNO=10)
AND E.DEPTNO<>10;
--2.查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名,职位,不包括10部门员工
SELECT E.ENAME,E.JOB FROM EMP E
WHERE (E.JOB=ANY(SELECT E.JOB FROM EMP E WHERE E.DEPTNO=10)
OR E.MGR=ANY(SELECT E.MGR FROM EMP E WHERE E.DEPTNO=10))
AND E.DEPTNO<>10;
--------------ppt7练习4-----------------
--1.查询比自己职位平均工资高的员工姓名、职位,部门名称,职位平均工资
SELECT E.ENAME,E.JOB,D.DNAME,MM.AVGSAL FROM EMP E
JOIN DEPT D ON E.DEPTNO=D.DEPTNO
JOIN (SELECT E.JOB MMJOB,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.JOB) MM ON E.JOB=MM.MMJOB
WHERE E.SAL>MM.AVGSAL ;
--2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT和BLAKE本人。
SELECT E.ENAME,E.JOB FROM EMP E
WHERE ((E.JOB,E.MGR) IN(
SELECT E.JOB,E.MGR FROM EMP E WHERE E.ENAME='SCOTT' OR E.ENAME='BLAKE' )
)AND E.ENAME!='SCOTT' AND E.ENAME!='BLAKE';
--3.查询不是经理的员工姓名。
SELECT * FROM EMP E WHERE E.EMPNO NOT IN(SELECT NVL(E.MGR,0) FROM EMP E);
--------------ppt7练习5-----------------
--1.查询入职日期最早的前5名员工姓名,入职日期。
SELECT FROM EMP E;
--2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
SELECT FROM EMP E;
--------------ppt7练习6-----------------
--1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。!!!!!!!!!!!!!
SELECT * FROM (SELECT ROWNUM ROWINDEX,E.* FROM EMP E) T
WHERE T.ROWINDEX>(2-1)*5 AND T.ROWINDEX<=2*5;
SELECT * FROM (SELECT ROWNUM ROWINDEX,E.* FROM EMP E) T
WHERE T.ROWINDEX>(2-1)*5 AND T.ROWINDEX<=2*5;
SELECT * FROM (SELECT ROWNUM ROWINDEX,E.* FROM EMP E) T
WHERE T.ROWINDEX>(3-1)*5 AND T.ROWINDEX<=3*5;
--------------ppt7练习7-----------------
--1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称、工资。
SELECT FROM EMP E;
--------------ppt7课后作业-----------------
--1.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
SELECT E.EMPNO,E.ENAME,E.SAL FROM EMP E
WHERE E.SAL>(SELECT E.SAL FROM EMP E WHERE E.EMPNO=7788)
AND E.JOB=(SELECT E.JOB FROM EMP E WHERE E.EMPNO=7369);
--2.查询工资最高的员工姓名和工资。
SELECT E.ENAME,E.SAL FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E);
--3.查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
SELECT D.DEPTNO,D.DNAME,MIN(E.SAL) FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO
GROUP BY D.DEPTNO,D.DNAME
HAVING MIN(E.SAL)>(SELECT MIN(E.SAL) FROM EMP E WHERE D.DEPTNO=10);
--4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
SELECT E.DEPTNO,E.ENAME,E.SAL FROM EMP E
WHERE E.SAL=ANY(
SELECT MIN(E.SAL) FROM EMP E GROUP BY E.DEPTNO) GROUP BY E.DEPTNO,E.ENAME,E.SAL;
----
SELECT E.DEPTNO,E.ENAME,E.SAL FROM EMP E,(SELECT E.DEPTNO,MIN(E.SAL) MINSAL FROM EMP E GROUP BY E.DEPTNO) EE
WHERE E.DEPTNO=EE.DEPTNO
AND E.SAL=EE.MINSAL;
--5.显示经理是KING的员工姓名,工资。
SELECT E.ENAME,E.SAL FROM EMP E
WHERE E.MGR=(
SELECT E.EMPNO FROM EMP E WHERE E.ENAME='KING');
--6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
SELECT E.ENAME,E.SAL,E.HIREDATE FROM EMP E
WHERE E.HIREDATE>(SELECT E.HIREDATE FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'));
--7.使用子查询的方式查询哪些职员在NEW YORK工作。???
SELECT * FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO
WHERE D.LOC='NEW YORK' ;
SELECT FROM EMP E
;
--8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,查询结果中排除SMITH。
SELECT E.ENAME,E.HIREDATE FROM EMP E
WHERE (E.DEPTNO=(
SELECT E.DEPTNO FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'))
)AND UPPER(E.ENAME)!=UPPER('SMITH');
--9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。
SELECT E.EMPNO,E.ENAME FROM EMP E
WHERE E.SAL>(SELECT AVG(NVL(E.SAL,0)) FROM EMP E);
--10.写一个查询显示其上级领导是King的员工姓名、工资。
SELECT E.ENAME,E.SAL FROM EMP E
WHERE E.MGR=(
SELECT E.EMPNO FROM EMP E WHERE E.ENAME='KING');
--11.显示所有工作在RESEARCH部门的员工姓名,职位。
SELECT E.ENAME,E.JOB FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO AND D.DNAME='RESEARCH';
--12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门20的平均工资。
SELECT E.DEPTNO,AVG(NVL(E.SAL ,0)) FROM EMP E
GROUP BY E.DEPTNO
HAVING AVG(NVL(E.SAL ,0))>(SELECT AVG(NVL(E.SAL ,0)) FROM EMP E WHERE E.DEPTNO=20);
--13.查询大于自己部门平均工资的员工姓名,工资,所在部门平均工资,高于部门平均工资的额度。
SELECT E.ENAME,E.SAL,D.DNAME,E.SAL-MM.AVGSAL FROM EMP E ???????
JOIN DEPT D ON E.DEPTNO=D.DEPTNO
JOIN (SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO) MM ON E.JOB=MM.MMJOB
WHERE E.SAL>MM.AVGSAL ;
--14.列出至少有一个雇员的所有部门
SELECT COUNT(*) ,DEPTNO FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*)>0???????????/
SELECT D.DEPTNO,COUNT(E.DEPTNO) FROM DEPT D
LEFT JOIN EMP E ON E.DEPTNO=D.DEPTNO
WHERE COUNT(E.DEPTNO)>=1;
--15.列出薪金比"SMITH"多的所有雇员
SELECT * FROM EMP E
WHERE E.SAL>(
SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'));
--16.列出入职日期早于其直接上级的所有雇员
SELECT E.*,M.HIREDATE MhIREDATE FROM EMP E,EMP M WHERE E.MGR=M.EMPNO AND E.HIREDATE<M.HIREDATE;
--17.找员工姓名和直接上级的名字
SELECT E.ENAME,M.ENAME MNAME FROM EMP E,EMP M WHERE E.MGR=M.EMPNO;
--18.显示部门名称和人数
SELECT D.DNAME,COUNT(DISTINCT E.EMPNO) FROM DEPT D
LEFT JOIN EMP E ON E.DEPTNO=D.DEPTNO
GROUP BY D.DNAME;
--19.显示每个部门的最高工资的员工
SELECT MAX(E.SAL) FROM EMP E GROUP BY E.DEPTNO--子查询:每个部门的最高工资
SELECT * FROM EMP E,(SELECT MAX(E.SAL) MAXSAL,E.DEPTNO SELTDEPTNO FROM EMP E GROUP BY E.DEPTNO) S
WHERE E.DEPTNO=S.SELTDEPTNO AND E.SAL=S.MAXSAL;
--20.显示出和员工号7369部门相同的员工姓名,工资
SELECT E.ENAME,E.SAL FROM EMP E
WHERE E.DEPTNO=(
SELECT E.DEPTNO FROM EMP E WHERE E.EMPNO=7369);
--21.显示出和姓名中包含"W"的员工相同部门的员工姓名
SELECT E.ENAME FROM EMP E
WHERE E.DEPTNO=(
SELECT E.DEPTNO FROM EMP E WHERE INSTR(E.ENAME,'W')>0);
--22.显示出工资大于平均工资的员工姓名,工资
SELECT E.ENAME,E.SAL FROM EMP E
WHERE E.SAL>(SELECT AVG(NVL(E.SAL,0)) FROM EMP E);
--23.显示出工资大于本部门平均工资的员工姓名,工资
SELECT AVG(NVL(E.SAL,0)) FROM EMP E GROUP BY E.DEPTNO;---子查询:每个部门的平均工资
SELECT E.ENAME,E.SAL
FROM EMP E
WHERE E.SAL>(SELECT AVG(NVL(E.SAL,0)) FROM EMP E GROUP BY E.DEPTNO);?????
--24.显示每位经理管理员工的最低工资,及最低工资者的姓名
-------方式1:------
SELECT E.ENAME,MS.MINSAL
FROM EMP E JOIN
(SELECT E.MGR,MIN(NVL(E.SAL,0)) MINSAL FROM EMP E GROUP BY E.MGR) MS ON E.MGR=MS.MGR
WHERE E.SAL=MS.MINSAL;
-------方式2:------
SELECT E.ENAME,E.SAL
FROM EMP E WHERE (E.MGR,E.SAL)=ANY(
SELECT E.MGR,MIN(NVL(E.SAL,0)) MINSAL FROM EMP E GROUP BY E.MGR);
--25.显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间
SELECT E.HIREDATE FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E);---子查询:工资最高的员工的参加工作时间
-------方式1:------
SELECT E.ENAME,E.HIREDATE FROM EMP E
WHERE E.HIREDATE>ANY(
SELECT E.HIREDATE FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E));
-------方式2:------
SELECT E.ENAME,E.HIREDATE FROM EMP E
WHERE E.HIREDATE> (
SELECT MIN(NVL(E.HIREDATE,SYSDATE)) FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E));
--26.显示出平均工资最高的的部门平均工资及部门名称
SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) FROM EMP E GROUP BY E.DEPTNO;---子查询:每个部门的平均工资
-------方式1:------需要考虑的问题是:Oracle的等值关系是否会按照两个子表的顺序进行关联?
SELECT D.DNAME,T.AVGSAL
FROM (SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO ORDER BY AVGSAL DESC) T
JOIN DEPT D ON D.DEPTNO=T.DEPTNO
WHERE ROWNUM=1;
-------方式2:-
-----
SELECT ROWNUM,TEMP.* FROM(
SELECT D.DNAME,T.AVGSAL
FROM DEPT D JOIN(SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO ) T
ON D.DEPTNO=T.DEPTNO
ORDER BY T.AVGSAL DESC) TEMP
WHERE ROWNUM=1;
-------方式3:------
SELECT D.DNAME,T.AVGSAL
FROM (SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO) T
JOIN DEPT D ON D.DEPTNO=T.DEPTNO
WHERE T.AVGSAL=(SELECT MAX(AVG(NVL(E.SAL,0))) FROM EMP E GROUP BY E.DEPTNO);
相关推荐
- Java面试题合集200道!
-
1.Java中操作字符串都有哪些类?它们之间有什么区别?String、StringBuffer、StringBuilder.String和StringBufer、StringBuilder的区别...
- JAVA分布式锁的原理,及多种分布式实现优劣对比分析
-
引题比如在同一个节点上,两个线程并发的操作A的账户,都是取钱,如果不加锁,A的账户可能会出现负数,正确的方式是对账户acount进行加锁,即使用synchronized关键字,对其进行加锁后,当有线程...
- 百度Linux C++后台开发面试题(个人整理)
-
1、C/C++程序的内存分区其实C和C++的内存分区还是有一定区别的,但此处不作区分:1)、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中...
- 什么是云计算?看这篇就够了(建议收藏)
-
一、什么是云?云,又称云端,指无数的大型机房或者大型数据中心。二、为什么需要云?1)从用户的角度来讲:传统应用的需求日益复杂,比如需要支持更多的用户,需要更强的计算能力等,为满足这些日益增长的需求,企...
- 写PHP框架需要具备那些知识?
-
如果没用过框架,讨论各个框架的内容都没有可讨论性,想自己写个框架涉及到的内容很多,个人觉得自己写一个框架对自己的逻辑思维,开发架构以及这门语言都有质的提升。可以参照其他框架的源代码,仅仅是看他们的思路...
- 不允许还有Java程序员不了解BlockingQueue阻塞队列的实现原理
-
我们平时开发中好像很少使用到BlockingQueue(阻塞队列),比如我们想要存储一组数据的时候会使用ArrayList,想要存储键值对数据会使用HashMap,在什么场景下需要用到Blocking...
- Java性能优化指南—缓存那些事
-
由于笔者自身水平有限,如果有不对或者任何建议欢迎批评和指正本文预计阅读时间10分钟,分为前言、填坑两部分,主要包含缓存的基本使用到高级应用场景的介绍一、前言在处理高并发请求时,缓存几乎是无往不利的利器...
- 卓象科技:Nosql的介绍以及和关系型数据库的区别
-
Nosql介绍NoSQL(NotOnlySQL),泛指非关系型数据库。Nosql的全称是NotOnlySql,这个概念很早就有人提出,在09年的时候比较火。Nosql指的是非关系型数...
- 腾讯一面凉经(一面竟然就问了2小时,什么情况?)
-
这次一面感觉是在打心理战,哥们自己的心里防线基本是被击溃,面到怀疑人生的程度,所以过程感觉不是太好,很多题哥们自己也感觉没答好,要么答得“缺胳膊少腿”,要么就是“画蛇添足”。先是聊项目,从项目的架构设...
- 我凭借这份pdf,最终拿到了阿里,腾讯,京东等八家大厂offer
-
怎样才能拿到大厂的offer,没有掌握绝对的技术,那么就要不断的学习我是如何笑对金九银十,拿到阿里,腾讯等八家大厂的offer的呢,今天分享我的秘密武器,美团大神整理的Java核心知识点,面试时面试官...
- 高并发 异步解耦利器:RocketMQ究竟强在哪里?
-
本文带大家从以下几个方面详细了解RocketMQ:RocketMQ如何保证消息存储的可靠性?RocketMQ如何保证消息队列服务的高可用?如何构建一个高可用的RocketMQ双主双从最小集群?Rock...
- 阿里最新Java架构师成长笔记开源
-
下面先给大家上一个总的目录大纲,基础的东西就不进行过多的赘述,我们将会从JVM说起,同时由于每篇的内容过多,我们也只说重点,太过基础的内容谁都会,我就不多敲字浪费大家的时间了!JVM多线程与高并发Sp...
- 程序员失业2个月找不到工作,狂刷了5遍这份pdf终获字节跳动offer
-
写在前面1月初失业,找了近2个多月的工作了,还没找到心仪的工作,感觉心好慌,不知道该怎么办了?找不到工作的时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷……尽管很多时候我们自己知道...
- Spring AI 模块架构与功能解析
-
SpringAI是Spring生态系统中的一个新兴模块,专注于简化人工智能和机器学习技术在Spring应用程序中的集成。本文将详细介绍SpringAI的核心组件、功能模块及其之间的关...
- Nginx从入门到精通,超详细整理,含项目实战案例|运维必学
-
Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器。因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名。Nginx可以做静态HT...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)