Oracle SQL:經典查詢練手第一篇

討論一些常見的SQL經典查詢spa

使用Oracle的Scott用戶3d

表結構以下:code

emp表htm

dept表blog

工資=薪金+佣金排序

工資=sal+comm博客

表中數據以下:io

emp:class

dept:基礎

問題列表:

用SQL完成如下問題列表:

  1. 列出至少有一個員工的全部部門。
  2. 列出薪金比「SMITH」多的全部員工。
  3. 列出全部員工的姓名及其直接上級的姓名。
  4. 列出受僱日期早於其直接上級的全部員工。
  5. 列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門
  6. 列出全部「CLERK」(辦事員)的姓名及其部門名稱。
  7. 列出最低薪金大於1500的各類工做。
  8. 列出在部門「SALES」(銷售部)工做的員工的姓名,假定不知道銷售部的部門編號。
  9. 列出薪金高於公司平均薪金的全部員工。
  10. 列出與「SCOTT」從事相同工做的全部員工。
  11. 列出薪金等於部門30中員工的薪金的全部員工的姓名和薪金。
  12. 列出薪金高於在部門30工做的全部員工的薪金的員工姓名和薪金。
  13. 列出在每一個部門工做的員工數量、平均工資和平均服務期限。
  14. 列出全部員工的姓名、部門名稱和工資。
  15. 列出全部部門的詳細信息和部門人數。
  16. 列出各類工做的最低工資。
  17. 列出各個部門的MANAGER(經理)的最低薪金。
  18. 列出全部員工的年工資,按年薪從低到高排序。

個人答案以下,歡迎指正:

-- 1.列出至少有一個員工的全部部門
-- 先查出有員工的部門編號
select DISTINCT deptno from emp;
-- 部門編號在裏面就知足
select dname from dept where deptno in (select DISTINCT deptno from emp);
DNAME        
--------------
ACCOUNTING 
RESEARCH 
SALES 
-- 2.列出薪金比「SMITH」多的全部員工
-- 先查詢出‘SMITH’的薪金
SELECT SAL FROM emp WHERE ENAME ='SMITH';
-- SAL取值大於SMITH的薪金便可
-- SAL是數字 NUMBER(7,2) 能夠直接比較
SELECT * FROM EMP WHERE SAL > (SELECT SAL FROM emp WHERE ENAME ='SMITH');
 1 -- 3.列出全部員工的姓名及其直接上級的姓名
 2 -- empno等於mgr
 3 SELECT e.ename,(select ename from emp ee where ee.EMPNO=e.MGR) superior FROM emp e;
 4 
 5 ENAME      SUPERIOR 
 6 ---------- ----------
 7 SMITH FORD 
 8 ALLEN BLAKE 
 9 WARD BLAKE 
10 JONES KING  
11 MARTIN BLAKE 
12 BLAKE KING  
13 CLARK KING  
14 SCOTT JONES 
15 KING             
16 TURNER BLAKE 
17 ADAMS SCOTT 
18 JAMES BLAKE 
19 FORD JONES 
20 MILLER CLARK 
21 
22  選定了 1423 
24 -- 沒有思路 待議
 1 -- 4.列出受僱日期早於其直接上級的全部員工
 2 -- hiredate直接用大於小於比較
 3 select e.ENAME from emp e where e.HIREDATE< (SELECT HIREDATE FROM emp ee where ee.EMPNO=e.mgr);
 4 
 5 ENAME    
 6 ----------
 7 SMITH 
 8 ALLEN 
 9 WARD 
10 JONES 
11 BLAKE 
12 CLARK 
13 
14  選定了 6
-- 沒有思路 待議
1 -- 5.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門
2 -- 爲了列出沒有員工的部門 可使用左外鏈接 以部門表爲基準 部門表記錄所有顯示出來 而無論員工表有不有對應的記錄
3 select d.DNAME,e.ENAME,e.HIREDATE,e.JOB,e.MGR,e.HIREDATE,e.SAL from dept d left outer join emp e on d.deptno = e.deptno;
 1 -- 6.列出全部「CLERK」(辦事員)的姓名及其部門名稱
 2 -- 先查詢出CLERK的姓名和部門編號
 3 SELECT e.JOB,e.ENAME,e.DEPTNO FROM EMP e where JOB = 'CLERK';
 4 -- 再和部門表作關聯 使用子查詢
 5 select aa.ename,aa.job,bb.dname from (SELECT e.JOB,e.ENAME,e.DEPTNO FROM EMP e where JOB = 'CLERK') aa ,DEPT bb where aa.deptno= bb.deptno;
 6 
 7 -- 還有一種方式 就是作內鏈接
 8 select e.ENAME,d.DNAME from emp e join dept d on e.deptno=d.deptno where e.JOB='CLERK';
 9 
