日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

画图讲解SQL join 语句

發布時間:2023/12/10 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 画图讲解SQL join 语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我認為 Ligaya Turmelle 的關于SQL聯合(join)語句的帖子對于新手開發者來說是份很好的材料。SQL 聯合語句好像是基于集合的,用韋恩圖來解釋咋一看是很自然而然的。不過正如在她的帖子的回復中所說的,在測試中我發現韋恩圖并不是十分的匹配SQL聯合語法。

不過我還是喜歡這個觀點,所以我們來看看能不能用上韋恩圖。假設我們有下面兩張表。表A在左邊,表B在右邊。我們給它們各四條記錄。

id name id name -- ---- -- ---- 1 Pirate 1 Rutabaga 2 Monkey 2 Pirate 3 Ninja 3 Darth Vader 4 Spaghetti 4 Ninja

我們用過name字段用幾種不同方式把這些表聯合起來,看能否得到和那些漂亮的韋恩圖在概念上的匹配。

內聯合(inner join)

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.nameid name id name -- ---- -- ---- 1 Pirate 2 Pirate 3 Ninja 4 Ninja

內聯合(inner join)只生成同時匹配表A和表B的記錄集。(如下圖)

全外聯合(full outer join)

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.nameid name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader

全外聯合(full outer join)生成表A和表B里的記錄全集,包括兩邊都匹配的記錄。如果有一邊沒有匹配的,缺失的這一邊為null。(如下圖)

左外聯合(left outer join)

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.nameid name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null

左外聯合(left outer join)生成表A的所有記錄,包括在表B里匹配的記錄。如果沒有匹配的,右邊將是null。(如下圖)

左外聯合,然后用where語句排除一邊我們不想要的記錄

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS nullid name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null

為了生成只在表A里而不在表B里的記錄集,我們用同樣的左外聯合,然后用where語句排除我們不想要的記錄。(如下圖)

全外聯合,然后用where語句排除兩邊都不想要的記錄

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS nullid name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader

為了生成對于表A和表B唯一的記錄集,我們用同樣的全外聯合,然后用where語句排除兩邊都不想要的記錄。(如下圖)

?

交叉聯合(cross join)

還有一種笛卡爾積或者交叉聯合(cross join),據我所知不能用韋恩圖表示:

SELECT * FROM TableA CROSS JOIN TableB

這個把“所有”聯接到“所有”,產生4乘4=16行,遠多于原始的集合。如果你學過數學,你便知道為什么這個聯合遇上大型的表很危險。?

總結圖

下圖由 Moffatt 在 2008 年制作(點擊可查看大圖)。PS:Jeff Atwood 的文章寫于 2007 年。

?


總結

以上是生活随笔為你收集整理的画图讲解SQL join 语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。