一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

SQL基礎

 outsee 2011-11-25

SQL基礎-->多表查詢

分類: SQL/PLSQL 基礎 486人閱讀 評論(0) 收藏 舉報

--==========================

--SQL基礎-->多表查詢

--==========================

/*

一、多表查詢

    簡言之,根據特定的連接條件從不同的表中獲取所需的數據

 

    笛卡爾集的產生條件:

       省略連接條件

       連接條件無效

       第一個表中的所有行與第二個表中的所有行相連接

           

二、多表查詢語法:*/

    SELECT table1.column, table2.column

    FROM table1, table2

    WHERE table1.column1 = table2.column2;

    /*

    但要注意where 不要省了,省略where 即為笛卡爾集,而且where 條件要有效,

    兩張表間有一個相同的字段,才好進行有效的多表查詢

 

    查詢時列名前,加表名或表別名前輟(如果字段在兩個表中是唯一的可以不加)

 

    為了簡化SQL書寫,可為表名定義別名,格式:from 表名別名

    如:from emp e,dept d

   

    建議使用表的別名及表前綴,使用表別名可以簡化查詢,而使用表前綴則可以提高查詢性能

 

    例:查詢每個員工的工號,姓名,工資,部門名和工作地點*/

    select empno,ename,sal,dname,loc from emp,dept

    where emp.deptno=dept.deptno;

 

/*

三、多表連接類型:

    從數據顯示方式來講有:內連接和外連接。

    內連接:只返回滿足連接條件的數據。

    外連接:除了返回滿足連接條的行以外,還返回左(右)表中,不滿足條件的行,

       稱為左(右)連接

 

    內連接*/

    select empno,ename,sal,dname,loc from emp,dept

    where emp.deptno=dept.deptno;  --(Oracle 8i 及以前的寫法)

 

    --內連接的另一種寫法:

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp join dept on (emp.deptno=dept.deptno); -- (SQL 99的寫法)

 

    /*

    外連接:

    兩個表的查詢中,使用外連接可以查詢另一個表或者兩個中不滿足連接條件的數據。

    外連接的符號是(+),(+)要放在字段名后。(+)對面的那個表,會全部顯示。

   

    外連接語法*/

        SELECT table1.column, table2.column   --右外連接

       FROM table1, table2

       WHERE table1.column(+) = table2.column;

      

       SELECT table1.column, table2.column   --左外連接

       FROM table1, table2

       WHERE table1.column = table2.column(+);

 

    --例:

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp,dept

    where emp.deptno(+)=dept.deptno; -- (Oracle 8i 及以前的寫法)

 

    --另一種寫法(右連接):     -- (SQL 99的寫法)

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp right join dept on (emp.deptno=dept.deptno);

 

    --左連接:                    (SQL 99的寫法)

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp left join dept on (emp.deptno=dept.deptno);

 

    --全連接(滿連接)            (SQL 99的寫法)

   select empno,ename,job,sal,d.deptno,dname,loc

    from emp e full join dept d on (e.deptno=d.deptno);

 

    /*

    自然連接                    (SQL 99的寫法)

    以兩個表具有相同的字段的所有列為基礎,可采用自然連接(natural join)

    它將選擇兩個表中那些在所有匹配的列中值相等的行。

    如果列具有相同的名稱,但數據類型能夠不同,則會報錯*/

    select empno,ename,job,sal,deptno,dname,loc

    from emp natural join dept;

 

    /*

    自連接:

    將自身表的一個鏡像當另一個表來對待。*/

    select ... from emp e,emp d  ...

   

    --下面列出SQL 99的語法供參考

    SELECT table1.column, table2.column

    FROM table1

    [CROSS JOIN table2] |

    [NATURAL JOIN table2] |

    [JOIN table2 USING (column_name)] |

    [JOIN table2

    ON(table1.column_name = table2.column_name)] |

    [LEFT|RIGHT|FULL OUTER JOIN table2

    ON (table1.column_name = table2.column_name)];

   

    --在下面的語法中

    table1.column     --指明從中檢索數據的表和列

    CROSS JOIN        --返回兩個表的笛卡爾集

    NATURAL JOIN      --根據相同的列名連接兩個表

    JOIN table

    USING column_name --根據列名執(zhí)行等值連接

    JOIN table ON

    table1.column_name   --根據ON 子句中的條件執(zhí)行等值連接

    = table2.column_name

    LEFT/RIGHT/FULL OUTER

   

    /*

    使用using子句創(chuàng)建連接

        如果幾個列具有相同的名稱,但是數據類型不匹配,那么可以使用using子句來修改natural join

       子句以指定要用于等值連接的列

       在多個列匹配時,使用using 子句只匹配一個列

       在引用列中不要使用表名或別名

       natural join using 子句是互不相容的 */

      

        --例:

       SELECT l.city, d.department_name

       FROM locations l JOIN departments d USING (location_id)

       WHERE location_id = 1400;

       --下面的語句無效,因為where 子句中限定了location_id

       SELECT l.city, d.department_name

       FROM locations l JOIN departments d USING (location_id)

       WHERE d.location_id = 1400;

       ORA-25154: column part of USING clause cannot have qualifier

      

       --注意:

       --   兩個表中名稱相同的列在使用時不能有任何限定符,這一限制同樣適用于natural join

