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;

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