left join, right join, inner join

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

先给个通俗的解释吧.

例表a

aid

adate

1

a1

2

a2

3

a3

扫描二维码关注公众号,回复: 1149582 查看本文章

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    
没有这种写法,错误的语句.

整理了一张图

猜你喜欢

转载自sjmz30071360.iteye.com/blog/2185003