/*

四、演示:      */ 

--笛卡爾集

    SQL> select empno,ename,dname from emp,dept;

 

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      ACCOUNTING

         7499 ALLEN      ACCOUNTING

         7521 WARD       ACCOUNTING

         7566 JONES      ACCOUNTING

         7654 MARTIN     ACCOUNTING

         7698 BLAKE      ACCOUNTING

         7782 CLARK      ACCOUNTING

         7788 SCOTT      ACCOUNTING

         7839 KING       ACCOUNTING

         7844 TURNER     ACCOUNTING

         7876 ADAMS      ACCOUNTING

         --中間結果省略

         56 rows selected.    

--使用cross join 實現交叉連接,即笛卡爾集    

    SQL> select empno,ename,dname from emp

      2  cross join dept;

 

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      ACCOUNTING

         7499 ALLEN      ACCOUNTING

         7521 WARD       ACCOUNTING

         7566 JONES      ACCOUNTING

         7654 MARTIN     ACCOUNTING

         7698 BLAKE      ACCOUNTING

         7782 CLARK      ACCOUNTING

         7788 SCOTT      ACCOUNTING

         7839 KING       ACCOUNTING

         7844 TURNER     ACCOUNTING

         7876 ADAMS      ACCOUNTING

     

--等值連接(Oracle 寫法)

    SQL> select empno,ename,dname from emp,dept where emp.deptno = dept.deptno;

 

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      RESEARCH

         7499 ALLEN      SALES

         7876 ADAMS      RESEARCH

         --部分結果省略

         7902 FORD       RESEARCH

         7934 MILLER     ACCOUNTING

 

    14 rows selected.

 

--等值連接(SQL 99 寫法)

    SQL> select e.empno,e.ename,d.dname from emp  e

      2  inner join dept  d

      3  on e.deptno = d.deptno;

 

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      RESEARCH

         7499 ALLEN      SALES

         7876 ADAMS      RESEARCH

           --部分結果省略

         7902 FORD       RESEARCH

         7934 MILLER     ACCOUNTING

 

    14 rows selected.

 

--注意:表別名不支持as 用法

    SQL> select e.empno,e.ename,d.dname from emp as e

      2  inner join dept  d

      3  on e.deptno = d.deptno;

    select e.empno,e.ename,d.dname from emp as e

                                       *

    ERROR at line 1:

    ORA-00933: SQL command not properly ended

 

--等值連接并增加條件

    SQL> select e.empno,e.ename,d.dname from emp  e,

      2  dept d

      3  where d.deptno = e.deptno

      4    and e.ename = 'SCOTT';

 

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7788 SCOTT      RESEARCH

     

--非等值連接

--查詢雇員的姓名、薪水、級別且部門為的記錄

    SQL> select ename,sal,grade

      2  from emp,salgrade

      3  where sal between losal and hisal

      4    and emp.deptno = 20;

 

    ENAME             SAL      GRADE

    ---------- ---------- ----------

    SCOTT            3000          4

    FORD             3000          4

    JONES            2975          4

    ADAMS            1100          1

    SMITH             800          1 

 

