一、查詢集合運算
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;