zoukankan      html  css  js  c++  java
  • 数据库连接

    内连接

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

  • 相关阅读:
    tree命令详解
    rm 命令详解
    rename命令详解
    pwd命令详解
    mv命令详解
    mkdir命令详情
    find命令详解
    dockerfile中配置时区
    docker导入导出
    docker上传私有仓库报错
  • 原文地址:https://www.cnblogs.com/season-peng/p/7757998.html
Copyright © 2011-2022 走看看