数据库链接

内链接

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

相关文章
相关标签/搜索