標籤: 公衆號文章mysql
爲了故事的順利發展,咱們先建立幾個表:程序員
CREATE TABLE t1 (id INT);
CREATE TABLE t2 (id INT);
CREATE TABLE t3 (id INT);
複製代碼
而後往這些表裏插入一些數據(具體的插入語句就不寫了),達到的效果就是這樣:sql
mysql> SELECT * FROM t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
mysql> SELECT * FROM t2;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
mysql> SELECT * FROM t3;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
複製代碼
若是咱們想對這三個表執行鏈接操做,把三個表中id
列相同的記錄都拿出來,有的同窗可能會這樣寫:bash
SELECT t1.id AS t1_id, t2.id AS t2_id, t3.id AS t3_id
FROM t1, t2, t3
WHERE t1.id = t2.id = t3.id;
複製代碼
這樣寫會獲得啥效果呢?咱們看一下:微信
mysql> SELECT t1.id AS t1_id, t2.id AS t2_id, t3.id AS t3_id
-> FROM t1, t2, t3
-> WHERE t1.id = t2.id = t3.id;
+-------+-------+-------+
| t1_id | t2_id | t3_id |
+-------+-------+-------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 3 | 1 |
+-------+-------+-------+
3 rows in set (0.00 sec)
mysql>
複製代碼
噫,發生了奇怪的事情,結果集中的第一條記錄是符合咱們預期的,可是剩下兩條記錄不符合咱們預期,其中t3.id
的值和t1.id
、t2.id
是不同的,這是什麼鬼呢?學習
哈哈,其實條件t1.id = t2.id = t3.id
的真實含義是這樣的:優化
(t1.id = t2.id) = t3.id
複製代碼
也就是說咱們須要分兩步理解這個表達式:ui
先運算t1.id = t2.id
,它實際上是一個布爾表達式,獲得的結果是0或者1。spa
上一步驟獲得的結果(也就是0或者1)再和t3.id
作比較。code
讓咱們再分析一下上邊的例子:
對於結果集的第一條記錄來講,t1.id
的值爲一、t2.id
的值爲一、t3.id
的值爲1。
先比較t1.id = t2.id
是否成立,很顯然1 = 1
的結果是TRUE,MySQL中用1表示這個布爾表達式的結果。
而後經過布爾表達式的結果1
再和t3.id
比較,很顯然1 = 1
成立。
對於結果集的第二條記錄來講,t1.id
的值爲二、t2.id
的值爲二、t3.id
的值爲1。
先比較t1.id = t2.id
是否成立,很顯然2 = 2
的結果是TRUE,MySQL中用1表示這個布爾表達式的結果。
而後經過布爾表達式的結果1
再和t3.id
比較,很顯然1 = 1
成立。
對於結果集的第三條記錄來講,t1.id
的值爲三、t2.id
的值爲三、t3.id
的值爲1。
先比較t1.id = t2.id
是否成立,很顯然3 = 3
的結果是TRUE,MySQL中用1表示這個布爾表達式的結果。
而後經過布爾表達式的結果1
再和t3.id
比較,很顯然1 = 1
成立。
噫,原來t1.id = t2.id = t3.id
是這個意思呀,那咱們想要實現把三個表中id
列值相同的記錄取出來的效果該咋寫?這麼寫:
SELECT t1.id AS t1_id, t2.id AS t2_id, t3.id AS t3_id
FROM t1, t2, t3
WHERE t1.id = t2.id AND t1.id = t3.id;
複製代碼
咱們看下效果:
mysql> SELECT t1.id AS t1_id, t2.id AS t2_id, t3.id AS t3_id
-> FROM t1, t2, t3
-> WHERE t1.id = t2.id AND t1.id = t3.id;
+-------+-------+-------+
| t1_id | t2_id | t3_id |
+-------+-------+-------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+-------+-------+-------+
3 rows in set (0.00 sec)
複製代碼
這樣的話,MySQL
纔會把三個表中id
列值相同的記錄取出來呢~ 必定要記住這個知識點喔,當心哪天寫三表鏈接的時候寫錯了還找不到緣由呢~
小貼士: 本文的這個問題是有《MySQL是怎樣運行的:從根兒上理解MySQL》的微信討論羣裏暱稱爲「白襯衫老胡同」的同窗提問的,說實話我也把這個知識點忘掉了,在此感謝他的問題~
想看更多MySQL進階知識能夠到小冊中查看:《MySQL是怎樣運行的:從根兒上理解MySQL》的連接 。小冊的內容主要是從小白的角度出發,用比較通俗的語言講解關於MySQL進階的一些核心概念,好比記錄、索引、頁面、表空間、查詢優化、事務和鎖等,總共的字數大約是四十多萬字,配有上百幅原創插圖。主要是想下降普通程序員學習MySQL進階的難度,讓學習曲線更平滑一點~
寫文章挺累的,有時候你以爲閱讀挺流暢的,那實際上是背後無數次修改的結果。若是你以爲不錯請幫忙轉發一下,萬分感謝~ 這裏是個人公衆號「咱們都是小青蛙」,裏邊有更多技術乾貨,時不時扯一下犢子,歡迎關注: