--復雜查詢練習
-- 1 、列出所有員工的年工資,按年薪從低到高排序。
SELECT (SAL+NVL(COMM,0))*12 INCOME FROM EMP ORDER BY INCOME;
-- 2 、列出薪金比“ SMITH ”多的所有員工。
--獲取SMITH 的工資
SELECT * FROM EMP WHERE SAL >(SELECT SAL FROM EMP WHERE ENAME = 'SMITH');
-- 3 、列出所有員工的姓名及其直接上級的姓名。
SELECT E1.ENAME,E2.ENAME
FROM EMP E1
LEFT JOIN EMP E2
ON E1.MGR = E2.EMPNO;
-- 4 、列出受雇日期早於其直接上級的所有員工。
SELECT E1.ENAME,E1.HIREDATE,E2.ENAME,E2.HIREDATE
FROM EMP E1
LEFT JOIN EMP E2
ON E1.MGR = E2.EMPNO
WHERE E1.HIREDATE <E2.HIREDATE;
-- 5 、列出部門名稱和這些部門的員工信息,包括那些沒有員工的部門。
SELECT D.DNAME,E.EMPNO,E.ENAME,DEPTNO
FROM EMP E
RIGHT JOIN DEPT D
USING(DEPTNO);
-- 6 、列出所有job 為“ CLERK ”(辦事員)的姓名及其部門名稱。
--1.查詢所有job為“CLERK”的姓名
SELECT D.DNAME,T.ENAME FROM
(SELECT DEPTNO,ENAME FROM EMP WHERE JOB ='CLERK') T,DEPT D
WHERE T.DEPTNO = D.DEPTNO;
-- 7 、列出最低工資大於1500 的各種工作。
SELECT JOB
FROM EMP
GROUP BY JOB
HAVING MIN(SAL)>1500;
-- 8 、列出在部門“ SALES ”(銷售部)工作的員工的姓名,假定不知道銷售部的部門編號。
--1.獲取銷售部的部門編號
SELECT ENAME,DEPTNO FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE DNAME = 'SALES');
-- 9 、列出工資高於公司平均工資的所有員工。
--獲取公司的平均工資
SELECT * FROM EMP WHERE SAL >(SELECT ROUND(AVG(SAL)) AVG_SAL FROM EMP);
-- 10 、列出與“ SCOTT ”從事相同工作的所有員工。
--獲取SCOTT的工作
SELECT * FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'SCOTT')
AND ENAME <> 'SCOTT';
-- 11 、列出工資高於在部門 30 工作的所有員工的工資的員工姓名和工資。
--1.獲取30號部門員工的工資
SELECT ENAME,SAL FROM EMP WHERE SAL >ALL(SELECT SAL FROM EMP WHERE DEPTNO = 30);
-- 12 、列出在每個部門工作的員工數量、平均工資和平均服務期限(年)。
SELECT COUNT(*),ROUND(AVG(SAL)) AVG_SAL,ROUND(AVG(TO_CHAR(SYSDATE,'YYYY')-TO_CHAR(HIREDATE,'YYYY'))) AVG_YEAR
FROM EMP
GROUP BY DEPTNO;
-- 13 、列出所有員工的姓名、部門名稱和工資。
SELECT E.ENAME,D.DNAME,E.SAL
FROM EMP E NATURAL JOIN DEPT D;
-- 14 、列出從事同一種工作但屬於不同部門的員工的一種組合。
--[自連接]
--E1 和 E2 都當成員工表
SELECT E1.ENAME,E1.JOB,E1.DEPTNO,E2.ENAME,E2.JOB,E2.DEPTNO
FROM EMP E1,EMP E2
WHERE E1.JOB = E2.JOB
AND E1.DEPTNO <> E2.DEPTNO
AND E1.ENAME<E2.ENAME;
-- 15 、列出所有部門的詳細信息和部門人數(包含沒有員工的部門)。
SELECT D.*,COUNT(E.EMPNO)
FROM EMP E RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY D.DEPTNO,D.DNAME,D.LOC;
-- 16 、列出各種工作的最低工資。
SELECT JOB,MIN(SAL)
FROM EMP
GROUP BY JOB;
-- 17 、列出各個部門的 MANAGER (經理)的最低薪金。
SELECT DEPTNO,MIN(SAL)
FROM EMP
WHERE JOB = 'MANAGER'
GROUP BY DEPTNO;
-- 18 、列出至少有一個員工的所有部門。
SELECT DEPTNO
FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*)>=1;