将多个表中的相应列匹配的记录取出。使用内链接时,链接的顺序不重要,优化器会帮助把小表放在前面做为驱动表。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