MySQL左連接,mysql join 原理 簡書_mysql-join

 2023-10-21 阅读 26 评论 0

摘要:連接的概念連接分為條件連接、等值連接和自然連接三種。條件連接就是在多個表的笛卡爾積中選取滿足條件的行的連接,例如 select * from A,B where A.a > A.b 之類的有條件的查詢。MySQL左連接,等值連接就是特殊的條件連接,當條件為某字段=某字段時ÿ

連接的概念

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

條件連接就是在多個表的笛卡爾積中選取滿足條件的行的連接,例如 select * from A,B where A.a > A.b 之類的有條件的查詢。

MySQL左連接,等值連接就是特殊的條件連接,當條件為某字段=某字段時,即為等值連接。如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大類:外連接(細分為:左連接、右連接、全連接)、自然連接、內連接

Join操作的共性:第一步均為將所有參與操作的表進行了一個笛卡兒積,然后才依據各連接條件進行記錄的篩選

mysql join查詢,內連接與等值連接的區別:

內連接:兩個表(或連接)中某一數據項相等的連接稱為內連接。等值連接一般用where字句設置條件,內連接一般用on字句設置條件,但內連接與等值連接效果是相同的。

內連接與等值連接其實是一回事情(等效)。

經常有人會問到selecta.id,b.namefrom a,b wherea.id=b.pid 與

MySQL concat?selecta.id,b.namefrom a inner join b ona.id=b.pid 有什么區別,哪個效率更高一些。

實際上一回事情了。只是內連接是由SQL 1999規則定的書寫方式。兩個說的是一碼事。

內連接與外連接的結果集區別:

假設我們有兩張表。

MySQL join?Table A是左邊的表。

Table B是右邊的表。

其各有四條記錄,其中有兩條記錄是相同的,如下所示:

id

join sql,name

id

name

1

join、Pirate

1

Rutabaga

2

mysql?Monkey

2

Pirate

3

sql,Ninja

3

Darth Vader

4

數據庫left join和right join。Spaghetti

4

Ninja

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

Inner join == A&B

產生的結果集中,是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

df2dd4ad2d44

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

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

df2dd4ad2d44

Left outer join = A

產生表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

df2dd4ad2d44

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

產生在A表中有而在B表中沒有的集合。

df2dd4ad2d44

A表和B表都沒有出現的數據集

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

產生A表和B表都沒有出現的數據集。

df2dd4ad2d44

還需要注意的是我們還有一個是“交差集” cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下:

SELECT * FROM TableA CROSS JOIN TableB

這個笛卡爾乘積會產生 4 x 4 = 16 條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對于性能來說是非常危險的,尤其是表很大的時候。

df2dd4ad2d44

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/156477.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息