Oracle學習(5):多表查詢

多表查詢



連接的類型:

等值連接,不等值連接,外連接,自連接


等值連接

SQL> --等值連接: 查詢員工信息:員工號,姓名,薪水和部門名稱
SQL> select empno,ename,sal,dname
  2  from emp,dept
  3  where emp.deptno=dept.deptno;


     EMPNO ENAME      SAL DNAME                                                                                                                       
---------- -------- ----- --------------                                                                                                              
      7369 SMITH      800 RESEARCH                                                                                                                    
      7499 ALLEN     1600 SALES                                                                                                                       
      7521 WARD      1250 SALES                                                                                                                       
      7566 JONES     2975 RESEARCH                                                                                                                    
      7654 MARTIN    1250 SALES                                                                                                                       
      7698 BLAKE     2850 SALES                                                                                                                       
      7782 CLARK     2450 ACCOUNTING                                                                                                                  
      7788 SCOTT     3000 RESEARCH                                                                                                                    
      7839 KING      5000 ACCOUNTING                                                                                                                  
      7844 TURNER    1500 SALES                                                                                                                       
      7876 ADAMS     1100 RESEARCH                                                                                                                    
      7900 JAMES      950 SALES                                                                                                                       
      7902 FORD      3000 RESEARCH                                                                                                                    
      7934 MILLER    1300 ACCOUNTING                                                                                                                  


已選擇14行。


SQL> --等值連接: 查詢員工信息:員工號,姓名,薪水,部門名稱,部門號(兩張表都有部門號,會出錯)
SQL> ed
已寫入 file afiedt.buf


  1  select empno,ename,sal,dname,deptno
  2  from emp,dept
  3* where emp.deptno=dept.deptno
SQL> /
select empno,ename,sal,dname,deptno
                             *
第 1 行出現錯誤: 
ORA-00918: 未明確定義列 




SQL> ed
已寫入 file afiedt.buf


  1  select e.empno,e.ename,e.sal,d.dname,d.deptno
  2  from emp e,dept d
  3* where emp.deptno=dept.deptno
SQL> /
where emp.deptno=dept.deptno
                 *
第 3 行出現錯誤: 
ORA-00904: "DEPT"."DEPTNO": 標識符無效 



(解決辦法:給每張表起一個別名,然後表明數據是哪一個別名的)
SQL> ed
已寫入 file afiedt.buf


  1  select e.empno,e.ename,e.sal,d.dname,d.deptno
  2  from emp e,dept d
  3* where e.deptno=d.deptno
SQL> /


     EMPNO ENAME      SAL DNAME              DEPTNO                                                                                                   
---------- -------- ----- -------------- ----------                                                                                                   
      7369 SMITH      800 RESEARCH               20                                                                                                   
      7499 ALLEN     1600 SALES                  30                                                                                                   
      7521 WARD      1250 SALES                  30                                                                                                   
      7566 JONES     2975 RESEARCH               20                                                                                                   
      7654 MARTIN    1250 SALES                  30                                                                                                   
      7698 BLAKE     2850 SALES                  30                                                                                                   
      7782 CLARK     2450 ACCOUNTING             10                                                                                                   
      7788 SCOTT     3000 RESEARCH               20                                                                                                   
      7839 KING      5000 ACCOUNTING             10                                                                                                   
      7844 TURNER    1500 SALES                  30                                                                                                   
      7876 ADAMS     1100 RESEARCH               20                                                                                                   
      7900 JAMES      950 SALES                  30                                                                                                   
      7902 FORD      3000 RESEARCH               20                                                                                                   
      7934 MILLER    1300 ACCOUNTING             10                                                                                                   


已選擇14行。

不等值連接

SQL> --不等值連接:查詢員工的工資級別
SQL> select * from salgrade;


     GRADE      LOSAL      HISAL                                                                                                                      
