Oracle內連接、左外連接、右外連接、全外連接以及(+)號用法 1、數據準備階段 創建資料庫表,並插入數據,用於學習和測試. 先進行簡單的單表查詢. 2、內連接(join/inner join) 左表和右表都要做限制,僅顯示滿足on後麵條件的數據。 3、左外連接(left outer join/ ...
Oracle內連接、左外連接、右外連接、全外連接以及(+)號用法
1、數據準備階段
創建資料庫表,並插入數據,用於學習和測試.
drop table t_001; drop table t_002; CREATE TABLE t_001 ( ID NUMBER NOT NULL, NAME VARCHAR2(8) NOT NULL, constraint t_001_id_pk primary key(id) ); CREATE TABLE t_002 ( ID NUMBER NOT NULL, NAME VARCHAR2(8) NOT NULL, constraint t_002_id_pk primary key(id) ); INSERT INTO t_001 VALUES (1, 'CC'); INSERT INTO t_001 VALUES (2, 'HL'); INSERT INTO t_001 VALUES (3, 'WJ'); INSERT INTO t_001 VALUES (5, 'ZY'); INSERT INTO t_001 VALUES (7, 'XJ'); INSERT INTO t_002 VALUES (1, 'ZHB'); INSERT INTO t_002 VALUES (2, 'XDH'); INSERT INTO t_002 VALUES (3, 'WLZ'); INSERT INTO t_002 VALUES (4, 'HGL'); INSERT INTO t_002 VALUES (6, 'YSQ');
先進行簡單的單表查詢.
2、內連接(join/inner join)
select * from t_001 t1 inner join t_002 t2 on t1.id=t2.id;
左表和右表都要做限制,僅顯示滿足on後麵條件的數據。
select * from t_001 t1 join t_002 t2 on t1.id=t2.id;
select * from t_001 t1,t_002 t2 where t1.id=t2.id;
3、左外連接(left outer join/ left join)
select * from t_001 t1 left join t_002 t2 on t1.id=t2.id;
left join是以左表的記錄為基礎的,示例中t_001可以看成左表,t_002可以看成右表,它的結果集是t_001表中的全部數據,再加上t_001表和t_002表匹配後的數據。換句話說,左表(t_001)的記錄將會全部表示出來,而右表(t_002)只會顯示符合搜索條件的記錄。t_002表記錄不足的地方均為null。
select * from t_001 t1,t_002 t2 where t1.id=t2.id(+);
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。如果加號寫在右表,左表就是全部顯示,所以是左連接。
4、右外連接(right outer join/ right join)
select * from t_001 t1 right join t_002 t2 on t1.id=t2.id;
和left join的結果剛好相反,是以右表(t_002)為基礎的。它的結果集是t_002表所有記錄,再加上t_001和t_002匹配後的數據。 t_001表記錄不足的地方均為null。
select * from t_001 t1,t_002 t2 where t1.id(+)=t2.id;
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。如果加號寫在左表,右表就是全部顯示,所以是右連接。
5、全外連接(full outer join/ full join)
select * from t_001 t1 full join t_002 t2 on t1.id=t2.id;
左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方均為null。
全外連接不支持(+)寫法。
6、總結
Oracle 連接(inner/outer join)包括以下:
- 內連接(兩邊的表都加限制)--inner join
- 左外連接(左邊的表不加限制)--left [outer] join
- 右外連接(右邊的表不加限制)--right [outer] join
- 全外連接(左右兩表都不加限制)--full [outer] join
對應sql: 通常外聯接省略outer關鍵字, 寫成:left/right/full join.
內連接也可省略關鍵字inner,直接寫成join.
在左連接和右連接時都會以一張001表為基礎表,該表的內容會全部顯示,然後加上001表和002表匹配的內容。 如果001表的數據在002表中沒有記錄。 那麼在相關聯的結果集行中列顯示為空值(null)。
內連接,可以使用"(+)",但是必須省略。即兩張表均為"主表",都不是匹配表。
而對於外連接, 也可以使用“(+) ”來表示。 關於外聯接使用(+)的一些註意事項:
- (+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
- 當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符。
- (+)操作符只適用於列,而不能用在表達式上。
- (+)操作符不能與or和in操作符一起使用。
- (+)操作符只能用於實現左外連接和右外連接,而不能用於實現完全外連接。