posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Oracle9i的簡(jiǎn)化SQL語(yǔ)法

          Oracle對(duì)Oracle9i SQL 做了一些很重要的改進(jìn),包括一些令人興奮的新特點(diǎn),支持1:5的數(shù)量級(jí)和ISO99中的SQL標(biāo)準(zhǔn)。作為Oracle的補(bǔ)充,它包括以下新的TABLE JOIN的句法結(jié)構(gòu):

          CROSS IN——它在兩個(gè)表格中創(chuàng)建了一個(gè)卡迪爾列,就象是在Oracle8i中沒(méi)寫(xiě)WHERE時(shí)那樣。

          NATURAL JOIN——這是一個(gè)很有用的Oracle9i的句法,它通過(guò)從WHERE子句中移動(dòng)連接標(biāo)準(zhǔn)來(lái)改善SQL的穩(wěn)定性

          USING子句——它可以通過(guò)名字來(lái)具體指定連接

          ON子句——這個(gè)句法允許在兩個(gè)表格中為連接具體指定欄目的名頭
          LEFT OUTER JOIN——它返回表格中左邊的行和右邊的數(shù)值,如果沒(méi)有搭配的行的話,則返回零

          RIGHT OUTER JOIN——它返回表格中右邊的行和左邊的數(shù)值,如果沒(méi)有搭配的行的話,則返回零

          FULL OUTER JOIN——它返回的是兩個(gè)表格中所有的行,用零填滿每一個(gè)空格。這在Oracle8i中則沒(méi)有相應(yīng)的此種句法

          大多數(shù)改進(jìn)都是為了讓那些非Oracle的請(qǐng)求以快速的進(jìn)入Oracle數(shù)據(jù)庫(kù)而引進(jìn)的,并且必須記住這些只是句法上的不同,ISO99標(biāo)準(zhǔn)并沒(méi)有給Oracle9i SQL帶來(lái)任何新的功能。

          The CROSS JOIN
          在Oracle中,CROSS JOIN產(chǎn)生了一個(gè)“卡迪爾的產(chǎn)物(Cartesian product)”,就象是在連接兩個(gè)表格時(shí)忘記加入一個(gè)WHERE子句一樣
          select last_name,dept_id
          from emp,depts;

          在Oracle9i中,我們使用CROSS JOIN 來(lái)達(dá)到相同的結(jié)果
          select last_name.dept_id
          from emp
          CROSS JOIN dept;

          NATURAL JOIN


          我喜歡NATURAL JOIN的原因在于它能夠通過(guò)在兩個(gè)表格中配對(duì)的欄目的名頭來(lái)自動(dòng)的檢查join。它同時(shí)還簡(jiǎn)化了Oracle9i SQL,由于where子句僅僅只能過(guò)濾謂語(yǔ),當(dāng)然,NATURAL JOIN要求在每一個(gè)表格中的欄目的名字相同。很有意思的是,這種特性甚至在沒(méi)有主要的或是外來(lái)的關(guān)鍵詞作為參考是也能起作用

           

          Oracle8i,
          Select book_title, sum(quantity)
          From book, sales
          Where book.book_id = sales.book_id
          group by book_title;

          Oracle9i
          Select book_title, sum(quantity)
          from book
          natural join sales
          group by book_title;

          USING子句
          假如幾個(gè)欄目有同樣的名字,而你又不想用所有的這些欄目來(lái)連接的時(shí)候,你就可以用USING子句。在USING子句中所列的欄目的句子中不會(huì)有任何的修飾詞,包括where子句也不會(huì)有
          Oracle8i
          select dept_id, city
          from departments, locations
          where departments.location_id = location.location_id;

          Oracle9i
          select department_name, city
          from departments
          JOIN locations
          USING (location_id);

          ON子句
          ON子句被用于當(dāng)在兩個(gè)表格中的欄目名字不搭配時(shí)來(lái)連接表格。而連接條件就是where子句中的過(guò)濾條件
          Oracle8i
          select department_name, city
          from department, location
          where department.location_id = location.loc_id;

          Oracle9i
          select department_name, city
          from department d
          JOIN location l
          ON (d.location_id = l.id);

          易變的連接
          易變的連接就是兩個(gè)以上的表格被連接所用的。ISO SQL 1999標(biāo)準(zhǔn)通常假設(shè)表格從左至右連接,連接的條件是能夠?yàn)楝F(xiàn)在的連接或以前的與左邊的連接相關(guān)聯(lián)的欄目提供參考。
          Oracle8i
          select emp_id, city_name, dept_name
          from location l, department d, emp e
          where d.location_id = l.location_id
          and d.department_id = e.department_id;

          Oracle9i
          select emp_id, city_name, dept_name
          from locations l
          JOIN departments d ON (d.location_id = l.location_id)
          JOIN employees e ON (d.department_id = e.department_id);


          新的OUTER JOIN句法

           

          ISO99標(biāo)準(zhǔn)把復(fù)雜的加號(hào)從Oracle outer join中拿出去,并使得outer join SQL更容易理解。

          LEFT OUTER JOIN
          在LEFT OUTER JOIN中,會(huì)返回所有左邊表格中的行,甚至在被連接的表格中沒(méi)有可配對(duì)的欄目的情況下也如此。在下邊的例子中,返回了所有雇員的姓,甚至包括了那些沒(méi)有分配到部門(mén)的雇員。
          Oracle8i
          select last_name, dept_id
          from emp e, dept d
          where e.department_id = d.department_id(+);

          Oracle9i
          select last_name, dept_id
          from emp
          LEFT OUTER JOIN Dept
          ON e.dept_id = d.dept_id;

          RIGHT OUTER JOIN
          在RIGHT OUTER JOIN中返回的是表格中所有右邊的行,甚至在被連接的表格中沒(méi)有可配對(duì)的欄目的情況下也如此。在這個(gè)例子中,返回了所有部門(mén)的ID,包括那些沒(méi)有一個(gè)雇員的的部門(mén)。
          Oracle8i
          select last_name, d.dept_id
          from employees e, departments d
          where e.department_id(+) = d.department_id;

          Oracle9i
          select last_name, d.dept_id
          from employees e
          RIGHT OUTER JOIN departments d
          ON (e.department_id = d.department_id);


          總結(jié)

          ISO99標(biāo)準(zhǔn)是Oracle改進(jìn)SQL工具的另一個(gè)例子。NATURAL JOIN LEFT OUTER JOIN 和 RIGHT OUTER JOIN是這些改進(jìn)中最受歡迎的,它們分別簡(jiǎn)化了SQL句法以及消除了對(duì)于復(fù)雜句法(比如+)的需要。

          主站蜘蛛池模板: 齐齐哈尔市| 乡宁县| 灌云县| 板桥市| 曲麻莱县| 吉首市| 神农架林区| 黄石市| 满洲里市| 家居| 石渠县| 绍兴县| 株洲县| 上思县| 尉氏县| 苍梧县| 介休市| 江城| 中卫市| 五指山市| 高州市| 宣城市| 通州市| 定州市| 重庆市| 淅川县| 垣曲县| 志丹县| 靖江市| 边坝县| 磐安县| 双桥区| 景洪市| 西青区| 福安市| 台前县| 文登市| 石城县| 宁国市| 克东县| 宁安市|