数据库连接

内连接

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

posted @ 2018-01-22 14:00  水煮海鲜  阅读(107)  评论(0编辑  收藏  举报