outer join新舊語法分析
從Oracle9i開始,對於外連線(Outer join)Oracle支援SQL92標準:這個標準有很多新的連線語法。外連線的新語法有left outer join和rigth outer join以及full outer join,舊語法外連線使用+號,
另外,舊語法無法實現full outer join,只能用union all來代替。Oracle也強烈建議9i以及之後的版本使用新的外連線語法。
outer join外連線有基表和從表的概念,基表也就是參考表,此表的內容會在outer join中全部選中,然後基表根據join的條件到從表中選出從表記錄,如果滿足條件則按從表實際內容選出,否則沒有找到則從表對應行的所表列值為null。
就新語法而言,比如
左外連結(left outer join)左邊的表是基表,右邊的表是從表,如a left join b則a為基表,b為從表;
右外連結(rigth outer join)右邊的表是基表,左邊的表是從表,如a rigth join b則a為從表,b為基表;
全連結(full outer join)比較特殊,左右邊表互為基表和從表,如a full join b則a,b互為基表和從表。
舊語法來說,在where條件中無(+)號的表示式中的列所屬表為基表,有(+)號的表示式中的列所屬表為從表,比如where a.id=b.id(+)則a為基表,b為從表。
下面測試下新舊語法外連線的差別。
表a,b,c初始化指令碼如下:
外連線舊語法(+)如下:
新語法left(rigth/full) outer join測試程式碼如下:
從上面新語法測試程式碼第一個sql語句中可知,外連線中的on不需要過濾基表資料,過濾基表資料是在where裡做的,on只是連線條件,根據連線條件找匹配的從表資料,找不到匹配的從錶行,則置空。簡單來說on關鍵字,只是連線條件,它不能過濾基表。過濾不了的原因是on過濾掉的a表結果,最後又被left outer join拿了回來。
另外,舊語法無法實現full outer join,只能用union all來代替。Oracle也強烈建議9i以及之後的版本使用新的外連線語法。
outer join外連線有基表和從表的概念,基表也就是參考表,此表的內容會在outer join中全部選中,然後基表根據join的條件到從表中選出從表記錄,如果滿足條件則按從表實際內容選出,否則沒有找到則從表對應行的所表列值為null。
就新語法而言,比如
左外連結(left outer join)左邊的表是基表,右邊的表是從表,如a left join b則a為基表,b為從表;
右外連結(rigth outer join)右邊的表是基表,左邊的表是從表,如a rigth join b則a為從表,b為基表;
全連結(full outer join)比較特殊,左右邊表互為基表和從表,如a full join b則a,b互為基表和從表。
舊語法來說,在where條件中無(+)號的表示式中的列所屬表為基表,有(+)號的表示式中的列所屬表為從表,比如where a.id=b.id(+)則a為基表,b為從表。
下面測試下新舊語法外連線的差別。
表a,b,c初始化指令碼如下:
點選(此處)摺疊或開啟
-
SQL> drop table a;
-
-
表已刪除。
-
-
SQL> create table a as
-
2 select level id,'x'||level name
-
3 from dual connect by level<5
-
4 union all
-
5 select level,'y'||level
-
6 from dual connect by level<5;
-
-
表已建立。
-
-
SQL> drop table b;
-
-
表已刪除。
-
-
SQL> create table b as
-
2 select level id,'x'||level name
-
3 from dual connect by level<3;
-
-
表已建立。
-
-
SQL> drop table c;
-
drop table c
-
*
-
第 1 行出現錯誤:
-
ORA-00942: 表或檢視不存在
-
-
SQL> create table c as
-
2 select level id,'y'||level name
-
3 from dual connect by level<3;
-
-
表已建立。
-
-
SQL> select * from a;
-
-
ID NAME
-
---------- -----------------------------------------
-
-
1 x1
-
2 x2
-
3 x3
-
4 x4
-
1 y1
-
2 y2
-
3 y3
-
4 y4
-
-
已選擇8行。
-
-
SQL> select * from b;
-
-
ID NAME
-
---------- -----------------------------------------
-
-
1 x1
-
2 x2
-
-
SQL> select * from c;
-
-
ID NAME
-
---------- -----------------------------------------
-
-
1 y1
-
2 y2
-
點選(此處)摺疊或開啟
-
SQL> show linesize;
-
linesize 80
-
SQL> set linesize 200;
-
SQL> column name format a10
-
SQL> select * from a,b
-
2 where a.id=b.id(+) and a.name like 'x%';
-
-
ID NAME ID NAME
-
---------- ---------- ---------- ----------
-
-
1 x1 1 x1
-
2 x2 2 x2
-
4 x4
- 3 x3
新語法left(rigth/full) outer join測試程式碼如下:
點選(此處)摺疊或開啟
-
SQL> set null null
-
SQL> select * from a left join b
-
2 on a.id=b.id and a.name like 'x%';
-
-
ID NAME ID NAME
-
---------- ---------- ---------- ----------
-
-
1 x1 1 x1
-
2 x2 2 x2
-
3 x3 null null
-
4 x4 null null
-
1 y1 null null
-
2 y2 null null
-
3 y3 null null
-
4 y4 null null
-
-
已選擇8行。
-
-
SQL> select * from a left join b
-
2 on a.id=b.id
-
3 where a.name like 'x%';
-
-
ID NAME ID NAME
-
---------- ---------- ---------- ----------
-
-
1 x1 1 x1
-
2 x2 2 x2
-
4 x4 null null
-
3 x3 null null
-
-
SQL> select * from a left join b
-
2 on a.name like 'x%'
-
3 where a.id=b.id;
-
-
ID NAME ID NAME
-
---------- ---------- ---------- ----------
-
-
1 x1 1 x1
- 2 x2 2 x2
從上面新語法測試程式碼第一個sql語句中可知,外連線中的on不需要過濾基表資料,過濾基表資料是在where裡做的,on只是連線條件,根據連線條件找匹配的從表資料,找不到匹配的從錶行,則置空。簡單來說on關鍵字,只是連線條件,它不能過濾基表。過濾不了的原因是on過濾掉的a表結果,最後又被left outer join拿了回來。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1068010/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- join、inner join、left join、right join、outer join的區別
- 外連線(outer join)示例
- Inner Join, Left Outer Join和Association的區別
- MySQL Join語法MySql
- 關於Oracle full outer join 的bug問題分析及處理Oracle
- ZT:簡單介紹join,outer-join,semi-join,anti-join的區別
- sql的 INNER JOIN 語法SQL
- 新保險法與舊保險法區別
- 數倉工具—Hive語法之map join、reduce join、smb join(8)Hive
- 使用Partitioned Outer Join實現稠化報表
- Oracle資料庫聯接(inner join ,outer join)和NOT IN的特殊情況Oracle資料庫
- Apache Spark Dataframe Join語法教程ApacheSpark
- 【sql調優之執行計劃】nested loops join and nested loop join outerSQLOOP
- mysql update join,insert select 語法MySql
- 【FULL OUTER JOIN】全外連線的union all改寫方法
- 【原】Oracle中Left Outer Join和外關聯(+)的區別Oracle
- Go 語言的詞法分析和語法分析(1)Go詞法分析語法分析
- oracle left outer join(左聯接)顯示全部的課堂收藏資訊Oracle
- hibernate many-to-one 一些屬性說明(outer-join)
- 【SQL】13 SQL 別名、SQL 連線(JOIN)、SQL INNER JOIN 關鍵字、SQL LEFT JOIN 關鍵字、SQL RIGHT JOIN 關鍵字、SQL FULL OUTER JSQL
- JavaScript 新語法 「雙問號語法」與「可選鏈語法」JavaScript
- Flex佈局新舊混合寫法詳解(相容微信)Flex
- ES6新語法
- PostgreSQL 原始碼解讀(208)- 查詢#121(Valid OUTER JOIN Optimizations)SQL原始碼
- SQL Prompt教程:舊式聯接語法(ST001)SQL
- Go 語言的詞法分析和語法分析(2)—Import宣告的解析Go詞法分析語法分析Import
- 用left outer join(sql)實現只顯示重複行最小id的記錄SQL
- sql語言中join操作SQL
- ES6新語法上
- ES6 新語法 01
- 佇列與DelphiXe新語法佇列
- 轉:JDK1.5新語法JDK
- ORACLE UPDATE 語句語法與效能分析Oracle
- 【編譯原理】語法分析(三)編譯原理語法分析
- 【轉】分析函式語法解析函式
- sql語句中JOIN ON 的使用SQL
- 學習ES6新語法
- 使用 C# 9.0 新語法提升 if 語句美感C#