join用法
條件串連(join)
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2
INNER 和 OUTER 對所有串連(join) 類型都是可選的.INNER 是預設; LEFT,RIGHT,和 FULL 隱含外串連.
串連條件在ON或USING子句裡聲明, 或者用關鍵字NATURAL隱含地聲明.串連條件判斷來自兩個源表 中的那些行是"匹配"的,這些我們將在下面詳細解釋.
ON子句是最常見的串連條件的類型∶它接收一個和WHERE子句裡用的一樣的 布爾值運算式.如果兩個分別來自T1和T2的行在ON運算式上運算的 結果為真,那麼它們就算是匹配的行.
USING是縮寫的概念∶它接收一個用逗號分隔的欄位名字列表, 這些欄位必須是串連表共有的,最終形成一個串連條件,表示 這些欄位對必須相同.最後,JOIN USING 的輸出會為每一對相等 的輸入欄位輸出一個欄位,後面跟著來自各個表的所有其它欄位. 因此,USING (a, b, c) 等效於 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) 只不過是如果使用了ON,那麼在結果裡 a,b,和 c欄位每個都會有兩個, 而用USING的時候每個欄位就只會有一個.
最後,NATURAL 是USING 的縮寫形式∶它形成一個 USING 列表, 該列表由那些在兩個表裡都出現了的欄位名字組成.和USING一樣, 這些欄位只在輸出表裡出現一次.
條件JOIN的可能類型是∶
INNER JOIN
對於 T1 的每一行 R1,產生的串連表都有一行對應 T2 中的 每一個滿足和 R1 的串連條件的行.
LEFT OUTER JOIN
首先,執行一次內串連.然後,為 T1 裡那些和 T2 裡任何一行都不滿足串連條件的行返回一個串連行, 同時該串連行裡對應 T2 的列用空值補齊.因此, 產生的串連表裡無條件地包含來自 T1 裡的每一行至少 一個副本.
RIGHT OUTER JOIN
首先,執行一次內串連.然後,為 T2 裡那些和 T1 裡任何一行都不滿足串連條件的行返回一個串連行, 同時該串連行裡對應 T1 的列用空值補齊.因此, 產生的串連表裡無條件地包含來自 T2 裡的每一行.
FULL OUTER JOIN
首先,執行一次內串連.然後,為 T1 裡那些和 T2 裡任何一行都不滿足串連條件的行返回一個串連行, 同時該串連行裡對應 T2 的列用空值補齊. 同樣,為 T2 裡那些和 T1 裡的任何行都不滿足串連條件的 行返回一個串連行,該行裡對應 T1 的列用空值補齊.
如果 T1 和 T2 有一個或者都是可以串連(join)的表, 那麼所有類型的串連都可以串在一起或嵌套在一起. 你可以在JOIN子句周圍使用圓括弧來控制串連順序, 如果沒有圓括弧,那麼JOIN子句是從左向右嵌套的.
舉例說明:
--建立部門表R_DEPT,僱員表r_empd
create table R_DEPT
(
DEPTNO NUMBER(10) not null,
DEPTNAME VARCHAR2(30) not null
);
alter table R_DEPT
add constraint PK_R_DEPT primary key (DEPTNO);
create table R_EMPD
(
EMPNO NUMBER(10) not null,
FNAME VARCHAR2(20),
LNAME VARCHAR2(20),
DEPT NUMBER(10)
);
alter table R_EMPD
add constraint PK_EMP primary key (EMPNO);
部門表資料
select * from r_dept;
僱員表資料
select * from r_empd;
INNER JOIN如下:
- 以下兩個查詢條件效果一樣
select d.*,e.* from r_dept d,r_empd e where d.deptno = e.dept and d.deptno>2;
select d.*,e.* from r_dept d inner join r_empd e on d.deptno = e.dept and d.deptno>2;結果如下:
LEFT JOIN如下:
隱藏行號 複製代碼 ? 這是一段程式碼。
select d.*,e.* from r_dept d inner join r_empd e on d.deptno = e.dept and d.deptno>2;
select d.*,e.* from r_dept d left join r_empd e on d.deptno = e.dept and d.deptno>2;
LEFT OUTER JOIN
首先,執行一次內串連.然後,為 T1 裡那些和 T2 裡任何一行都不滿足串連條件的行返回一個串連行, 同時該串連行裡對應 T2 的列用空值補齊.因此, 產生的串連表裡無條件地包含來自 T1 裡的每一行至少 一個副本.
首先執行一次內串連,尋找到deptno 為3、4、5的三條資料,然後不滿足查詢條件d.deptno = e.dept and d.deptno>2的四條資料………………..
隱藏行號 複製代碼 ? 這是一段程式碼。
select d.*,e.* from r_dept d full join r_empd e on d.deptno = e.dept and d.deptno>2 where d.deptno>3;
可以分析下上面語句執行結果,首先執行where條件,然後執行join串連;根據where條件過濾掉部門id小於3的,然後執行join串連,結果如下:
該測試是在oracle下執行的,SQLSERVER應該一樣,可以測試下………………