--使用SQL 99寫法實現上述功能

    SQL> select e.ename,e.sal,s.grade

      2  from emp e

      3    join salgrade s

      4      on e.sal between losal and hisal

      5      and e.deptno = 20;

 

    ENAME             SAL      GRADE

    ---------- ---------- ----------

    SCOTT            3000          4

    FORD             3000          4

    JONES            2975          4

    ADAMS            1100          1

    SMITH             800          1

 

--右外連接

--注意:右外連接時,加號在等號的左邊

--可以看到,左表emp中的列有為空值的

    SQL> select e.ename,e.deptno,d.dname  

      2  from emp e,dept d

      3  where e.deptno(+) = d.deptno;

 

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    CLARK              10 ACCOUNTING

    KING               10 ACCOUNTING

    MILLER             10 ACCOUNTING

    JONES              20 RESEARCH

    FORD               20 RESEARCH

    ADAMS              20 RESEARCH

    SMITH              20 RESEARCH

    SCOTT              20 RESEARCH

    WARD               30 SALES

    TURNER             30 SALES

    ALLEN              30 SALES

 

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    JAMES              30 SALES

    BLAKE              30 SALES

    MARTIN             30 SALES

                       OPERATIONS

 

    15 rows selected.

 

--使用SQL 99寫法實現右外連接

    SQL> select e.ename,e.deptno,d.dname

      2  from emp e      

      3    right join dept d

      4      on e.deptno = d.deptno ;

 

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    CLARK              10 ACCOUNTING

    KING               10 ACCOUNTING

    MILLER             10 ACCOUNTING

    JONES              20 RESEARCH

    FORD               20 RESEARCH

    ADAMS              20 RESEARCH

    SMITH              20 RESEARCH

    SCOTT              20 RESEARCH

    WARD               30 SALES

    TURNER             30 SALES

    ALLEN              30 SALES

 

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    JAMES              30 SALES

    BLAKE              30 SALES

    MARTIN             30 SALES

                       OPERATIONS

 

--左外連接

--注意:左外連接時,加號在等號的右邊

    SQL> select d.dname,e.ename,e.deptno

      2  from dept d,emp e

      3  where d.deptno = e.deptno(+)

      4  order by d.deptno;

 

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    ACCOUNTING     CLARK              10

    ACCOUNTING     KING               10

    ACCOUNTING     MILLER             10

    RESEARCH       JONES              20

    RESEARCH       FORD               20

    RESEARCH       ADAMS              20

    RESEARCH       SMITH              20

    RESEARCH       SCOTT              20

    SALES          WARD               30

    SALES          TURNER             30

    SALES          ALLEN              30

 

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    SALES          JAMES              30

    SALES          BLAKE              30

    SALES          MARTIN             30

    OPERATIONS

 

    15 rows selected.

 

--使用SQL 99寫法實現左外連接               

    SQL> select d.dname,e.ename,e.deptno

      2  from dept d

      3    left join emp e

      4      on d.deptno = e.deptno

      5  order by d.deptno;

 

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    ACCOUNTING     CLARK              10

    ACCOUNTING     KING               10

    ACCOUNTING     MILLER             10

    RESEARCH       JONES              20

    RESEARCH       FORD               20

    RESEARCH       ADAMS              20

    RESEARCH       SMITH              20

    RESEARCH       SCOTT              20

    SALES          WARD               30

    SALES          TURNER             30

    SALES          ALLEN              30

 

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    SALES          JAMES              30

    SALES          BLAKE              30

    SALES          MARTIN             30

    OPERATIONS

 

    15 rows selected.                

 

--自連接

    SQL> select e.ename || ' works for ' || m.ename

      2  from emp e,emp m

      3  where e.empno = m.mgr;

 

    E.ENAME||'WORKSFOR'||M.ENAME

    -------------------------------

    FORD works for SMITH

    BLAKE works for ALLEN

    BLAKE works for WARD

    KING works for JONES

    BLAKE works for MARTIN

    KING works for BLAKE

    KING works for CLARK

    JONES works for SCOTT

    BLAKE works for TURNER

    SCOTT works for ADAMS

    BLAKE works for JAMES

 

    E.ENAME||'WORKSFOR'||M.ENAME

    -------------------------------

    JONES works for FORD

    CLARK works for MILLER

 

    13 rows selected.

 

