mysql join 一對多 Join 一對多連線

2021-10-18 02:41:42 字數 2152 閱讀 7702

資料庫常見的join方式有三種:inner join, left outter join, right outter join(還有一種full join,因不常用,本文不討論)。這三種連線方式都是將兩個以上的表通過on條件語句,拼成乙個大表。以下是它們的共同點:

1. 關於左右表的概念。左表指的是在sql語句中排在left join左邊的表,右表指的是排在left join右邊的表。

2. 在拼成的大表中,左表排在左邊,右表排在右邊。

3. on條件語句最好用=號對兩表相應的主外來鍵進行連線。當然,也可以用其他操作符,如》, <, 來連線兩表的任一字段,此時的關係將非常複雜,連線後的記錄數也隨之而變得不確定。如果在一些特殊的場合中需要用到這種方式,必須通過簡單的例項加以確認,否則,連線結果很可能不是我們所想要的!

4. on條件語句不能省略。

5. 可以連鎖使用join,每次使用join都令另一表與當前的表或連線的結果相連線。

在下文中,用到了兩個表,"部門"表與"組織"表,其中,"部門"表有一名為"組織編號"的外來鍵,指向"組織"表中的主鍵"編號"。

inner join

格式:select * from 部門 inner join 組織 on 部門.組織編號 = 組織.編號

目的:將兩表中符合on條件的所有記錄都找出來。

規律:1. 拼出的大表記錄不會增加。

2. 如果左邊與右表的關係是一對多的關係,在選出的任一記錄中,假若右表有多個記錄與其對應,那麼,連線後的左表,主鍵將不再唯一。

典型應用:將存在多關係的引用表放在左表,將存在一關係的被引用表放在右表,通過=號將主外來鍵進行連線,通過對右表設定過濾條件,選出相應的且主鍵唯一的左表記錄。

備註:inner join 是預設的連線方式,可縮寫為join。

轉化為where子句:

select * from 部門, 組織 where 部門.組織編號 = 組織.編號

left outter join

格式: select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號

格式: select * from 組織 left join 部門 on 組織.編號 = 部門.組織編號

目的:將左表的所有記錄列出,右表中只要符合on條件的,與左表記錄相拼合,不符合條件的,填以null值。

規律:1. 選出所有符合條件的左表,如果左邊與右表的關係是一對一的關係,則拼成的大表記錄不會改變。

如果左邊與右表的關係是多對一的關係,則拼成的大表記錄也不會改變。

如果左邊與右表的關係是一對多的關係,則拼成的大表記錄會增加。對於每一具有一對多關係的左表記錄,如果左表1:n與右表對應,那麼會多出n-1條記錄。例如,如果左表第一條記錄1:3對應於右表,多出2條記錄。如果左表第二條記錄1:2對應於右表,則再多出1條記錄。這樣,總共多出3條記錄。其他類推。

2. 如果左邊與右表的關係是一對多的關係,在選出的任一記錄中,假若右表有多個記錄與其對應,那麼,連線後的左表,主鍵將不再唯一。

3. 如果左邊與右表的關係是一對多的關係,對於左表任一記錄,如果右表沒有記錄與其相對應,則全部填以null值。

典型應用:將存在多關係的引用表放在左表,將存在一關係的被引用表放在右表,通過對右表設定過濾條件,選出相應的且主鍵唯一的左表記錄。

備註:left outter join可用left join代替。在有些資料庫中,如hsqldb, 只能使用left join而不能使用left outter join。

轉化為where子句:

select * from 部門, 組織 where 部門.組織編號 = 組織.編號

right outter join

格式: select * from 部門 right join 組織 on 部門.組織編號 = 組織.編號

格式: select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號

目的:將右表的所有記錄列出,左表中只要符合on條件的,與右表記錄相拼合,不符合條件的,填以null值。

規律:(與left outter join相反)

典型應用:可轉化成left outter join。例如

select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號

與select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號

的效果一樣

MySQL關係 一對多 一對一 多對多

將實體與實體的關係,反應到最終資料庫表的設計上,將關係分為三種 一對一,一對多 多對一 和多對多,所有的關係都是表與表之間的關係 一對一 一對一 一張表的一條記錄只能與另外一條記錄進行對應,反之亦然 id p 姓名 性別 年齡 身高 婚姻狀況 籍貫 家庭位址 緊急聯絡人 體重 表設計成以上這種形式 ...

hibernate單向一對多和雙向一對多

單向一對多 例如有部門封裝類 private int deptno private string deptname private string location 有職員封裝類 private int empno private string empname private dept dept 在多...

Django ORM 一對多 和 多對多

在 models.py 上定義 class province models.model name models.charfield max length 32 def str self return self.name class city models.model name models.char...