數據庫鏈接

內鏈接

將多個表中的相應列匹配的記錄取出。使用內鏈接時,鏈接的順序不重要,優化器會幫助把小表放在前面做爲驅動表。INNER JOIN有時也會縮寫成JOIN。mysql

SELECT customer.Id, order.name 
FROM customer INNER JOIN order 
ON customer.id = order.personId
customer.Id order.name
1 apple
2 banana

外鏈接

外鏈接分爲兩種,一個爲左鏈接,一個爲右鏈接。sql

左鏈接

以LEFT JOIN左邊的表爲驅動表。而且左邊表的記錄全都會被列出來,無論有沒有匹配上右邊的表。若右表無記錄,則顯示「null」。app

SELECT customer.Id, order.name 
FROM customer LEFT JOIN order 
ON customer.id = order.personId
customer.Id order.name
1 apple
2 banana
3 null

右鏈接

以RIGHT JOIN右邊的表爲驅動表。而且右邊表的記錄全都會被列出來,無論有沒有匹配上左邊的表。若左表無記錄,則顯示「null」。優化

SELECT customer.Id, order.name 
FROM customer RIGHT JOIN order 
ON customer.id = order.personId
customer.Id order.name
1 apple
2 banana
null PC

選擇哪一種鏈接

這裏咱們以一個左鏈接的例子來講明mysql是如何執行關聯查詢的。3d

SELECT tbl1.col1, tbl2.col2
FROM tbl1 LEFT JOIN tbl2 USING (col3)
WHERE tbl1.col1 IN(5,6)

用語言解釋一下,就是tbl1做爲外循環,拿符合條件的tbl1的記錄去匹配tbl2中的記錄。tbl2做爲內循環。在這裏,tbl1是驅動表。
用僞代碼能夠表示以下。code

outer = tbl1 where col1 IN(5,6)
while(outer) {
    while(inner) {
        if(outer.col3 == inner.col3) {
            output = [outer.col1, inner.col2];
        } else {
            output = [outer.col1, NULL];
        }
    }
}

對於兩個表的關聯查詢,應該小表驅動大表。LEFT JOIN把小表放左邊;RIGHT JOIN把小表放右邊;INNER JOIN則會自動選擇小表做爲驅動表。
咱們能夠使用explain查看是否知足小表驅動大表這個要求。
help_keyword LEFT JOIN help_relation:

help_relation RIGHT JOIN help_keyword:

從「rows」能夠看出,這兩個表的查詢,用help_keyword去驅動help_relation比較合適。blog

相關文章
相關標籤/搜索