資料庫表連線的簡單解釋
關係型資料庫最難的地方,就是建模(model)。
錯綜複雜的資料,需要建立模型,才能儲存在資料庫。所謂"模型"就是兩樣東西:實體(entity)+ 關係(relationship)。
實體指的是那些實際的物件,帶有自己的屬性,可以理解成一組相關屬性的容器。關係就是實體之間的聯絡,通常可以分成"一對一"、"一對多"和"多對多"等型別。
在關係型資料庫裡面,每個實體有自己的一張表(table),所有屬性都是這張表的欄位(field),表與表之間根據關聯欄位"連線"(join)在一起。所以,表的連線是關係型資料庫的核心問題。
表的連線分成好幾種型別。
- 內連線(inner join)
- 外連線(outer join)
- 左連線(left join)
- 右連線(right join)
- 全連線(full join)
以前,很多文章採用維恩圖(兩個圓的集合運算),解釋不同連線的差異。
上週,我讀到一篇文章,認為還有比維恩圖更好的解釋方式。我發現確實如此,換一個角度解釋,更容易懂。
所謂"連線",就是兩張表根據關聯欄位,組合成一個資料集。問題是,兩張表的關聯欄位的值往往是不一致的,如果關聯欄位不匹配,怎麼處理?比如,表 A 包含張三和李四,表 B 包含李四和王五,匹配的只有李四這一條記錄。
很容易看出,一共有四種處理方法。
- 只返回兩張表匹配的記錄,這叫內連線(inner join)。
- 返回匹配的記錄,以及表 A 多餘的記錄,這叫左連線(left join)。
- 返回匹配的記錄,以及表 B 多餘的記錄,這叫右連線(right join)。
- 返回匹配的記錄,以及表 A 和表 B 各自的多餘記錄,這叫全連線(full join)。
下圖就是四種連線的圖示。我覺得,這張圖比維恩圖更易懂,也更準確。
上圖中,表 A 的記錄是 123,表 B 的記錄是 ABC,顏色表示匹配關係。返回結果中,如果另一張表沒有匹配的記錄,則用 null 填充。
這四種連線,又可以分成兩大類:內連線(inner join)表示只包含匹配的記錄,外連線(outer join)表示還包含不匹配的記錄。所以,左連線、右連線、全連線都屬於外連線。
這四種連線的 SQL 語句如下。
SELECT * FROM A INNER JOIN B ON A.book_id=B.book_id; SELECT * FROM A LEFT JOIN B ON A.book_id=B.book_id; SELECT * FROM A RIGHT JOIN B ON A.book_id=B.book_id; SELECT * FROM A FULL JOIN B ON A.book_id=B.book_id;
上面的 SQL 語句還可以加上where條件從句,對記錄進行篩選,比如只返回表 A 裡面不匹配表 B 的記錄。
SELECT * FROM A LEFT JOIN B ON A.book_id=B.book_id WHERE B.id IS null;
另一個例子,返回表 A 或表 B 所有不匹配的記錄。
SELECT * FROM A FULL JOIN B ON A.book_id=B.book_id WHERE A.id IS null OR B.id IS null;
此外,還存在一種特殊的連線,叫做"交叉連線"(cross join),指的是表 A 和表 B 不存在關聯欄位,這時表 A(共有 n 條記錄)與表 B (共有 m 條記錄)連線後,會產生一張包含 n x m 條記錄的新表(見下圖)。
(完)
相關文章
- 簡單的選課系統(2)——資料庫的連線資料庫
- Druid資料庫連線池就這麼簡單UI資料庫
- 用Navicat連線資料庫-資料庫連線(MySQL演示)資料庫MySql
- 連線資料庫資料庫
- 資料庫的連線數資料庫
- 線性表中的單向連結串列的簡單操作
- 【資料結構】線性表-單連結串列資料結構
- Python + Tkinter簡單實現註冊登入(連線本地MySQL資料庫)PythonMySql資料庫
- 資料庫連線池技術詳解資料庫
- 簡單的登入註冊(前端+後端+MySQL資料庫 DRuid連線池 DBUtils)前端後端MySql資料庫UI
- 資料庫連線池-Druid資料庫連線池原始碼解析資料庫UI原始碼
- 如何建立最簡單的 ABAP 資料庫表,以及編碼從資料庫表中讀取資料 (上)資料庫
- 崑崙資料庫 MySQL 連線協議簡介資料庫MySql協議
- ASP.NET Web Forms – 資料庫連線簡介ASP.NETWebORM資料庫
- mysqli連線資料庫MySql資料庫
- Mongodb資料庫連線MongoDB資料庫
- Android 連線資料庫Android資料庫
- java連線資料庫Java資料庫
- 連線資料庫-mysql資料庫MySql
- jmeter連線資料庫JMeter資料庫
- Mybatis連線資料庫MyBatis資料庫
- JSP連線資料庫JS資料庫
- JDBC連線資料庫JDBC資料庫
- Flask連線資料庫Flask資料庫
- 資料庫與python的連線資料庫Python
- 資料庫的連線過程資料庫
- 新手必看!最簡單的MySQL資料庫詳解MySql資料庫
- 《四 資料庫連線池原始碼》手寫資料庫連線池資料庫原始碼
- 【MySQL】自定義資料庫連線池和開源資料庫連線池的使用MySql資料庫
- [資料庫][SQL]圖解各種連線join資料庫SQL圖解
- 資料庫連線錯誤的原因及解決方法資料庫
- 資料庫連線失敗的原因及解決方法資料庫
- python 連線 mongo 資料庫連線超時PythonGo資料庫
- 織夢CMS(dedecms)的資料庫連線檔案_織夢連線資料庫檔案資料庫
- JDBC第一篇【介紹JDBC、使用JDBC連線資料庫、簡單的工具類】JDBC資料庫
- Java 資料庫連線的那些事Java資料庫
- 連線別人的MySql資料庫MySql資料庫
- PHP連線資料庫的步驟PHP資料庫