mysql-join

連接的概念

連接分為條件連接、等值連接和自然連接三種。

  • 條件連接就是在多個表的笛卡爾積中選取滿足條件的行的連接,例如 select * from A,B where A.a > A.b 之類的有條件的查詢。
  • 等值連接就是特殊的條件連接,當條件為某字段=某字段時,即為等值連接。如SELECT ename,sal,dname FROM emp,dept WHERE emp.deptno=dept.deptno;
  • 自然連接是一種特殊的等值連接,他要求多個表有相同的屬性字段,然后條件為相同的屬性字段值相等,最后再將表中重復的屬性字段去掉,即為自然連接。如A中a,b,c字段,B中有c,d字段,則select * from A natural join B 相當于 select A.a,A.b,A.c,B.d from A.c = B.c 。

Join操作基本分為3大類:外連接(細分為:左連接、右連接、全連接)、自然連接、內(nèi)連接
Join操作的共性:第一步均為將所有參與操作的表進行了一個笛卡兒積,然后才依據(jù)各連接條件進行記錄的篩選

內(nèi)連接與等值連接的區(qū)別:

內(nèi)連接:兩個表(或連接)中某一數(shù)據(jù)項相等的連接稱為內(nèi)連接。等值連接一般用where字句設置條件,內(nèi)連接一般用on字句設置條件,但內(nèi)連接與等值連接效果是相同的。
內(nèi)連接與等值連接其實是一回事情(等效)。
經(jīng)常有人會問到selecta.id,b.namefrom a,b wherea.id=b.pid 與
selecta.id,b.namefrom a inner join b ona.id=b.pid 有什么區(qū)別,哪個效率更高一些。
實際上一回事情了。只是內(nèi)連接是由SQL 1999規(guī)則定的書寫方式。兩個說的是一碼事。

內(nèi)連接與外連接的結果集區(qū)別:

假設我們有兩張表。
Table A是左邊的表。
Table B是右邊的表。
其各有四條記錄,其中有兩條記錄是相同的,如下所示:

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

下面讓我們來看看不同的Join會產(chǎn)生什么樣的結果。

Inner join == A&B

產(chǎn)生的結果集中,是A和B的交集
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja

Full outer join == A || B

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

id 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

產(chǎn)生A和B的并集。但是需要注意的是,對于沒有匹配的記錄,則會以null做為值。


Left outer join = A

產(chǎn)生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null

A-B

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

id name id name
2 Monkey null null
4 Spaghetti null null

產(chǎn)生在A表中有而在B表中沒有的集合。


A表和B表都沒有出現(xiàn)的數(shù)據(jù)集

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null

id name id name
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader

產(chǎn)生A表和B表都沒有出現(xiàn)的數(shù)據(jù)集。


還需要注意的是我們還有一個是“交差集” cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數(shù)據(jù)進行一個N*M的組合,即笛卡爾積。表達式如下:
SELECT * FROM TableA CROSS JOIN TableB
這個笛卡爾乘積會產(chǎn)生 4 x 4 = 16 條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統(tǒng)都會產(chǎn)生笛卡爾乘積然再做過濾。這是對于性能來說是非常危險的,尤其是表很大的時候。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 什么是SQL數(shù)據(jù)庫: SQL是Structured Query Language(結構化查詢語言)的縮寫。SQL是...
    西貝巴巴閱讀 1,995評論 0 10
  • 1.Left Outer Join左外連接 設數(shù)據(jù)庫中有A、B兩表,A和B有共同的交集C,當我們想查詢出A的所有記...
    其實我很菜啊閱讀 250評論 0 1
  • 1、MySQL啟動和關閉(安裝及配置請參照百度經(jīng)驗,這里不再記錄。MySQL默認端口號:3306;默認數(shù)據(jù)類型格式...
    強壯de西蘭花閱讀 758評論 0 1
  • 梵高的信里提到:“每個人的心里都有一團火,路過的人只能看到煙,但是總有一個人,總有那么一個人能看到這火,然后走過來...
    走不停的蘇閱讀 369評論 0 2
  • 我現(xiàn)在已經(jīng)上了初三了,我還考過年級前200名,可是我知道,我的那些成績是假的,因為這是我作弊得來的分數(shù)!我也...

友情鏈接更多精彩內(nèi)容