<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
搞後端的肯定要經常接觸到資料庫,搞資料庫一個避免不了的地方就是 join
, join
的語法很簡單,但是在使用時常常陷入一下兩種誤區:
join
導致的,以後再也不敢用了先來舉個栗子:
mysql> SELECT * FROM t1; +------+------+ | m1 | n1 | +------+------+ | 1 | a | | 2 | b | | 3 | c | +------+------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM t2; +------+------+ | m2 | n2 | +------+------+ | 2 | b | | 3 | c | | 4 | d | +------+------+ 3 rows in set (0.00 sec)
現在我們對這張表進行連線:
mysql> SELECT * FROM t1, t2; +------+------+------+------+ | m1 | n1 | m2 | n2 | +------+------+------+------+ | 1 | a | 2 | b | | 2 | b | 2 | b | | 3 | c | 2 | b | | 1 | a | 3 | c | | 2 | b | 3 | c | | 3 | c | 3 | c | | 1 | a | 4 | d | | 2 | b | 4 | d | | 3 | c | 4 | d | +------+------+------+------+ 9 rows in set (0.00 sec)
這個過程看起來就是把t1
表的記錄和t2
的記錄連起來組成新的更大的記錄,所以這個查詢過程稱之為連線查詢。連線查詢的結果集中包含一個表中的每一條記錄與另一個表中的每一條記錄相互匹配的組合,像這樣的結果集就可以稱之為笛卡爾積。因為表t1
中有3條記錄,表t2
中也有3條記錄,所以這兩個表連線之後的笛卡爾積就有3×3=9
行記錄。
如果我們樂意,我們可以連線任意數量張表,但是如果沒有任何限制條件的話,這些表連線起來產生的笛卡爾積可能是非常巨大的。比方說3個100行記錄的表連線起來產生的笛卡爾積就有100×100×100=1000000
行資料!所以在連線的時候過濾掉特定記錄組合是有必要的
下邊我們就要看一下攜帶過濾條件的連線查詢的大致執行過程了,比方說下邊這個查詢語句:
SELECT * FROM t1, t2 WHERE t1.m1 > 1 AND t1.m1 = t2.m2 AND t2.n2 < 'd';
在這個查詢中我們指明瞭這三個過濾條件:
t1.m1 > 1
t1.m1 = t2.m2
t2.n2 < 'd'
那麼這個連線查詢的大致執行過程如下:
首先確定第一個需要查詢的表,這個表稱之為驅動表。只需要選取代價最小的那種存取方法去執行單表查詢語句就好了。此處假設使用t1
作為驅動表,那麼就需要到t1
表中找滿足t1.m1 > 1
的記錄,因為表中的資料太少,我們也沒在表上建立二級索引,所以此處查詢t1
表的存取方法就是全表掃描。
針對上一步驟中從驅動表產生的結果集中的每一條記錄,分別需要到t2
表中查詢匹配的記錄,所謂匹配的記錄,指的是符合過濾條件的記錄。因為是根據t1
表中的記錄去找t2
表中的記錄,所以t2
表也可以被稱之為被驅動表。上一步驟從驅動表中得到了2條記錄,所以需要查詢2次t2
表。此時涉及兩個表的列的過濾條件t1.m1 = t2.m2
就派上用場了:
t1.m1 = 2
時,過濾條件t1.m1 = t2.m2
就相當於t2.m2 = 2
,所以此時t2
表相當於有了t2.m2 = 2
、t2.n2 < 'd'
這兩個過濾條件,然後到t2
表中執行單表查詢。t1.m1 = 3
時,過濾條件t1.m1 = t2.m2
就相當於t2.m2 = 3
,所以此時t2
表相當於有了t2.m2 = 3
、t2.n2 < 'd'
這兩個過濾條件,然後到t2
表中執行單表查詢。從上邊兩個步驟可以看出來,我們上邊嘮叨的這個兩表連線查詢共需要查詢1次t1
表,2次t2
表。當然這是在特定的過濾條件下的結果,如果我們把t1.m1 > 1
這個條件去掉,那麼從t1
表中查出的記錄就有3條,就需要查詢3次t2
表了。也就是說在兩表連線查詢中,驅動表只需要存取一次,被驅動表可能被存取多次。
如果驅動表中的記錄即使在被驅動表中沒有匹配的記錄,但我們也仍然需要加入到結果集。為了解決這個問題,就有了內連線和外連線的概念:
對於內連線的兩個表,驅動表中的記錄在被驅動表中找不到匹配的記錄,該記錄不會加入到最後的結果集,我們上邊提到的連線都是所謂的內連線。
對於外連線的兩個表,驅動表中的記錄即使在被驅動表中沒有匹配的記錄,也仍然需要加入到結果集。
在MySQL中,根據選取驅動表的不同,外連線仍然可以細分為2種:
左外連線
選取左側的表為驅動表。
右外連線
選取右側的表為驅動表。
可是這樣仍然存在問題,即使對於外連線來說,有時候我們也並不想把驅動表的全部記錄都加入到最後的結果集。這就犯難了,有時候匹配失敗要加入結果集,有時候又不要加入結果集,這咋辦,有點兒愁啊。。。噫,把過濾條件分為兩種不就解決了這個問題了麼,所以放在不同地方的過濾條件是有不同語意的:
WHERE
子句中的過濾條件
WHERE
子句中的過濾條件就是我們平時見的那種,不論是內連線還是外連線,凡是不符合WHERE
子句中的過濾條件的記錄都不會被加入最後的結果集。
ON
子句中的過濾條件
對於外連線的驅動表的記錄來說,如果無法在被驅動表中找到匹配
ON
子句中的過濾條件的記錄,那麼該記錄仍然會被加入到結果集中,對應的被驅動表記錄的各個欄位使用NULL
值填充。
需要注意的是,這個ON
子句是專門為外連線驅動表中的記錄在被驅動表找不到匹配記錄時應不應該把該記錄加入結果集這個場景下提出的,所以如果把ON
子句放到內連線中,MySQL
會把它和WHERE
子句一樣對待,也就是說:內連線中的WHERE子句和ON子句是等價的。
一般情況下,我們都把只涉及單表的過濾條件放到WHERE
子句中,把涉及兩表的過濾條件都放到ON
子句中,我們也一般把放到ON
子句中的過濾條件也稱之為連線條件。
左外連線和右外連線簡稱左連線和右連線,所以下邊提到的左外連線和右外連線中的
外
字都用括號擴起來,以表示這個字兒可有可無。
我們前邊說過,連線的本質就是把各個連線表中的記錄都取出來依次匹配的組合加入結果集並返回給使用者。不論哪個表作為驅動表,兩表連線產生的笛卡爾積肯定是一樣的。而對於內連線來說,由於凡是不符合ON
子句或WHERE
子句中的條件的記錄都會被過濾掉,其實也就相當於從兩表連線的笛卡爾積中把不符合過濾條件的記錄給踢出去,所以對於內連線來說,驅動表和被驅動表是可以互換的,並不會影響最後的查詢結果。但是對於外連線來說,由於驅動表中的記錄即使在被驅動表中找不到符合ON子句條件的記錄時也要將其加入到結果集,所以此時驅動表和被驅動表的關係就很重要了,也就是說左外連線和右外連線的驅動表和被驅動表不能輕易互換。
到此這篇關於Mysql表連線的誤區與原理的文章就介紹到這了,更多相關Mysql表連線原理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45