oracle.查询集合运算、相关子查询、层次查询

一、查询集合运算
1、并集:又称为联合运算,两个查询语句的查询出来的列的个数,对应的列的数据类型相符才能合并
UNION:将两个查询结果合并输出,查询结果中的重复记录只显示一次
UNION ALL:将两个查询结果合并输出,查询结果中的重复记录显示多次

SELECT * FROM EMP WHERE deptno=30
union
SELECT * FROM emp WHERE upper(job)='MANAGER';


SELECT * FROM EMP WHERE deptno=30
UNION all
SELECT * FROM emp WHERE upper(job)='MANAGER';

SELECT deptno,dname FROM dept
union
select empno,ename from emp;

SELECT dname,loc FROM dept
UNION
SELECT JOB,ename FROM emp
UNION
SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno;

SELECT dname,loc FROM dept;

SELECT JOB,ename FROM emp;

SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno;

注意:
批量执行SQL语句时,写成一个SQL脚本,使用SQLPLUS命令   @路径/A.SQL

2、交集运算:
INTERSECT:  查询两个查询语句中重复的部分

SELECT * FROM EMP WHERE deptno=30
INTERSECT
SELECT * FROM emp WHERE upper(JOB)='MANAGER';

3、差运算:
minus:第一个查询语句的结果减去交集

SELECT * FROM EMP WHERE deptno=30
minus
SELECT * FROM emp WHERE upper(JOB)='MANAGER';

SELECT * FROM emp WHERE upper(JOB)='MANAGER'
MINUS
SELECT * FROM EMP WHERE deptno=30;

select avg(sal) from emp where deptno=30;

二、相关子查询
---查询员工姓名,部门名称
SELECT ename,dname
FROM emp,dept
WHERE emp.deptno=dept.deptno;

SELECT ename,(SELECT dname FROM dept where deptno=emp.deptno)
FROM emp;

---查询员工的姓名,职务,要比员工所在职务的平均薪水高的。
SELECT ename,JOB
FROM EMP A
WHERE sal>(SELECT avg(sal) FROM emp WHERE JOB=A.JOB);

--2.查询工资为其部门最低工资的员工编号,姓名,工资
SELECT empno,ename,sal
FROM emp e
WHERE sal=(SELECT MIN(sal) FROM emp WHERE deptno=e.deptno);

2、exists:
查询哪些人是经理?
SELECT empno,ename,sal
FROM emp
WHERE empno in(select mgr from emp where mgr is not null);

SELECT empno,ename,sal
FROM emp m
WHERE EXISTS (SELECT empno FROM emp WHERE mgr=m.empno);

1.列出至少有一个雇员的所有部门名称。
SELECT dname
FROM dept
WHERE exists(SELECT empno FROM emp WHERE deptno=dept.deptno);
2.列出一个雇员都没有的所有部门名称。
SELECT dname
FROM dept
WHERE NOT EXISTS(SELECT empno FROM emp WHERE deptno=dept.deptno);

1.查询薪水多于他所在部门平均薪水的雇员名字,部门号。
SELECT ename,deptno
FROM emp e
WHERE sal>(select avg(sal) from emp where deptno=e.deptno);
2.查询员工姓名和直接上级的名字。
SELECT ename,(SELECT ename FROM emp WHERE empno=e.mgr)
FROM emp e;
3.查询每个部门工资最高的员工姓名,工资。
SELECT ename,sal
FROM emp e
WHERE sal = (select max(sal) from emp where deptno=e.deptno);
4.查询每个部门工资前两名高的员工姓名,工资
SELECT ename,sal
FROM emp e
WHERE (select count(empno) from emp where deptno=e.deptno and sal>e.sal) <=1;

三、层次查询
LEVEL:等级

SELECT
FROM
WHERE
START WITH 起始条件
CONNECT BY PRIOR 条件

从顶向下查询:
SELECT level,empno,ename,mgr,sal
FROM emp
START WITH empno=7788
CONNECT BY PRIOR mgr = empno;

从底向上查询:
SELECT level,empno,ename,mgr,sal
FROM emp
START WITH upper(ename)='SMITH'
CONNECT BY PRIOR empno = mgr;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章