---------- ---------- ----------                                                                                                                      
         1        700       1200                                                                                                                      
         2       1201       1400                                                                                                                      
         3       1401       2000                                                                                                                      
         4       2001       3000                                                                                                                      
         5       3001       9999                                                                                                                      


SQL> select e.ename,e.sal,s.grade
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;


ENAME      SAL      GRADE                                                                                                                             
-------- ----- ----------                                                                                                                             
SMITH      800          1                                                                                                                             
JAMES      950          1                                                                                                                             
ADAMS     1100          1                                                                                                                             
WARD      1250          2                                                                                                                             
MARTIN    1250          2                                                                                                                             
MILLER    1300          2                                                                                                                             
TURNER    1500          3                                                                                                                             
ALLEN     1600          3                                                                                                                             
CLARK     2450          4                                                                                                                             
BLAKE     2850          4                                                                                                                             
JONES     2975          4                                                                                                                             
SCOTT     3000          4                                                                                                                             
FORD      3000          4                                                                                                                             
KING      5000          5                                                                                                                             


已選擇14行。


SQL> host cls

外鏈接

SQL> --按部門統計員工人數:部門號,部門名稱,人數
SQL> select d.deptno,d.dname,count(e.empno) 人數
  2  from dept d,emp e
  3  where d.deptno=e.deptno
  4  group by d.deptno,d.dname;


    DEPTNO DNAME                人數                                                                                                                  
---------- -------------- ----------                                                                                                                  
        10 ACCOUNTING              3                                                                                                                  
        20 RESEARCH                5                                                                                                                  
        30 SALES                   6                                                                                                                  


(上述結果少一個人數爲null的值)


SQL> select count(*) from emp where deptno=10;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         3                                                                                                                                            


SQL> select count(*) from emp where deptno=20;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         5                                                                                                                                            


SQL> select count(*) from emp where deptno=30;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         6                                                                                                                                            


SQL> select * from dept;


    DEPTNO DNAME          LOC                                                                                                                         
---------- -------------- -------------                                                                                                               
        10 ACCOUNTING     NEW YORK                                                                                                                    
        20 RESEARCH       DALLAS                                                                                                                      
        30 SALES          CHICAGO                                                                                                                     
        40 OPERATIONS     BOSTON                                                                                                                      


SQL> select count(*) from emp where deptno=40;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         0                                                                                                                                            


SQL> --希望:在結果中包含某些不成立時的記錄
SQL> /*
SQL> 外連接:
SQL> 左外連接:where d.deptno=e.deptno,當條件不成立時,等號左邊所代表的表的信息任然被顯示
SQL>           寫法: where d.deptno=e.deptno(+)
SQL> 右外連接:where d.deptno=e.deptno,當條件不成立時,等號右邊所代表的表的信息任然被顯示
SQL>            寫法:where d.deptno(+)=e.deptno
SQL> 全外連接:where d.deptno=e.deptno,當條件不成立時,等號兩邊所代表的表的信息任然被顯示
SQL>            寫法:where d.deptno(+)=e.deptno(+)

SQL> */
SQL> select d.deptno,d.dname,count(e.empno) 人數
  2  from dept d,emp e
  3  where d.deptno=e.deptno(+)
  4  group by d.deptno,d.dname
  5  order by 1;


    DEPTNO DNAME                人數                                                                                                                  
---------- -------------- ----------                                                                                                                  
        10 ACCOUNTING              3                                                                                                                  
        20 RESEARCH                5                                                                                                                  
        30 SALES                   6                                                                                                                  
        40 OPERATIONS              0                                                                                                                  


SQL> host cls

自連接

SQL> --自連接:
SQL> --查詢員工信息:***的老闆是****
SQL> select * from emp;


     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                   
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                   
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                   
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                   
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                   
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                   
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                   
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                   
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                   
      7788 SCOTT    ANALYST         7566 13-7月 -87      3000                    20                                                                   
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                   
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                   
      7876 ADAMS    CLERK           7788 13-7月 -87      1100                    20                                                                   
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                   
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                   
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                   


