zoukankan      html  css  js  c++  java
  • 数据库左连接的一点知识

    数据库左连接的一点知识

     

    数据库的做链接我们经常遇到,有一次发现了顺序问题,没有搞明白,现在在回顾总结下。

    首先创建2张表A,B,然后插入初始化数据。

    create table A(id int);
    create table B(id int);
    
    INSERT INTO A VALUES(1);
    INSERT INTO A VALUES(2);
    INSERT INTO A VALUES(3);
    
    INSERT INTO B VALUES(1);
    INSERT INTO B VALUES(2);
    INSERT INTO B VALUES(3);
    
    SELECT * FROM A;
    SELECT * FROM B;
    
    id
    
    
    
    
    id
    
    
    
    
    我们假设命名为Case1.
    --现在看看这个左连接
    select a.*,b.*
    from   A a left join B b 
    on     a.id =b.id and a.id=2;  
    
    id          id
    ----------- -----------
               NULL
               2
               NULL
    
     
    
    这里我们假设命名为Case2
    --看看下面这个
    select a.*,b.* 
    from   A a left join B b 
    on     a.id =b.id 
    where  a.id=2;
    
    id          id
    ----------- -----------
               2

    于是出现了Case1与Case2两种不同的结果,这里说明了什么呢?

    首先我们要知道什么是左连接:左连接的关键字是Left join ,

    LEFT JOIN 关键字会从左表 (A) 那里返回所有的行,即使在右表 (B) 中没有匹配的行,显示为空值(NULL)。

    Case1没有用到where筛选,Case2用到了Where筛选

       在使用left jion时,on和where条件的区别如下: 

    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    ( left join:一旦加上where条件,则显示的结果等于inner join)

      其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。

    而inner join没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

    例如,

    select a.*,b.*
    from   A a left join B b 
    on     a.id =b.id and a.id=4;  
    
    id       id
            NULL
            NULL
            NULL

    这里看到,用and的时候,不管条件为真还是假都返回left或right表中的记录

    select a.*,b.* 
    from   A a left join B b 
    on     a.id =b.id 
    where  a.id=4;
    
    id     id

    这里没有查询出任何数据,

    可以看出 

    left join:一旦加上where条件,则显示的结果等于inner join

    select a.*,b.*
    from   A a inner join B b 
    on     a.id =b.id and b.id=2;  
    
    id   id
    2     2

    而inner join没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

    基本查询情况就是这样子的。

    共同学习,共同进步!
  • 相关阅读:
    dotnet core 获取 MacAddress 地址方法
    dotnet core 获取 MacAddress 地址方法
    dotnet core 发布只带必要的依赖文件
    dotnet core 发布只带必要的依赖文件
    Developing Universal Windows Apps 开发UWA应用 问答
    Developing Universal Windows Apps 开发UWA应用 问答
    cmd 如何跨驱动器移动文件夹
    cmd 如何跨驱动器移动文件夹
    C++ 驱动开发 error LNK2019
    C++ 驱动开发 error LNK2019
  • 原文地址:https://www.cnblogs.com/karkash/p/3014287.html
Copyright © 2011-2022 走看看