内连接
将多个表中的相应列匹配的记录取出。使用内连接时,连接的顺序不重要,优化器会帮助把小表放在前面作为驱动表。INNER JOIN有时也会缩写成JOIN。
SELECT customer.Id, order.name
FROM customer INNER JOIN order
ON customer.id = order.personId
customer.Id | order.name |
---|---|
1 | apple |
2 | banana |
外连接
外连接分为两种,一个为左连接,一个为右连接。
左连接
以LEFT JOIN左边的表为驱动表。并且左边表的记录全都会被列出来,不管有没有匹配上右边的表。若右表无记录,则显示“null”。
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是如何执行关联查询的。
SELECT tbl1.col1, tbl2.col2
FROM tbl1 LEFT JOIN tbl2 USING (col3)
WHERE tbl1.col1 IN(5,6)
用语言解释一下,就是tbl1作为外循环,拿符合条件的tbl1的记录去匹配tbl2中的记录。tbl2作为内循环。在这里,tbl1是驱动表。
用伪代码可以表示如下。
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比较合适。