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;