mysql 內連線、左連線會出現笛卡爾積?
阿新 • • 發佈:2018-11-10
這周的部門週會,分享的同事說的是資料庫優化相關,過程中,一個同事跟我討論左連線查詢,是不是笛卡爾積。我第一反應,左連線肯定不是笛卡爾積啊,左連線是以左表為準,左表有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不支援