• 数据库连接


    内连接

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

  • 相关阅读:
    四、Signalr手持令牌验证
    三、Signalr外部链接
    三、使用Fiddler劫持网络资源(手机端)
    一、数据库层搭建
    学会聊天
    weblogic实时监控开发
    jrockit静默安装笔记
    自动磁盘分区脚本
    WebsphereMQ搭建集群
    Websphere MQ Cluster
  • 原文地址:https://www.cnblogs.com/season-peng/p/7757998.html
Copyright © 2020-2023  润新知