--自然連接

    SQL> select empno,ename,job,deptno,dname,loc

      2  from emp

      3  natural join dept;

 

        EMPNO ENAME      JOB           DEPTNO DNAME          LOC

    ---------- ---------- --------- ---------- -------------- -------------

         7369 SMITH      CLERK             20 RESEARCH       DALLAS

         7499 ALLEN      SALESMAN          30 SALES          CHICAGO

         7521 WARD       SALESMAN          30 SALES          CHICAGO

         7566 JONES      MANAGER           20 RESEARCH       DALLAS

         7654 MARTIN     SALESMAN          30 SALES          CHICAGO

         7698 BLAKE      MANAGER           30 SALES          CHICAGO

         7782 CLARK      MANAGER           10 ACCOUNTING     NEW YORK

         7788 SCOTT      ANALYST           20 RESEARCH       DALLAS

         7839 KING       PRESIDENT         10 ACCOUNTING     NEW YORK

         7844 TURNER     SALESMAN          30 SALES          CHICAGO

         7876 ADAMS      CLERK             20 RESEARCH       DALLAS

 

        EMPNO ENAME      JOB           DEPTNO DNAME          LOC

    ---------- ---------- --------- ---------- -------------- -------------

         7900 JAMES      CLERK             30 SALES          CHICAGO

         7902 FORD       ANALYST           20 RESEARCH       DALLAS

         7934 MILLER     CLERK             10 ACCOUNTING     NEW YORK

 

    14 rows selected.

 

--使用using 子句創(chuàng)建連接

    SQL> select e.empno,e.ename,d.dname,d.loc

      2  from emp e

      3  join dept d

      4  using (deptno)

      5  where deptno in (20,40);

 

        EMPNO ENAME      DNAME          LOC

    ---------- ---------- -------------- -------------

         7369 SMITH      RESEARCH       DALLAS

         7566 JONES      RESEARCH       DALLAS

         7788 SCOTT      RESEARCH       DALLAS

         7876 ADAMS      RESEARCH       DALLAS

         7902 FORD       RESEARCH       DALLAS

/*

五、更多*/

 

Oracle 數據庫實例啟動關閉過程

 

Oracle 10g SGA 的自動化管理

 

使用OEM,SQL*Plus,iSQL*Plus 管理Oracle實例

 

Oracle實例和Oracle數據庫(Oracle體系結構)

 

SQL 基礎-->常用函數

 

SQL基礎-->過濾和排序

 

SQL 基礎-->SELECT 查詢

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精品欧美在线观看国产| 精品视频一区二区不卡| 亚洲国产精品久久精品成人| 亚洲熟女国产熟女二区三区| 欧美精品日韩精品一区| 大尺度剧情国产在线视频| 欧美日韩亚洲国产综合网| 日本免费熟女一区二区三区| 五月天婷亚洲天婷综合网| 亚洲第一区二区三区女厕偷拍| 国产传媒中文字幕东京热| 内用黄老外示儒术出处| 99久久国产精品成人观看| 深夜视频成人在线观看| 韩日黄片在线免费观看| 麻豆在线观看一区二区| 男人大臿蕉香蕉大视频| 国产精品欧美一区两区| 国产免费一区二区三区不卡| 久久热在线视频免费观看| 免费一级欧美大片免费看| 国产成人综合亚洲欧美日韩| 中文字幕一二区在线观看| 高清不卡一卡二卡区在线| 国产精品亚洲综合色区韩国| 亚洲精品成人福利在线| 午夜国产精品国自产拍av| 少妇被粗大进猛进出处故事| 中文字幕日韩欧美亚洲午夜| 精品熟女少妇一区二区三区| 久久精品国产一区久久久| 最新日韩精品一推荐日韩精品| 亚洲黄片在线免费小视频| 欧美一级不卡视频在线观看| 亚洲一区二区三区福利视频| 日韩在线视频精品中文字幕| 精品亚洲av一区二区三区| 日本加勒比在线观看一区| 国产专区亚洲专区久久| 在线免费看国产精品黄片| 国产日韩熟女中文字幕|