1. 程式人生 > >mysql 內連線、左連線會出現笛卡爾積?

mysql 內連線、左連線會出現笛卡爾積?

  這周的部門週會,分享的同事說的是資料庫優化相關,過程中,一個同事跟我討論左連線查詢,是不是笛卡爾積。我第一反應,左連線肯定不是笛卡爾積啊,左連線是以左表為準,左表有m條記錄,則結果集是m條記錄(哈哈,如果是你,你是不是也是這樣的反映),同事聽了,說內連線會是笛卡爾積。聽到這句話的我的表情是這樣的

這裡寫圖片描述

  散會後,在資料庫裡試驗了一下,發現,事實比想象中要複雜。首先說下結論:連結查詢,如果on條件是非唯一欄位,會出現笛卡爾積(區域性笛卡爾積);如果on條件是表的唯一欄位,則不會出現笛卡爾積。

  下面是具體的試驗:

  文中會有兩張表,user表和job表,表資料如下

這裡寫圖片描述

這裡寫圖片描述

交叉連線

SELECT
     *
FROM
     `user` CROSS JOIN job;  

這種等同於(交叉查詢等於不加on的內連線)

SELECT
    *
FROM
    `user` , job;

  sql執行結果:

這裡寫圖片描述

  結論:交叉連線,會產生笛卡爾積。

內連線

內連線唯一欄位

SELECT
    *
FROM
    `user` u JOIN job j ON u.JOB_ID=j.ID;

這裡寫圖片描述

  結論:假如,內連線查詢,on條件是A表或者B表的唯一欄位,則結果集是兩表的交集,不是笛卡爾積。

內連線非唯一欄位

  如果A表有m條記錄,m1條符合on條件,B表有n條記錄,有n1條符合on條件,則結果集是m1*n1

SELECT
    *
FROM
    `user` u JOIN job j ON u.valid=j.valid;

這裡寫圖片描述

  結論:假如,on條件是表中非唯一欄位,則結果集是兩表匹配到的結果集的笛卡爾積(區域性笛卡爾積) 。

外連線

左連線

左連線唯一欄位

  假如A表有m條記錄,B表有n條記錄,則結果集是m條
  
SELECT
*
FROM
user u LEFT JOIN job j ON u.JOB_ID=j.id;

這裡寫圖片描述

結論:on條件是唯一欄位,則結果集是左表記錄的數量。

左連線非唯一欄位

  如果A表有m條記錄,m1條符合on條件,B表有n條記錄,有n1條符合on條件,則結果集是 (m-m1) + m1*n1

SELECT
    *
FROM
    `user` u LEFT JOIN job j ON u.VALID=j.VALID;

這裡寫圖片描述

  結論:左連線非唯一欄位,是區域性笛卡爾積。

右連線

  同左連線,這裡就不贅述了

全外連線

  mysql不支援