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

先给个通俗的解释吧

例表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_Bfrom    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_Bfrom    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                          bid      name         id      stock 
1        a              1          15 
2        b              2          503        c 
select    *    from    a    inner    join    b    on    a.id=b.id 
这个语法是连接查询中的内连接,它产生的结果是两个表相匹配的记录出现在结果列表中。根据上面的表,出现的结果是这样的a.id      name      b.id      stock1        a              1          152        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      stock1          a          1               152          b          2               503          c        null            null-------------------------------------------- 
如果是右外连接的话,它将显示b表的所有记录,select    a.*,b.*    from    a    right    join    b    on    a.id=b.id查询的结果是这样的:a.id      name      b.id      stock1          a          1              152          b          2              50select    a.*,b.*    from    a    left    join    b    on    a.k    =    b.kselect    a.*,b.*    from    a    left    outer    join    b    on    a.k    =b.k----------上面两种一样left    join是left    outer    join的简写select    a.*,b.*    from    a    left    inner    join    b    on    a.k    =    b.k没有这种写法,错误的语句.

整理了一张图

JOIN表没走索引 left join on 索引_内连接