Oracle常用SQL查詢(常見題目)

Oracle數據庫對於開發人員來說重點內容是DML,即針對數據庫的增刪改查,以及更新刪除操作。

所有的查詢結構都是在Oracle實例scott用戶下進行的,該用戶下有四張表,分別是emp,dept,salgrade,bonus

實例:

1.列出至少有一個員工的所有部門。

SELECT dname FROM dept
WHERE deptno IN(SELECT deptno FROM emp GROUP BY deptno HAVING COUNT(deptno) >= 1);

2.列出薪金比“SMITH”多的所有員工。

SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename='SMITH');

3.列出所有員工的姓名及其直接上級的姓名。

SELECT e.ename,m.ename FROM emp e,emp m WHERE e.mgr = m.empno;

4.列出受僱日期早於其直接上級的所有員工。

SELECT e.ename FROM emp e,emp m WHERE e.mgr=m.empno AND e.hiredate<m.hiredate;--多表查詢

SELECT e.ename FROM emp e WHERE e.hiredate<(SELECT hiredate FROM emp m WHERE e.mgr=m.empno);--子查詢

5.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。

SELECT d.dname,e.* FROM emp e, dept d WHERE e.deptno(+) = d.deptno;

6.列出所有“CLERK”(辦事員)的姓名及其部門名稱。

SELECT e.ename,d.dname FROM emp e,dept d WHERE e.deptno = d.deptno AND e.job = 'CLERK';

7.列出最低薪金大於1500的各種工作。

SELECT DISTINCT job FROM emp GROUP BY job HAVING MIN(sal) > 1500;

8.列出在部門“SALES”(銷售部)工作的員工的姓名,假定不知道銷售部的部門編號。

SELECT * FROM emp e WHERE e.deptno = (SELECT deptno FROM dept WHERE dname='SALES');--方法一

SELECT * FROM emp e,(SELECT deptno FROM dept WHERE dname='SALES') tmp WHERE e.deptno = tmp.deptno;--方法二

9。列出薪金高於公司平均薪金的所有員工。

SELECT * FROM emp WHERE sal > (SELECT AVG(sal) FROM emp); 

10.列出與“SCOTT”從事相同工作的所有員工。

SELECT * FROM emp WHERE job=(SELECT job FROM emp WHERE ename='SCOTT') AND ename<>'SCOTT';

11.列出薪金等於部門30中員工的薪金的所有員工的姓名和薪金。

SELECT ename,sal FROM emp WHERE sal IN(SELECT sal FROM emp WHERE deptno = 30);
       --AND deptno<>30;

12.列出薪金高於在部門30工作的所有員工的薪金的員工姓名和薪金。

SELECT ename,sal FROM emp WHERE sal >ALL(SELECT sal FROM emp WHERE deptno = 30);

13.列出在每個部門工作的員工數量、平均工資和平均服務期限。

SELECT deptno,COUNT(1),trunc(AVG(sal)),trunc(AVG(months_between(SYSDATE,hiredate)/12))
FROM emp
GROUP BY deptno;

14.列出所有員工的姓名、部門名稱和工資。

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

15.列出所有部門的詳細信息和部門人數。

SELECT COUNT(e.deptno),d.dname,d.loc,d.deptno FROM emp e, dept d 
WHERE e.deptno(+) = d.deptno GROUP BY d.dname,d.loc,d.deptno

16.列出各種工作的最低工資。

SELECT min(sal),job FROM emp GROUP BY job; 

17.列出各個部門的MANAGER(經理)的最低薪金。

--SELECT * FROM emp;
SELECT deptno,MIN(sal) FROM emp WHERE job='MANAGER' GROUP BY deptno;

18.列出所有員工的年工資,按年薪從低到高排序。

SELECT ename,(sal+NVL(comm,0))*12 income FROM emp ORDER BY income ASC;

–19.查出某個員工的所有上級主管,並要求出這些主管中的薪水超過3000 (用一條sql語句解決)

SELECT e.ename 僱員姓名,m.ename 領導姓名 FROM emp e,emp m WHERE e.mgr = m.empno AND m.sal > 3000;

20.求出部門名稱中,帶‘S’字符的部門員工的、工資合計、部門人數
要求:部門工資合計要 大於 5000,並且按照部門的人數排序。

--function1
SELECT COUNT(e.empno),NVL(SUM(sal),0),d.deptno 
FROM emp e,dept d WHERE d.deptno IN (SELECT deptno FROM dept WHERE dname LIKE '%S%')
      AND e.deptno(+) = d.deptno
GROUP BY d.deptno
HAVING SUM(e.sal)>5000;

--function2
SELECT d.deptno,NVL(SUM(sal),0),COUNT(empno)
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno AND d.dname LIKE '%S%'
GROUP BY d.deptno ;

21.給任職日期超過10年的人加薪10%

UPDATE myemp SET sal = sal*1.1 WHERE months_between(SYSDATE,hiredate)/12 > 10;
--SELECT * FROM myemp;

22、列出員工任職的年、月、日

SELECT 
         TRUNC(months_between(SYSDATE,hiredate)/12) 年,
         TRUNC(MOD(months_between(SYSDATE,hiredate),12)) 月,
         TRUNC(SYSDATE - add_months(hiredate,TRUNC(months_between(SYSDATE,hiredate)))) 日
FROM emp;

–23、列出員工中薪水最低,任職日期最長的員工。

SELECT * FROM emp WHERE (sal,hiredate)=(SELECT MIN(sal),MIN(hiredate) FROM emp);

24.列出與“SCOTT”從事相同工作的所有員工及部門名稱,部門人數,平均工資。

SELECT e.empno,e.ename,e.job,d.dname,tmp.avgsal,tmp.count
FROM emp e,dept d,(SELECT deptno,AVG(sal) avgsal,COUNT(*) COUNT FROM emp GROUP BY deptno) tmp
WHERE e.deptno = d.deptno
      AND d.deptno = tmp.deptno
      AND e.job=(SELECT job FROM emp WHERE ename='SCOTT')
      AND e.ename<>'SCOTT';

25.列出薪金高於在部門30工作的所有員工的薪金以及高於公司平均工資的的員工姓名和薪金、部門名稱、部門平均工資、個人工資等級。

SELECT e.empno,e.ename,tmp.avgsal,s.grade
FROM emp e,dept d,salgrade s,(SELECT deptno dno,AVG(sal) avgsal 
                                     FROM emp GROUP BY deptno) tmp
WHERE sal>ALL(SELECT sal FROM emp WHERE deptno = 30)
      AND sal>(SELECT AVG(sal) FROM emp)
      AND e.deptno = tmp.dno
      AND e.deptno = d.deptno
      AND e.sal BETWEEN s.losal AND s.hisal;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章