將多個表中的相應列匹配的記錄取出。使用內鏈接時,鏈接的順序不重要,優化器會幫助把小表放在前面做爲驅動表。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