已選擇14行。


SQL> select e.ename||'的老闆是'||b.ename
  2  from emp e, emp b
  3  where e.mgr=b.empno;


E.ENAME||'的老闆是'||B.ENAME                                                                                                                          
----------------------------                                                                                                                          
FORD的老闆是JONES                                                                                                                                     
SCOTT的老闆是JONES                                                                                                                                    
JAMES的老闆是BLAKE                                                                                                                                    
TURNER的老闆是BLAKE                                                                                                                                   
MARTIN的老闆是BLAKE                                                                                                                                   
WARD的老闆是BLAKE                                                                                                                                     
ALLEN的老闆是BLAKE                                                                                                                                    
MILLER的老闆是CLARK                                                                                                                                   
ADAMS的老闆是SCOTT                                                                                                                                    
CLARK的老闆是KING                                                                                                                                     
BLAKE的老闆是KING                                                                                                                                     
JONES的老闆是KING                                                                                                                                     
SMITH的老闆是FORD                                                                                                                                     


已選擇13行。


SQL> --自連接:通過表的別名,將同一張表視爲不同的表,再利用別的連接操作
SQL> --自連接一般只適用於小表(因爲產生的笛卡爾表數據量太過龐大)
SQL> host cls


層次查詢

SQL> --層次查詢:只有一張表
SQL> --          同一張表的前後兩次操作進行連接
SQL> select level,empno,ename,mgr
  2  from emp
  3  connect by prior empno=mgr
  4  start with mgr is null;


     LEVEL      EMPNO ENAME           MGR                                                                                                             
---------- ---------- -------- ----------                                                                                                             
         1       7839 KING                                                                                                                            
         2       7566 JONES          7839                                                                                                             
         3       7788 SCOTT          7566                                                                                                             
         4       7876 ADAMS          7788                                                                                                             
         3       7902 FORD           7566                                                                                                             
         4       7369 SMITH          7902                                                                                                             
         2       7698 BLAKE          7839                                                                                                             
         3       7499 ALLEN          7698                                                                                                             
         3       7521 WARD           7698                                                                                                             
         3       7654 MARTIN         7698                                                                                                             
         3       7844 TURNER         7698                                                                                                             
         3       7900 JAMES          7698                                                                                                             
         2       7782 CLARK          7839                                                                                                             
         3       7934 MILLER         7782                                                                                                             


已選擇14行。


SQL> ed
已寫入 file afiedt.buf


  1  select level,empno,ename,mgr
  2  from emp
  3  connect by prior empno=mgr
  4  start with mgr is null
  5* order by 1
SQL> /


     LEVEL      EMPNO ENAME           MGR                                                                                                             
---------- ---------- -------- ----------                                                                                                             
         1       7839 KING                                                                                                                            
         2       7566 JONES          7839                                                                                                             
         2       7698 BLAKE          7839                                                                                                             
         2       7782 CLARK          7839                                                                                                             
         3       7902 FORD           7566                                                                                                             
         3       7521 WARD           7698                                                                                                             
         3       7900 JAMES          7698                                                                                                             
         3       7934 MILLER         7782                                                                                                             
         3       7499 ALLEN          7698                                                                                                             
         3       7788 SCOTT          7566                                                                                                             
         3       7654 MARTIN         7698                                                                                                             
         3       7844 TURNER         7698                                                                                                             
         4       7876 ADAMS          7788                                                                                                             
         4       7369 SMITH          7902                                                                                                             


已選擇14行。


SQL> /*
SQL> 第一次:7839
SQL> 第二次:where mgr=7839
SQL>        7566 7698 7782
SQL> 第三次:where mgr in (7566 7698 7782)
SQL> */
SQL> spool off
發佈了63 篇原創文章 · 獲贊 11 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章