博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql left join,right join,inner join用法分析
阅读量:4680 次
发布时间:2019-06-09

本文共 4907 字,大约阅读时间需要 16 分钟。

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           20060324012           a20050112       1           20060324013           a20050113       1           20060324014           a20050114       1           20060324015           a20050115       1           20060324011           a20050111       2           20060324022           a20050112       2           20060324023           a20050113       2           20060324024           a20050114       2           20060324025           a20050115       2           20060324021           a20050111       3           2006032403 2           a20050112       3           2006032403 3           a20050113       3           2006032403 4           a20050114       3           2006032403 5           a20050115       3           2006032403 1           a20050111       4           20060324042           a20050112       4           20060324043           a20050113       4           20060324044           a20050114       4           20060324045           a20050115       4           20060324041           a20050111       8           20060324082           a20050112       8           20060324083           a20050113       8           20060324084           a20050114       8           20060324085           a20050115       8           2006032408

 

 

以上写法等效于:
select * from a,b

 

6.自然连接(转自:)

两张表:

自然连接

通过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

你可能感兴趣的文章