zoukankan      html  css  js  c++  java
  • 【Left join, Inner join和Right join的区别——举例详解】

    写在前面:不总结就会忘记!

    先给个通俗的解释吧.

    例表a

    aid

    adate

    1

    a1

    2

    a2

    3

    a3

    b

    bid

    bdate

    1

    b1

    2

    b2

    4

    b4

    问题:两个表a,b相连接,要取出id相同的字段。

    select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据。

    此时的取出的是:

    1 a1 b1

    2 a2 b2

    那么left join:

    select * from a left join b on a.aid = b.bid

    首先取出a表中所有数据,然后再加上与a,b匹配的的数据

    此时的取出的是:

    1 a1 b1

    2 a2 b2

    3 a3 空字符

    同样的也有right join

    指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据

    此时的取出的是:

    1 a1 b1

    2 a2 b2

    4 空字符 b4

    ================我是分割线=====================

    下面是来自官方的解答

    SQL LEFT JOIN 关键字

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

    LEFT JOIN 关键字语法

    SELECT column_name(s)

    FROM table_name1

    LEFT JOIN table_name2

    ON table_name1.column_name=table_name2.column_name

    注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN

    原始的表 (用在例子中的)

    "Persons" 表:

    Id_P

    LastName

    FirstName

    Address

    City

    1

    Adams

    John

    Oxford Street

    London

    2

    Bush

    George

    Fifth Avenue

    New York

    3

    Carter

    Thomas

    Changan Street

    Beijing

    "Orders" 表:

    Id_O

    OrderNo

    Id_P

    1

    77895

    3

    2

    44678

    3

    3

    22456

    1

    4

    24562

    1

    5

    34764

    65

    左连接(LEFT JOIN)实例

    现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。

    您可以使用下面的 SELECT 语句:

    SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

    FROM Persons

    LEFT JOIN Orders

    ON Persons.Id_P=Orders.Id_P

    ORDER BY Persons.LastName

    结果集:

    LastName

    FirstName

    OrderNo

    Adams

    John

    22456

    Adams

    John

    24562

    Carter

    Thomas

    77895

    Carter

    Thomas

    44678

    Bush

    George

      

    LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

     

    =====================下面还是通俗的说法========================================

    A    left    join    B    表示:连接的记录数与A表的记录数同,即A表是主表
    A    right    join    B    表示:连接的记录数与B表的记录数同,即B表是主表
    A    left    join    B    等价B    right    join    A
    
    table    A:  
    
       Field_K,    Field_A  
    
       1                        a  
    
       3                        b  
    
       4                        c  
    
       table    B:  
    
       Field_K,    Field_B  
    
       1                        x  
    
       2                        y  
    
       4                        z  
    
    左连接:
       select    a.Field_K,    a.Field_A,    b.Field_K,    b.Field_B  
    
       from    a    left    join    b    on    a.Field_K=b.Field_K  
    
    结果为:
       Field_K          Field_A        Field_K          Field_B          
    
       ----------            ----------        ----------        ----------    
    
       1                      a                      1                   x                         
    
       3                      b                      NULL             NULL  
    
       4                      c                      4                   z                    
    
    右连接:
       select    a.Field_K,    a.Field_A,    b.Field_K,    b.Field_B  
    
       from    a    right    join    b    on    a.Field_K=b.Field_K  
    
    结果为:
       Field_K          Field_A          Field_K          Field_B          
    
       ----------        ----------           ----------            ----------    
    
       1                      a                      1               x                    
    
       NULL             NULL              2                y
    
       4                      c                      4                 z
    
    举个例子:
    假设a表和b表的数据是这样的。
       a                          b    
    
       id      name         id      stock   
    
       1        a              1          15  
    
       2        b              2          50  
    
       3        c                   
    
       select    *    from    a    inner    join    b    on    a.id=b.id  
    
    这个语法是连接查询中的内连接,它产生的结果是两个表相匹配的记录出现在结果列表中
    根据上面的表,出现的结果是这样的
       a.id      name      b.id      stock  
    
       1        a              1          15  
    
       2        b              2          50  
    
       ----------------------------  
    
       select    *    from    a,b    where    a.id=b.id  
    
    这个语法是内连接的另外一种写法,其执行结果与inner    join    一样
       --------------------------------    
    
       select    *    from    a    left/right    join    b    on    a.id=b.id  
    
    这个是外连接语法中的左外连接或右外连接
    如果是左外连接的话,它将显示a表的所有记录,
       select    a.*,b.*    from    a    left    join    b    on    a.id=b.id  
    
    查询的结果是这样的:
       a.id      name      b.id      stock  
    
       1          a          1               15  
    
       2          b          2               50  
    
       3          c        null            null   
    
       --------------------------------------------  
    
    如果是右外连接的话,它将显示b表的所有记录,
       select    a.*,b.*    from    a    right    join    b    on    a.id=b.id  
    
    查询的结果是这样的:
       a.id      name      b.id      stock  
    
       1          a          1              15  
    
       2          b          2              50   
    
    select    a.*,b.*    from    a    left    join    b    on    a.k    =    b.k    
    
       select    a.*,b.*    from    a    left    outer    join    b    on    a.k    =b.k  
    
       ----------上面两种一样left    joinleft    outer    join的简写
       select    a.*,b.*    from    a    left    inner    join    b    on    a.k    =    b.k    
    
    没有这种写法,错误的语句.

    整理了一张图

  • 相关阅读:
    WCF使用net.tcp寄宿到IIS中
    (转)Dubbo 简单Dome搭建
    Linux压缩解压
    Linux关闭开启防火墙命令
    简单登录(jsp+servlet)
    UVa 10285 Longest Run on a Snowboard [DP]
    UVa 1218 Perfect Service [DFS+DP]
    第三届ACM山东省赛 Pick apples [贪心+动规]
    ZOJ 3326
    HDU 1029
  • 原文地址:https://www.cnblogs.com/fanyong/p/2088519.html
Copyright © 2011-2022 走看看