欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库连接

程序员文章站 2022-06-11 21:19:40
...

内连接

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