MySQL冷知識:t1.id=t2.id=t3.id看着咋這麼怪呢?

標籤: 公衆號文章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.idt2.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進階的難度,讓學習曲線更平滑一點~

題外話

寫文章挺累的,有時候你以爲閱讀挺流暢的,那實際上是背後無數次修改的結果。若是你以爲不錯請幫忙轉發一下,萬分感謝~ 這裏是個人公衆號「咱們都是小青蛙」,裏邊有更多技術乾貨,時不時扯一下犢子,歡迎關注:

相關文章
相關標籤/搜索