深入理解SQL的四種連接-左外連接、右外連接、內(nèi)連接、全連接(3)_MySQL教程
推薦:解析:內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別本篇文章是對內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別進行了詳細的分析介紹,需要的朋友參考下 連接分為:內(nèi)連接、外連接、交叉連接 一、內(nèi)連接最常用 定義: 僅將兩個表中滿足連接條件的行組合起來作為結(jié)果集。 在內(nèi)連接中,只有在兩個表中匹配的行才能在結(jié)果集中出
四、聯(lián)合連接(UNION JOIN):這是一種很少見的連接方式。Oracle、MySQL均不支持,其作用是:找出全外連接和內(nèi)連接之間差異的所有行。這在數(shù)據(jù)分析中排錯中比較常用。也可以利用數(shù)據(jù)庫的集合操作來實現(xiàn)此功能。
語句11:聯(lián)合查詢(UNION JOIN)例句,還沒有找到能執(zhí)行的SQL環(huán)境。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O UNION JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
語句12:語句11在DB2下的等價實現(xiàn)。還不知道DB2是否支持語句11呢!
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
EXCEPT
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
語句13:語句11在Oracle下的等價實現(xiàn)。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
MINUS
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
查詢結(jié)果如下:
五、自然連接(NATURAL INNER JOIN):說 真的,這種連接查詢沒有存在的價值,既然是SQL2標準中定義的,就給出個例子看看吧。自然連接無需指定連接列,SQL會檢查兩個表中是否相同名稱的列, 且假設(shè)他們在連接條件中使用,并且在連接條件中僅包含一個連接列。不允許使用ON語句,不允許指定顯示列,顯示列只能用*表示(ORACLE環(huán)境下測試 的)。對于每種連接類型(除了交叉連接外),均可指定NATURAL。下面給出幾個例子。
語句14:
SELECT *
FROM ORDERS O NATURAL INNER JOIN CUSTOMERS C;
語句15:
SELECT *
FROM ORDERS O NATURAL LEFT OUTER JOIN CUSTOMERS C;
語句16:
SELECT *
FROM ORDERS O NATURAL RIGHT OUTER JOIN CUSTOMERS C;
語句17:
SELECT *
FROM ORDERS O NATURAL FULL OUTER JOIN CUSTOMERS C;
六、SQL查詢的基本原理:兩種情況介紹。
第一、單表查詢:根據(jù)WHERE條件過濾表中的記錄,形成中間表(這個中間表對用戶是不可見的);然后根據(jù)SELECT的選擇列選擇相應(yīng)的列進行返回最終結(jié)果。
第二、兩表連接查詢:對兩表求積(笛卡爾積)并用ON條件和連接連接類型進行過濾形成中間表;然后根據(jù)WHERE條件過濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
第三、多表連接查詢:先對第一個和第二個表按照兩表連接做查詢,然后用查詢結(jié)果和第三個表做連接查詢,以此類推,直到所有的表都連接上為止,最終形成一個中間的結(jié)果表,然后根據(jù)WHERE條件過濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
理解SQL查詢的過程是進行SQL優(yōu)化的理論依據(jù)。
七、ON后面的條件(ON條件)和WHERE條件的區(qū)別:
ON條件:是過濾兩個鏈接表笛卡爾積形成中間表的約束條件。
WHERE條件:在有ON條件的SELECT語句中是過濾中間表的約束條件。在沒有ON的單表查詢中,是限制物理表或者中間查詢結(jié)果返回記錄的約束。在兩表或多表連接中是限制連接形成最終中間表的返回結(jié)果的約束。
從這里可以看出,將WHERE條件移入ON后面是不恰當?shù)�。推薦的做法是:
ON只進行連接操作,WHERE只過濾中間表的記錄。
八、總結(jié)
連接查詢是SQL查詢的核心,連接查詢的連接類型選擇依據(jù)實際需求。如果選擇不當,非但不能提高查詢效率,反而會帶來一些邏輯錯誤或者性能低下。下面總結(jié)一下兩表連接查詢選擇方式的依據(jù):
1、 查兩表關(guān)聯(lián)列相等的數(shù)據(jù)用內(nèi)連接。
2、 Col_L是Col_R的子集時用右外連接。
3、 Col_R是Col_L的子集時用左外連接。
4、 Col_R和Col_L彼此有交集但彼此互不為子集時候用全外。
5、 求差操作的時候用聯(lián)合查詢。
多個表查詢的時候,這些不同的連接類型可以寫到一塊。例如:
SELECT T1.C1,T2.CX,T3.CY
FROM TAB1 T1
INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)
INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)
LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);
WHERE T1.X >T3.Y;
上面這個SQL查詢是多表連接的一個示范。
分享:mysql出現(xiàn)“Incorrect key file for table”處理方法最近服務(wù)器出現(xiàn)問題,導(dǎo)致公司的網(wǎng)站數(shù)據(jù)丟了很多。智軟的也丟了不少。這幾天一直都在忙這 修復(fù)數(shù)據(jù)。 今天在恢復(fù)一個客戶數(shù)據(jù)的時候。發(fā)現(xiàn)了一貫問題。有多個表損壞了。因為都是直接把表復(fù)制進去的。然后就出現(xiàn)了這個問題問題 如圖: dedecms Error Warnin! Error inf
- MSSQL清空日志刪除日志文件
- 關(guān)于數(shù)據(jù)庫中保留小數(shù)位的問題
- 解析mysql與Oracle update的區(qū)別
- mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫以及函數(shù)、存儲過程的介紹
- MySQL——修改root密碼的4種方法(以windows為例)
- 解決MYSQL出現(xiàn)Can''t create/write to file ''#sql_5c0_0.MYD''的問題
- 解析:內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別
- mysql出現(xiàn)“Incorrect key file for table”處理方法
- mysql重裝后出現(xiàn)亂碼設(shè)置為utf8可解決
- 淺析一個MYSQL語法(在查詢中使用count)的兼容性問題
- 解析MySQL中INSERT INTO SELECT的使用
- SQL分組排序去重復(fù)的小實例
MySQL教程Rss訂閱編程教程搜索
MySQL教程推薦
- MYSQL索引建立需要注意以下幾點細節(jié)
- mysql 數(shù)據(jù)庫 (基礎(chǔ)) 筆記
- 如何用workbench導(dǎo)出mysql數(shù)據(jù)庫關(guān)系圖
- 如何通過配置自動實現(xiàn)ValueList中hql語句的整型參數(shù)轉(zhuǎn)換
- PHP mysqli擴展庫 預(yù)處理技術(shù)的使用分析
- Mysql DNS反向解析導(dǎo)致連接超時過程分析(skip-name-resolve)
- 基于mysql全文索引的深入理解
- mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫以及函數(shù)、存儲過程的介紹
- MySQL查詢優(yōu)化:用子查詢代替非主鍵連接查詢實例介紹
- 解析mysql中:單表distinct、多表group by查詢?nèi)コ貜?fù)記錄
- 相關(guān)鏈接:
- 教程說明:
MySQL教程-深入理解SQL的四種連接-左外連接、右外連接、內(nèi)連接、全連接(3)
。