SQL中的left join right join
更新時間:2009年06月29日 00:17:34 作者:
數(shù)據(jù)庫常見的join方式有三種:inner join, left outter join, right outter join(還有一種full join,因不常用,本文不討論)。這三種連接方式都是將兩個以上的表通過on條件語句,拼成一個大表。
以下是它們的共同點:
1. 關(guān)于左右表的概念。左表指的是在SQL語句中排在left join左邊的表,右表指的是排在left join右邊的表。
2. 在拼成的大表中,左表排在左邊,右表排在右邊。
3. on條件語句最好用=號對兩表相應(yīng)的主外鍵進行連接。當(dāng)然,也可以用其他操作符,如>, <, 來連接兩表的任一字段,此時的關(guān)系將非常復(fù)雜,連接后的記錄數(shù)也隨之而變得不確定。如果在一些特殊的場合中需要用到這種方式,必須通過簡單的實例加以確認,否則,連接結(jié)果很可能不是我們所想要的!
4. on條件語句不能省略。
5. 可以連鎖使用join,每次使用join都令另一表與當(dāng)前的表或連接的結(jié)果相連接。
在下文中,用到了兩個表,"部門"表與"組織"表,其中,"部門"表有一名為"組織編號"的外鍵,指向"組織"表中的主鍵"編號"。
inner join
格式:select * from 部門 inner join 組織 on 部門.組織編號 = 組織.編號
目的:將兩表中符合on條件的所有記錄都找出來。
規(guī)律:
1. 拼出的大表記錄不會增加。
2. 如果左邊與右表的關(guān)系是一對多的關(guān)系,在選出的任一記錄中,假若右表有多個記錄與其對應(yīng),那么,連接后的左表,主鍵將不再唯一。
典型應(yīng)用:將存在多關(guān)系的引用表放在左表,將存在一關(guān)系的被引用表放在右表,通過=號將主外鍵進行連接,通過對右表設(shè)定過濾條件,選出相應(yīng)的且主鍵唯一的左表記錄。
備注:inner join 是默認的連接方式,可縮寫為join。
轉(zhuǎn)化為where子句:
select * from 部門, 組織 where 部門.組織編號 = 組織.編號
left outter join
格式: select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號
格式: select * from 組織 left join 部門 on 組織.編號 = 部門.組織編號
目的:將左表的所有記錄列出,右表中只要符合on條件的,與左表記錄相拼合,不符合條件的,填以null值。
規(guī)律:
1. 選出所有符合條件的左表,如果左邊與右表的關(guān)系是一對一的關(guān)系,則拼成的大表記錄不會改變。
如果左邊與右表的關(guān)系是多對一的關(guān)系,則拼成的大表記錄也不會改變。
如果左邊與右表的關(guān)系是一對多的關(guān)系,則拼成的大表記錄會增加。對于每一具有一對多關(guān)系的左表記錄,如果左表1:N與右表對應(yīng),那么會多出N-1條記錄。例如,如果左表第一條記錄1:3對應(yīng)于右表,多出2條記錄。如果左表第二條記錄1:2對應(yīng)于右表,則再多出1條記錄。這樣,總共多出3條記錄。其他類推。
2. 如果左邊與右表的關(guān)系是一對多的關(guān)系,在選出的任一記錄中,假若右表有多個記錄與其對應(yīng),那么,連接后的左表,主鍵將不再唯一。
3. 如果左邊與右表的關(guān)系是一對多的關(guān)系,對于左表任一記錄,如果右表沒有記錄與其相對應(yīng),則全部填以null值。
典型應(yīng)用:將存在多關(guān)系的引用表放在左表,將存在一關(guān)系的被引用表放在右表,通過對右表設(shè)定過濾條件,選出相應(yīng)的且主鍵唯一的左表記錄。
備注:left outter join可用left join代替。在有些數(shù)據(jù)庫中,如HSqlDb, 只能使用left join而不能使用left outter join。
轉(zhuǎn)化為where子句:
select * from 部門, 組織 where 部門.組織編號 = 組織.編號
right outter join
格式: select * from 部門 right join 組織 on 部門.組織編號 = 組織.編號
格式: select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號
目的:將右表的所有記錄列出,左表中只要符合on條件的,與右表記錄相拼合,不符合條件的,填以null值。
規(guī)律:(與left outter join相反)
典型應(yīng)用:可轉(zhuǎn)化成left outter join。例如
select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號
與
select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號
的效果一樣
1. 關(guān)于左右表的概念。左表指的是在SQL語句中排在left join左邊的表,右表指的是排在left join右邊的表。
2. 在拼成的大表中,左表排在左邊,右表排在右邊。
3. on條件語句最好用=號對兩表相應(yīng)的主外鍵進行連接。當(dāng)然,也可以用其他操作符,如>, <, 來連接兩表的任一字段,此時的關(guān)系將非常復(fù)雜,連接后的記錄數(shù)也隨之而變得不確定。如果在一些特殊的場合中需要用到這種方式,必須通過簡單的實例加以確認,否則,連接結(jié)果很可能不是我們所想要的!
4. on條件語句不能省略。
5. 可以連鎖使用join,每次使用join都令另一表與當(dāng)前的表或連接的結(jié)果相連接。
在下文中,用到了兩個表,"部門"表與"組織"表,其中,"部門"表有一名為"組織編號"的外鍵,指向"組織"表中的主鍵"編號"。
inner join
格式:select * from 部門 inner join 組織 on 部門.組織編號 = 組織.編號
目的:將兩表中符合on條件的所有記錄都找出來。
規(guī)律:
1. 拼出的大表記錄不會增加。
2. 如果左邊與右表的關(guān)系是一對多的關(guān)系,在選出的任一記錄中,假若右表有多個記錄與其對應(yīng),那么,連接后的左表,主鍵將不再唯一。
典型應(yīng)用:將存在多關(guān)系的引用表放在左表,將存在一關(guān)系的被引用表放在右表,通過=號將主外鍵進行連接,通過對右表設(shè)定過濾條件,選出相應(yīng)的且主鍵唯一的左表記錄。
備注:inner join 是默認的連接方式,可縮寫為join。
轉(zhuǎn)化為where子句:
select * from 部門, 組織 where 部門.組織編號 = 組織.編號
left outter join
格式: select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號
格式: select * from 組織 left join 部門 on 組織.編號 = 部門.組織編號
目的:將左表的所有記錄列出,右表中只要符合on條件的,與左表記錄相拼合,不符合條件的,填以null值。
規(guī)律:
1. 選出所有符合條件的左表,如果左邊與右表的關(guān)系是一對一的關(guān)系,則拼成的大表記錄不會改變。
如果左邊與右表的關(guān)系是多對一的關(guān)系,則拼成的大表記錄也不會改變。
如果左邊與右表的關(guān)系是一對多的關(guān)系,則拼成的大表記錄會增加。對于每一具有一對多關(guān)系的左表記錄,如果左表1:N與右表對應(yīng),那么會多出N-1條記錄。例如,如果左表第一條記錄1:3對應(yīng)于右表,多出2條記錄。如果左表第二條記錄1:2對應(yīng)于右表,則再多出1條記錄。這樣,總共多出3條記錄。其他類推。
2. 如果左邊與右表的關(guān)系是一對多的關(guān)系,在選出的任一記錄中,假若右表有多個記錄與其對應(yīng),那么,連接后的左表,主鍵將不再唯一。
3. 如果左邊與右表的關(guān)系是一對多的關(guān)系,對于左表任一記錄,如果右表沒有記錄與其相對應(yīng),則全部填以null值。
典型應(yīng)用:將存在多關(guān)系的引用表放在左表,將存在一關(guān)系的被引用表放在右表,通過對右表設(shè)定過濾條件,選出相應(yīng)的且主鍵唯一的左表記錄。
備注:left outter join可用left join代替。在有些數(shù)據(jù)庫中,如HSqlDb, 只能使用left join而不能使用left outter join。
轉(zhuǎn)化為where子句:
select * from 部門, 組織 where 部門.組織編號 = 組織.編號
right outter join
格式: select * from 部門 right join 組織 on 部門.組織編號 = 組織.編號
格式: select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號
目的:將右表的所有記錄列出,左表中只要符合on條件的,與右表記錄相拼合,不符合條件的,填以null值。
規(guī)律:(與left outter join相反)
典型應(yīng)用:可轉(zhuǎn)化成left outter join。例如
select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號
與
select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號
的效果一樣
您可能感興趣的文章:
- MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)
- mysql not in、left join、IS NULL、NOT EXISTS 效率問題記錄
- SQL之left join、right join、inner join的區(qū)別淺析
- 解析sql語句中l(wèi)eft_join、inner_join中的on與where的區(qū)別
- sql 左連接和右連接的使用技巧(left join and right join)
- sql left join 命令詳解
- 超詳細mysql left join,right join,inner join用法分析
- SQL 外鏈接操作小結(jié) inner join left join right join
- sql中l(wèi)eft join的效率分析與提高效率方法
相關(guān)文章
把excel表格里的數(shù)據(jù)導(dǎo)入sql數(shù)據(jù)庫的兩種方法
這篇文章介紹了把excel表格里的數(shù)據(jù)導(dǎo)入sql數(shù)據(jù)庫的兩種方法,有需要的朋友可以參考一下2013-09-09
SQLServer 2012中設(shè)置AlwaysOn解決網(wǎng)絡(luò)抖動導(dǎo)致的提交延遲問題
這篇文章主要介紹了SQLServer 2012中設(shè)置AlwaysOn解決網(wǎng)絡(luò)抖動導(dǎo)致的提交延遲問題,需要的朋友可以參考下2015-02-02
VS連接SQL?server數(shù)據(jù)庫及實現(xiàn)基本CRUD操作
這篇文章主要給大家介紹了關(guān)于VS連接SQL?server數(shù)據(jù)庫及實現(xiàn)基本CRUD操作的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-01-01
如何監(jiān)測和優(yōu)化OLAP數(shù)據(jù)庫
微軟SQL Server分析服務(wù)(SSAS)提供了一個用來創(chuàng)建和管理數(shù)據(jù)挖掘應(yīng)用和在線分析處理系統(tǒng)的強大引擎,你應(yīng)該仔細的監(jiān)測和優(yōu)化OLAP數(shù)據(jù)庫和潛在的關(guān)系數(shù)據(jù)源。2015-09-09
SQLServer 數(shù)據(jù)導(dǎo)入導(dǎo)出的幾種方法小結(jié)
在涉及到SQL Server編程或是管理時一定會用到數(shù)據(jù)的導(dǎo)入與導(dǎo)出, 導(dǎo)入導(dǎo)出的方法有多種,結(jié)合我在做項目時的經(jīng)歷做一下匯總2010-06-06