10 ENAME      DNAME        
11 ---------- --------------
12 MILLER ACCOUNTING 
13 SMITH RESEARCH 
14 ADAMS RESEARCH 
15 JAMES SALES    
1 -- 7.列出最低薪金大於1500的各類工做
2 -- 先根據工做來分組 而後再此基礎上過濾sal>1500 每組裏面最低工資而不是工資大於1500
3 select job from emp group by job having(min(sal))>1500;

 

 1 -- 8.列出在部門「SALES」(銷售部)工做的員工的姓名,假定不知道銷售部的部門編號
 2 -- 先找出銷售部門編號
 3 select d.deptno from dept d where d.DNAME = 'SALES';
 4 -- 再根據編號過濾
 5 select e.ename from emp e where e.DEPTNO = (select d.deptno from dept d where d.DNAME = 'SALES');
 6 
 7 ENAME    
 8 ----------
 9 ALLEN 
10 WARD 
11 MARTIN 
12 BLAKE 
13 TURNER 
14 JAMES 
15 
16  選定了 6
 1 -- 9.列出薪金高於公司平均薪金的全部員工
 2 -- 先算出平均薪金
 3 select AVG(sal) from emp;
 4 -- 再作比較
 5 select e.ENAME from emp e where e.SAL > (select AVG(sal) from emp);
 6 
 7 ENAME    
 8 ----------
 9 JONES 
10 BLAKE 
11 CLARK 
12 SCOTT 
13 KING  
14 FORD 
15 
16  選定了 6
 1 -- 10.列出與「SCOTT」從事相同工做的全部員工
 2 -- 先算出SCOTT的工做
 3 select JOB from emp where ENAME ='SCOTT';
 4 -- 再作過濾
 5 select e.ENAME from emp e where e.job = (select JOB from emp where ENAME ='SCOTT')
 6 
 7 ENAME    
 8 ----------
 9 SCOTT 
10 FORD 
1 -- 11.列出薪金等於部門30中員工的薪金的全部員工的姓名和薪金
2 -- 先算出部門編號爲30的員工的薪金
3 select e.sal from emp e where e.deptno = 30;
4 -- 而後過濾條件sal在上面的薪金中
5 -- 同時部門編號不等於30 開始我沒有加此限制條件 查詢出來的結果全是部門30的人 應該就是答案 可是答案過濾掉了部門30 不知道其意思
6 select * from emp ee where ee.sal in (select e.sal from emp e where e.deptno = 30) and ee.DEPTNO<>30;
-- 12.列出薪金高於在部門30工做的全部員工的薪金的員工姓名和薪金
-- 先查出部門30最高薪金
select max(e.sal) from emp e where e.deptno=30;
-- 再過濾 此處沒有過濾掉部門30 不懂
select * from emp ee where ee.sal>(select max(e.sal) from emp e where e.deptno=30);

 

1 -- 13.列出在每一個部門工做的員工數量、平均工資和平均服務期限
2 -- 先算出部門名稱
3 -- 再算部門人數
4 -- 再算平均服務期限以天爲標準 to_date(sysdate)
5 -- 根據deptno分組再使用子查詢
select (select d.dname from dept d where d.DEPTNO=e.deptno) deptname,count(1) deptcount,avg(sal) avgsalary,avg(TO_DATE(sysdate)-TO_DATE(e.hiredate)) avgdate from emp e group by e.deptno;
1 -- 14.列出全部員工的姓名、部門名稱和工資
2 -- 我使用了左外鏈接
3 select e.ENAME,d.DNAME,e.SAL from emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
4 -- 也可使用子查詢
5 select e.ENAME,(select d.dname from DEPT d where d.DEPTNO=e.DEPTNO),e.SAL from emp e;
1 -- 15.列出全部部門的詳細信息和部門人數
2 -- 使用左外連接失敗
3 -- 使用子查詢算出部門人數 沒思路
4 select a.deptno,a.dname,a.loc,(select count(deptno) from emp b where b.deptno=a.deptno group by b.deptno) as deptcount from dept a;
1 -- 16.列出各類工做的最低工資
2 -- 先根據工做分組
3 -- 求最低
4 select min(sal),JOB from emp group by job;
 1 -- 17.列出各個部門的MANAGER(經理)的最低薪金
 2 -- 先找出job是manager的
 3 -- 在根據deptno分組
 4 -- 在計算最小值
 5 select e.deptno,min(e.SAL) from emp e where e.job='MANAGER' group by e.deptno;
 6 
 7     DEPTNO MIN(E.SAL)
 8 ---------- ----------
 9      30  2850 
10      20  2975 
11      10  2450 
 1 -- 18.列出全部員工的年工資,按年薪從低到高排序
 2 -- 年工資等於 sal+comm
 3 -- 有的沒有comm 空值
 4 -- 使用nvl(comm,0) 給comm一個預設值 若是comm爲null 則返回0 不然原樣返回
 5 select e.ENAME,(e.sal+nvl(e.COMM,0))*12 annual_salary from emp e order by annual_salary;
 6 
 7 ENAME      ANNUAL_SALARY
 8 ---------- -------------
 9 SMITH     9600 
10 JAMES   11400 
11 ADAMS   13200 
12 MILLER   15600 
13 TURNER   18000 
14 WARD   21000 
15 ALLEN   22800 
16 CLARK   29400 
17 MARTIN   31800 
18 BLAKE   34200 
19 JONES   35700 
20 FORD   36000 
21 SCOTT   36000 
22 KING    60000 
23 
24  選定了 14

原文博客地址:http://database.51cto.com/art/201106/270214.htm

相關文章
相關標籤/搜索