mysql left join,right join,inner join用法分析

1、内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。    
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。  
   
2、外联接。
外联接可以是左向外联接、右向外联接或完整外部联接。    
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:    
1)LEFT  JOIN或LEFT OUTER JOIN    
左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。      
2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN    
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。      
3)FULL  JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。  

3、交叉联接  
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。   
FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。

下面是例子分析
表A记录如下: 

aID        aNum 
1           a20050111 
2           a20050112 
3           a20050113 
4           a20050114 
5           a20050115 

表B记录如下:

bID        bName 
1            2006032401 
2           2006032402 
3           2006032403 
4           2006032404 
8           2006032408 

实验如下:

1.left join(左联接)---外连接

sql语句如下: 

SELECT * FROM a LEFT JOIN  b  ON a.aID =b.bID 

结果如下:

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 
5            a20050115         NULL       NULL 
(所影响的行数为 5 行) 

结果说明:
        left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL. 

2.right join(右联接) ----外连接

sql语句如下: 

SELECT  * FROM a RIGHT JOING b  ON a.aID = b.bID 

结果如下:

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 
NULL    NULL                   8              2006032408 
(所影响的行数为 5 行) 

结果说明:
        仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充. 

3.inner join(相等联接或内联接)

sql语句如下: 

SELECT * FROM  a INNER JOIN  b ON a.aID =b.bID 

等同于以下SQL句:

SELECT *  FROM a,b WHERE a.aID = b.bID 

结果如下:

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 

结果说明:
        很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录. 

4.全连接

sql语句如下:

SELECT * FROM  a full join JOIN  b ON a.aID =b.bID 

结果如下:

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 
NULL         NULL              8              2006032408 
5            a20050115         NULL             NULL 

结果说明:
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

5.交叉连接(取笛卡儿积)
概念:没有where条件的交叉连接将产生连接表所涉及的笛卡尔积。即TableA的行数*TableB的行数的结果集。(TableA 5行*TableB 5行=25行)

sql语句:

SELECT * FROM  a cross join JOIN  b;

 

结果如下:

aID        aNum                bID        bName 
1           a20050111       1           2006032401
2           a20050112       1           2006032401
3           a20050113       1           2006032401
4           a20050114       1           2006032401
5           a20050115       1           2006032401
1           a20050111       2           2006032402
2           a20050112       2           2006032402
3           a20050113       2           2006032402
4           a20050114       2           2006032402
5           a20050115       2           2006032402
1           a20050111       3           2006032403 
2           a20050112       3           2006032403 
3           a20050113       3           2006032403 
4           a20050114       3           2006032403 
5           a20050115       3           2006032403 
1           a20050111       4           2006032404
2           a20050112       4           2006032404
3           a20050113       4           2006032404
4           a20050114       4           2006032404
5           a20050115       4           2006032404
1           a20050111       8           2006032408
2           a20050112       8           2006032408
3           a20050113       8           2006032408
4           a20050114       8           2006032408
5           a20050115       8           2006032408
以上写法等效于:
select * from a,b

6.自然连接(转自:http://blog.csdn.net/jcy1009015337/article/details/53024912

两张表:

自然连接

通过MySql自己的判断完成连接过程,不需要指定连接条件。MySql会使用表内的,相同的字段,作为连接条件。

自然连接分为内外之分。

内:natural join

外:左外natural left join、右外natural right join

注:select * from one natural join two;

select * from one inner join two using(public_field);

两者是等效的。

同理,下面也是等效的:

natural left join & left join

natural right join & right join

原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/8136187.html