㈠ sql資料庫中 inner join和outer join的區別
對於SQL中inner join、outer join和cross join的區別,如果你使用join連表,缺陷的情況下是inner join,另外,開發中使用的left join和right join屬於outer join,另外outer join還包括full join.下面我通過圖標讓大家認識它們的區別。
現有兩張表,Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的:
1.INNER JOIN 產生的結果是AB的交集
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
2.LEFT [OUTER] JOIN 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
3.RIGHT [OUTER] JOIN 產生表B的完全集,而A表中匹配的則有值,沒有匹配的則以null值取代。
SELECT * FROM TableA RIGHT OUTER JOIN TableB ON TableA.name = TableB.name
圖標如left join類似。
4.FULL [OUTER] JOIN 產生A和B的並集。對於沒有匹配的記錄,則會以null做為值。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
你可以通過is NULL將沒有匹配的值找出來:
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null
㈡ SSQL中left outer join的語句的outer 起作用嗎
應該不起作用,只是外連接的標志吧,因為我寫sql語句直接left join 或是 right join 和加了outer的結果一樣。
㈢ sql語句中natural的用法是什麼
你看看這個:
natural
--
1)兩個關系(左關系和友關系)中所有具有相同的名稱的屬性的值要相等。
2)natural
總是出現在
join語句前面
3)natural的結果關系中,相同名稱的屬性只會出現一次
4)natural的結果關系中,屬性的排列順序總是按照左關系優先的原則。
5)
MySQL中,natural
join不能使用on指定其他查詢條件
on--
1)on
用在join語句後面
2)on
後面採用關系1.屬性a=關系2.屬性b
的謂詞語法
連接分類
關系間的連接分為內連接(inner
join)和外連接(outer
join)。
外連接又可分為:left
outer
join,right
outer
join和full
outer
join。
內連接計算方法:
如果不加條件將會產生笛卡爾積;
如果有連接條件,按照下一節"連接條件"的規則進行運算,符合條件的元組放入結果關系中。
left
outer
join
計算過程:
1)計算相同連接條件下的內連接,將符合條件的元組放入結果關系中;
2)如果左關系中有元組不符合條件,將之放入結果關系中,餘下的用NULL補足
right
outer
join
計算過程:
1)計算相同連接條件下的內連接,將符合條件的元組放入結果關系中;
2)如果右關系中有元組不符合條件,將之放入結果關系中,餘下的用NULL補足
full
outer
join
1)計算相同連接條件下的內連接,將符合條件的元組放入結果關系中;
2)如果左、右關系中有元組不符合條件,將之放入結果關系中,餘下的用NULL補足
as用來修改連接後結果關系的關系名稱以及屬性名稱。
連接條件
關系之間的連接是可以有條件的,外連接必須要加條件,內連接如果不加條件將會產生笛卡爾積。
有哪些連接條件呢?
natural
--
1)兩個關系(左關系和友關系)中所有具有相同的名稱的屬性的值要相等。
2)natural
總是出現在
join語句前面
3)natural的結果關系中,相同名稱的屬性只會出現一次
4)natural的結果關系中,屬性的排列順序總是按照左關系優先的原則。
5)
MySQL中,natural
join不能使用on指定其他查詢條件
on--
1)on
用在join語句後面
2)on
後面採用關系1.屬性a=關系2.屬性b
的謂詞語法
using--
1)和natural類似,只是顯式指定了屬性名稱
2)如果using也指定了所有相同名稱的屬性,那麼和natural相同
MySQL
MySQL中,natural
join和
left
outer
join不能在同時使用,可以先將natural
join語句做成一個view,然後再使用left
outer
join
join
默認為inner
join
㈣ SQL中查詢的 LEFT OUTER JOIN語句是什麼意思
1:LEFT [OUTER] JOIN產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。可簡寫成left join,join默認都是outer屬性。RIGHT JOIN 與之相反
4:CROSS JOIN把表A和表B的數據進行一個N*M的組合,即笛卡爾積。如本例會產生4*4=16條記錄,在開發過程中我們肯定是要過濾數據,所以這種很少用。
㈤ 在SQL中 如何正確使用各種聯接查詢
SELECT--SQL語法
從一個或多個表中檢索數據。SELECT SQL 命令是與其它 Vfp一樣的內置的 Vfp命令。當你使用 SELECT 來生成查詢時, Vfp翻譯查詢並從表中獲取指定數據。你可以從以下地方創建 SELECT 查詢:
「命令」窗口中
帶有其它任何 Vfp命令的 Vfp程序中
查詢設計器中
SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] [Alias.] Select_Item
[[AS] Column_Name] [, [Alias.] Select_Item [[AS] Column_Name] ...]
FROM [FORCE] [DatabaseName!] Table [[AS] Local_Alias]
[ [INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN DatabaseName!]
Table [[AS] Local_Alias] [ON JoinCondition ...]
[[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]]
[PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT]
[WHERE JoinCondition [AND JoinCondition ...] [AND | OR FilterCondition [AND | OR FilterCondition ...]]]
[Group By GroupColumn [, GroupColumn ...]] [HAVING FilterCondition] [UNION [ALL] SELECTCommand]
[Order By Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]
參數
SELECT
在 SELECT 子句中指定在查詢結果中包含的欄位、常量和表達式。
ALL
查詢結果中包含所有行 ( 包括重復值 )。ALL 是默認設置。
DISTINCT
在查詢結果中剔除重復的行。每一個 SELECT 子句只能使用一次 DISTINCT。
TOP nExpr [PERCENT]
在符合查詢條件的所有記錄中,選取指定數量或百分比的記錄。TOP 子句必須與 ORDER BY 子句同時使用。ORDER BY 子句指定查詢結果中包含的列上由Top字句決定的行數, TOP 子句根據此排序選定最開始的 nExpr個或 nExpr% 的記錄。
您可以指定選取 1 到 32767 個記錄。使用 ORDER BY 子句指定的欄位進行排序,會產生並列的情況,比如,可能有多個記錄,它們在選定的欄位上相同;所以,如果您指定 nExpr 為 10,在查詢結果中可能多於 10 個記錄,因為可能有幾個記錄位置並列。
如果包含 PERCENT 關鍵字指定查詢結果中的記錄數,得到記錄數的可能是小數,這時進行取整。包含 PERCENT 關鍵字時,nExpr 的范圍是 0.01 到 99.99。
[Alias.] Select_Item
限定匹配項的名稱。Select_Item 指定的每一項在查詢結果中都生成一列。一個項可以是以下一個
FROM 子句所包含的表中的欄位名稱。
一個常量,查詢結果中每一行都出現這個常量值。
一個表達式,可以是用戶自定義函數名。
關於使用用戶定義函數的詳細信息, 參見注釋節中的帶用戶定義函數的 SELECT。
你用 Select_Item 指定的各項生成一個查詢結果列。
如果兩個或更多的項具有相同的名稱, 在項名前包含表別名和一個句點來避免列重復。
[AS] Column_Name
為查詢輸出中的列指定顯示名。Column_Name 可以是表達式但不能包含不允許的字元, 如, 欄位名中的空格。
當 Select_Item 是一個表達式或包含一個欄位函數而且你想給該列一個有意義的名字時該選項是有用的。
FROM [FORCE] DatabaseName!
列出所有從中檢索數據的表。
FORCE 指定連接表時按它們出現在 FROM 子句中的順序。如果省略 FORCE, Vfp會試圖對查詢進行優化。但是, 使用 FORCE 子句,避免了優化過程,可能加快查詢執行的速度。
當包含表的資料庫不是當前資料庫時,DatabaseName! 指定這個資料庫的名稱。如果資料庫不是當前資料庫,就必須指定包含表的資料庫名稱。應在資料庫名稱之後表名之前加上感嘆號(!)分隔符。
[[AS] Local_Alias]
為 Table 中的表指定一個臨時名稱。如果指定了本地別名,那麼在整個SELECT 語句中必須都用這個別名代替表名。本地別名不影響 Visual FoxPro環境。INNER JOIN 只有在其他表中包含對應記錄(一個或多個)的記錄才出現在查詢結果中。
INNER JOIN 只有在其他表中包含對應記錄(一個或多個)的記錄才出現在查詢結果中。
LEFT [OUTER] JOIN 在查詢結果中包含:JOIN 左側表中的所有記錄,以及JOIN 右側表中匹配的記錄。OUTER 關鍵字可被省略;包含 OUTER 強調這是一個外連接 (outer join)。
RIGHT [OUTER] JOIN 在查詢結果中包含:JOIN 右側表中的所有記錄,以及 JOIN 左側表中匹配的記錄。OUTER 關鍵字可被省略;包含 OUTER 強調這是一個外連接接 (outer join)。
FULL [OUTER] JOIN 在查詢結果中包含:JOIN 兩側所有的匹配記錄,和不匹配的記錄;包含 OUTER 強調這是一個外連接 (outer join)。
關於連接的詳細信息, 參見備注段中的 Joins。
ON JoinCondition 指定連接條件。
INTO Destination
指定在何處保存查詢結果。Destination 可以是下列子句之一:
ARRAY ArrayName ,將查詢結果保存到變數數組中。
如果查詢結果中不包含任何記錄,則不創建這個數組。
CURSOR CursorName [NOFILTER | READWRITE] 將查詢結果保存到臨時表中。
要創建一個查用於子查詢中的游標, 用 NOFILTER。關於 NOFILTER 的詳細信息, 參見備注節。
要指定游標是臨時的和可修改的, 使用 READWRITE。如果源表或表使用 autoincrementing, 該設置不會被 READWRITE 游標繼承。
DBF | TABLE TableName [DATABASE DatabaseName [NAME LongTableName]] 保存查詢結果到一個表中。
包含 DATABASE DatabaseName 以指定添加了表的資料庫。
包含 NAME LongTableName 可以為該表命一個最多可包括 128 個字元的並且可以在資料庫中代替短名字的長名。
如果沒有包括 INTO 子句, 查詢結果顯示在一個「瀏覽」窗口中。也可以用 TO FILE 子句來定向查詢結果到列印機或一個文件。
TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN
定向查詢結果到列印機或一個文件。
ADDITIVE 添加查詢輸出到 TO FILE FileName 中指定的已存在的文本文件內容中。
TO PRINTER 定向查詢輸出到一個列印機。在列印開始之前,使用可選的 PROMPT 子句顯示一個對話框。您可以根據當前安裝的列印機驅動程序調整列印機的設置。將 PROMPT 子句放置在緊跟 TO PRINTER 之後。
TO SCREEN 使查詢結果定向輸出到 Vfp主窗口或活動的用戶自定義窗口中。
PREFERENCE PreferenceName
如果查詢結果送往瀏覽窗口,就可以使用 PREFERENCE 保存瀏覽窗口的屬性和選項以備後用。關於 PREFERENCE 功能的詳細信息, 參見備注節。
NOCONSOLE
不顯示送到文件、列印機或 Vfp主窗口的查詢結果。
PLAIN
防止列標題出現在顯示的查詢結果中。不管有無 TO 子句都可使用 PLAIN子句。如果 SELECT 語句中包括 INTO 子句,則忽略 PLAIN 子句。
NOWAIT
打開瀏覽窗口並將查詢結果輸出到這個窗口後繼續程序的執行。程序並不等待關閉瀏覽窗口,而是立即執行緊接在 SELECT 語句後面的程序行。關於如何使用 NOWAIT 的說明, 參見備注節。
WHERE JoinCondition
指定 Vfp的查詢結果中只包括符合指定條件的記錄。JoinCondition 指定位於 FROM 子句中的欄位連接表。關於指定連接條件的詳細信息, 參見備注節。
WHERE 支持 JoinCondition 的 ESCAPE 操作符, 讓你可以執行包含有百分號 (%) 和下劃線 (_) 通配符的 SELECT SQL 命令查詢。ESCAPE 允許你指定一個按原字樣處理的 SELECT SQL 命令通配符。在 ESCAPE 子句中, 一旦一個字元被放到通配符字元之前,就表示這個通配符被看作一個文字字元。
FilterCondition
指定將包含在查詢結果中記錄必須符合的條件。使用 AND 或 OR 操作符,您可以包含隨意數目的過濾條件。您還可以使用 NOT 操作符將邏輯表達式的值取反,或使用 EMPTY() 函數以檢查空欄位。
SELECT SQL 命令在篩選條件中支持 "<field> IS / IS NOT NULL"。要學習如何使用 FilterCondition。
Group By GroupColumn [, GroupColumn ...]
按列的值對查詢結果的行進行分組。GroupColumn 可以是常規的表欄位名,也可以是一個包含 SQL 欄位函數的欄位名,還可以是一個數值表達式,指定查詢結果表中的列位置(最左邊的列編號為 1 )。
HAVING FilterCondition
指定包括在查詢結果中的組必須滿足的篩選條件。HAVING 應該同 GROUP BY一起使用。它能包含數量不限的篩選條件,篩選條件用 AND 或 OR 連接,還可以使用 NOT 來對邏輯表達式求反。可以在 HAVING 子句中使用本地別名和欄位函數。 關於你可以使用的欄位函數的詳細信息, 參見備注節。FilterCondition 不能包含子查詢。
可以使用帶 HAVING 子句的 Group By。使用 HAVING 子句的命令如果沒有使用 GROUP BY 子句,則它的作用與WHERE 子句相同。
如果 HAVING 子句不包含欄位函數的話,使用 WHERE 子句可以獲得較快的速度。
HAVING 子句應該出現在 INTO 子句前否則產生錯誤。
[UNION [ALL] SELECTCommand]
把一個 SELECT 語句的最後查詢結果同另一個 SELECT 語句最後查詢結果組合起來。默認情況下,UNION 檢查組合的結果並排除重復的行。
要組合多個UNION 子句,可使用括弧。可以用 UNION 子句模擬一個外部聯接。
ALL 防止 UNION 刪除組合結果中重復的行。
當一個列是備注或通用型時, 不允許連接不同類型的列。
在 Vfp8.0 以前的版本中, 當在兩個不同類型的欄位上執行 UNION 操作時你需要執行明確的轉換。
Vfp現在對支持它的數據類型支持隱含數據類型轉換。關於隱含數據類型轉換和數據類型優先, UNION 子句允許的規則, 以及其它信息的詳細內容, 參見備注節中的數據類型轉換和優先。
Order By Order_Item [ASC | DESC]
根據列的數據對查詢結果進行排序。每個 Order_Item 都必須對應查詢結果中的一列。它可以是下列之一:
FROM 子句中表的欄位,同時也是 SELECT 主句(不在子查詢中)的一個選擇項。
一個數值表達式,表示查詢結果中列的位置(最左邊列編號為 1 )。
ASC 指定查詢結果根據排序項以升序排列。它是 ORDER BY 的默認選項。
DESC 指定查詢結果以降序排列。
備注
在使用 FROM 子句時如果沒有打開表, Vfp顯示「打開」對話框讓你指定文件位置。一但打開後, 表在查詢完成後仍然保持打開。
當在 Destination 參數中使用 CURSOR 子句時, 如果你指定了一個打開的表的名字, Vfp產生一條錯誤信息。在 SELECT 執行後, 臨時游標保持打開並是活動的和只讀的除非你指定了 READWRITE 選項。當你關閉該臨時游標時, 它被刪除。游標可以指定 SORTWORK 而成為存在於驅動器或卷上的臨時文件。
當在 Destination 參數中使用 CURSOR 子句時, 你現在可以使用 NOFILTER 來創建一個可用於後來的查詢的游標。在早期版本的 Vfp中, 你需要包括一個額外的常數或表達式作為篩選。例如, 添加一個邏輯 true 作為篩選表達式來創建一個可用於後來的查詢的查詢:
SELECT *, .T. FROM customers INTO CURSOR myquery
但是, 包括 NOFILTER 會降低查詢性能因為要在磁碟上創建一個臨時表。臨時表在游標關閉時從磁碟上刪除。
當在 Destination 參數中使用 DBF | TABLE 子句時, 如果你指定了一個已經打開的表, 而且 SET SAFETY 是設置為 OFF, Vfp不警告地復寫該表。如果你沒有指定一個擴展名, Vfp給表一個 .dbf 擴展名。在 SELECT 執行後表保持打開並且是活動的。
如果你在相同查詢中包括 INTO 和 TO 子句, Vfp忽略 TO 子句。如果你包括 TO 子句但沒有包括 INTO 子句, 你可以定向查詢結果到一個名為 FileName 的 ASCII 文本文件, 到列印機, 或到 Vfp主窗口。
PREFERENCE 把特徵, 屬性或參數選項長期保存在 FoxUser.dbf 資源文件中。Preferences 可以在任何時候獲取。第一次執行有 PREFERENCE Preference Name 的 SELECT 命令時創建參數選項。以後執行有相同參數選項名的 SELECT 命令時便將瀏覽窗口恢復到原來的參數選項狀態。當瀏覽窗口關閉時,更新參數選項。如果您按下 CTRL+Q+W 鍵退出「瀏覽」窗口,您對「瀏覽」窗口所做的更改不會保存到資源文件中。
SELECT 命令中包括 TO SCREEN 可以把查詢結果定向輸出到 Vfp主窗口或用戶自定義窗口。如果顯示時 Vfp主窗口或用戶自定義窗口中寫滿了一屏,就暫停輸出。按任意鍵可以查看查詢結果後面的內容。但是,如果命令中包括了 NOWAIT 子句,顯示查詢結果時就不會暫停,等待按鍵,而是在 Vfp主窗口或用戶自定義窗口中連續滾過所有內容。如果命令中包含有 INTO 子句,忽略 NOWAIT 子句。
在一個 SQL 查詢的 WHERE 子句中包括 EVALUATE() 函數會返回不正確的數據。
如果包括一個以上的表在查詢中, 你應該在第一個以後為每一個表指定一個連接條件。連接條件可以包含篩選條件。
注意 每一個 SELECT 語句的最大連接數是 9.
必須用 AND 操作符來連接多個連接條件。各連接條件具有以下格式:
當你在串中使用 = 操作符時, 它的動作根據 SET ANSI 的設置會不同。當 SET ANSI 設置為 OFF 時, Vfp只比較串到較短串結束。當 SET ANSI 設置為 ON 時, Vfp遵循 ANSI 標準的字元串比較。關於 Vfp如果執行字元串比較的額外信息, 參見 SET ANSI 和 SET EXACT。
下列欄位函數可以與選定項一起使用,選定項可以是一個欄位或包含欄位的表達式:
AVG(Select_Item), 計算列中數值的平均值。
COUNT(Select_Item), 計算列中選定項的數目。計算查詢輸出的行數。COUNT(*) 計算查詢輸出中的行數。
MIN(Select_Item), 確定列中 Select_Item 的最小值。
MAX(Select_Item), 確定列中 Select_Item 的最大值。
SUM(Select_Item), 計算列中數值的和。
欄位函數不能嵌套使用。
UNION 子句遵守下列規則:
不能使用 UNION 來組合子查詢。
兩個 SELECT 命令的查詢結果中的列數必須相同。
兩個 SELECT 查詢結果中的對應列必須有相同的數據類型和寬度。
只有最後的 SELECT 中可以包含 ORDER BY 子句,而且必須按編號指出所輸出的列。如果包含了一個 ORDER BY 子句,它將影響整個結果。
當你用 UNION 連接查詢中的兩個表時, 僅匹配連接欄位值的記錄會出現在查詢結果中。如果在父表中的記錄在子表中沒有相應的記錄, 父表中的記錄不會出現在查詢結果中。一個外部聯接允許你包括父表中的所有記錄到輸出結果中, 連同子表中的匹配記錄一起。要在 Vfp中創建一個外部聯接, 你需要要使用一個嵌套的 SELECT 命令
注意 確信在每一個分號前包括一個空格。否則, Vfp產生一個錯誤。
上例中, 在 UNION 子句前的部分的命令從兩個表中選擇具有匹配值的記錄。不包括沒有相關的發票的客戶公司。命令中 UNION 子句後的部分選擇客戶表中的在訂單表中無匹配記錄的記錄。
關於第二部分的命令, 注意以下幾點:
包括在園括弧中的 SELECT 語句首先處理。該語句的結果是選擇訂單表中的所有客戶編號。
WHERE 子句找出 customer 表中的在 orders 表沒有相關記錄的所有客戶編號。由於第一節中的命令提供了所在 orders 表中有客戶編號的公司, Customer 表中的所有公司現在都包含在查詢結果中了。
因為在 UNION 中的表的結構必須相同, 有兩個佔位符在第二個 SELECT 語句中來代表第一個 SELECT 語句中的 orders.order_id 和 orders.emp_id。
注意 佔位符必須與它們所代表的欄位有相同類型。如果欄位是日期型, 佔位符應該是 。如果欄位是一個字元欄位, 佔位符應該是一個空串 ("")。
如果你沒有在 Order By 子句中指定排序, 查詢結果顯示為未排序。
當你發出 SET TALK ON 並執行 SELECT 時, Vfp顯示查詢使用的時間和結果中的記錄數。 _TALLY 包含了在查詢結果中的記錄數。
SET FILTER 設置的篩選條件對 SELECT 命令不起作用。
注意 下面部分提到的子查詢, 是指在 SELECT 命令中包含的 SELECT 命令。子查詢必須包括在園括弧中。在 SELECT 命令的 WHERE 子句中可以包含最多兩個平級的(非嵌套)的子查詢。子查詢中可以有多個連接條件 (join conditions)。
在你創建查詢輸出時, 列的命名遵循如下規則:
如果選擇項是具有唯一名稱的欄位,則用欄位名作為輸出列名。
如果多個選擇項具有相同名稱。例如,如果名為 Customer 的表有一個STREET 欄位,而名為 Employees 的表也有一個 STREET 欄位,則輸出列命名為 Extension_A 和 Extension_B (STREET_A 和 STREET_B)。如果選擇項名稱有 10 字元長,可以將名稱截短後再加下劃線和字母。例如,DEPARTMENT 變為 DEPARTME_A。
如果選擇項是表達式,它的輸出列命名為 EXP_A。其他表達式分別命名為EXP_B、EXP_C,依此類推。
如果選擇項包含諸如 COUNT() 這樣的欄位函數,則輸出列命名為CNT_A。如果另一個選擇項包含 SUM(),它的輸出列命名為 SUM_B。
用戶定義函數和 在 SELECT 子句中使用用戶自定義函數有明顯優點,但使用時應考慮以下限制:
SELECT 子句的運行速度會受用戶自定義函數執行速度的影響。因此,如果使用戶自定義函數的操作量很大,則這些函數的功能最好調用 C 語言或匯編語言編寫的 API 或用戶自定義函數來完成。
在 SELECT 激活的用戶自定義函數中,很難預測 Vfp輸入/輸出(I/O)和表的環境。一般來說,不知道選擇的工作區是哪一個,不知道當前表的名稱,甚至不知道正在處理的欄位名。這些變數的值完全取決於用戶自定義函數在優化過程的什麼地方激活。
在 SELECT 子句調用的用戶自定義函數中修改 VfpI/O 或表的環境是很不安全的。一般來說,這樣做的結果難以預料。
從 SELECT 將值傳遞給用戶自定函數唯一可靠的方法,是激活用戶自定義函數時以參數的形式傳遞。
經過實踐,有可能發現某種被認為是違法的操作在某種 FoxPro 版本中運行正確,但這並不保證它在以後的版本中也能正確運行。
拋開這些限制不說,用戶自定義函數在 SELECT 語句中還是可接受的。但不要忘記使用 SELECT 可能要降低性能。要學習如何在 SELECT 中使用用戶定義函數, 參見示例節。
連接 Vfp支持 ANSI SQL '92 連接 (Join) 語法,通過比較兩個或多個表中的欄位,將它們的記錄連接到一起,生成查詢。例如,內部連接 (inner join) 是將兩個表中連接欄位 (joined field) 值相同的記錄選取到查詢中。Vfp支持嵌套連接(nested joins)
由於 SQL 是派生於數學集合理論, 各表可以代表一個環。指定連接條件的 ON 子句確定交接點, 它代表匹配的行集合。對於一個內部聯接, 交接發生在兩個環的內部或 "inner" 部分。一個外聯接不僅僅包括這些表內部的交叉區域匹配的行, 也包括環的外面的左或右部的交集的行。
㈥ sql outerjoin 函數怎麼用
1. 內連接(inner join或join)
(1).概念:內聯接是基於連接謂詞將兩張表的列結合在一起,產生新的結果表
(2).內連接維恩圖:
(3).sql語句
select a.id, a.user_name, b.over from user1 a inner join user2 b on a.user_name=b.user_name;
㈦ SQL中inner join,outer join和cross join的區別
1、內連接:inner
join(典型的連接運算,使用像
=
或
<>
之類的比較運算符)。包括相等連接和自然連接。
內連接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。
2、外連接:outer
join,外連接可以是左向外連接、右向外連接或完整外部連接。
在FROM子句中指定外連接時,可以由下列幾組關鍵字中的一組指定:
LEFT
JOIN
或
LEFT
OUTER
JOIN。
左向外連接的結果集包括LEFT
OUTER子句中指定的左表的所有行,而不僅僅是連接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。
RIGHT
JOIN
或
RIGHT
OUTER
JOIN。
右向外連接是左向外連接的反向連接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
FULL
JOIN
或
FULL
OUTER
JOIN。
完整外部連接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。
3、交叉連接:cross
join,交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱作笛卡爾積。
㈧ sql 各種連接的使用條件,
只有一個單純的join 就是內連接。
比如有表A與表B,都有欄位X,通過欄位X相關聯。
想取表A與表B中X相等的數據,就用內連接,就是join
如果想取表A所有的,表B中X與表A相等的,就是左連接 left join
右連接與左連接的原理一樣,只是兩表換一下,就是左變右了。
外聯接,就是把兩個表有的數據都取出來,有關聯的,就關聯上了,沒有關聯的,表A有的,表B沒有,這些數據,表B的欄位都是null,表B有的,表A沒有,表A這些欄位就是null
㈨ sql的外連接是怎麼回事啊能幫我解釋下么哪個項用outer
上半句為集合a 下半句為 b
那麼左連接就是 a的結果全選 右邊加入能和a配套的b 如果沒有則對應用空表示
右連接 剛好相反
外連接就是左右連接的並集 自己體會下
㈩ SQL中的左外連接和+號的用法
SQL中的左外連接和+號的用法
Oracle 左連接、右連接、全外連接、(+)號作用
Oracle 外連接
(1)左外連接 (左邊的表不加限制)
(2)右外連接(右邊的表不加限制)
(3)全外連接(左右兩表都不加限制)
外連接(Outer Join)
outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外連接分為三種: 左外連接,右外連接,全外連接。 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我們省略outer 這個關鍵字。 寫成:LEFT/RIGHT/FULL JOIN。
在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。 如果基表的數據在另一張表沒有記錄。 那麼在相關聯的結果集行中列顯示為空值(NULL)。
對於外連接, 也可以使用「(+) 」來表示。 關於使用(+)的一些注意事項:
1.(+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
2. 當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
3.(+)操作符只適用於列,而不能用在表達式上。
4.(+)操作符不能與or和in操作符一起使用。
5.(+)操作符只能用於實現左外連接和右外連接,而不能用於實現完全外連接。
在做實驗之前,我們先將dave表和bl里加一些不同的數據。 以方便測試。
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 懷寧
SQL> select * from dave;
ID NAME
---------- ----------
8 安慶
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
2.1 左外連接(Left outer join/ left join)
left join是以左表的記錄為基礎的,示例中Dave可以看成左表,BL可以看成右表,它的結果集是Dave表中的數據,在加上Dave表和BL表匹配的數據。換句話說,左表(Dave)的記錄將會全部表示出來,而右表(BL)只會顯示符合搜索條件的記錄。BL表記錄不足的地方均為NULL.
示例:
SQL> select * from dave a left join bl b on a.id = b.id;
ID NAME ID NAME
--------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm -- 此處B表為null,因為沒有匹配到
8 安慶 -- 此處B表為null,因為沒有匹配到
SQL> select * from dave a left outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在右表,左表就是全部顯示,故是左連接。
SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用關鍵字where
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
2.2 右外連接(right outer join/ right join)
和left join的結果剛好相反,是以右表(BL)為基礎的, 顯示BL表的所以記錄,在加上Dave和BL 匹配的結果。 Dave表不足的地方用NULL填充.
示例:
SQL> select * from dave a right join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
SQL> select * from dave a right outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在左表,右表就是全部顯示,故是右連接。
SQL> Select * from dave a,bl b where a.id(+)=b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧
2.3 全外連接(full outer join/ full join)
左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null 填充。 全外連接不支持(+)這種寫法。
示例:
SQL> select * from dave a full join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 懷寧
已選擇9行。
SQL> select * from dave a full outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
最初由 ghc_x 發布
[B]有兩個表T1和T2,兩個表除了主鍵索引外均無其他索引,這兩個表由T1.F1(主鍵),T2.F2(主鍵)進行左連接,SQL語句有兩種寫法:
1. SELECT * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
當查看1的執行計劃時發現T1為全表掃描,T2為索引掃描。
當查看2的執行計劃時發現兩個表均為全表掃描。
有人知道這是為什麼嗎? [/B]
我一直以來也是認為這兩種寫法是一樣的,沒想到樓主特意去看了它們的執行計劃,而且發現了它們的不同,這使得我比較驚訝。
按照書上的講法,這兩種寫法是沒有什麼區別的,後一種寫法只不過是前一種寫法的新版本。
為什麼兩者的執行計劃會不一樣呢?
我仔細看了一下兩者的執行計劃,發現了為什麼後一種要兩個表都全表 掃描,而前一個表有一個索引掃描。
原來前者選擇的優化器是RULE,而後者選擇的優化器是CBO的ALL ROWS。
不過,似乎要後者的效率高。
1. SELECT /*+RULE*/ * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT /*+RULE*/ * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
這樣再看下執行計劃吧