• 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

  • 相关阅读:
    获取Finacial dimension value的description 值
    创建一个List获取数据的lookup
    定位form光标行
    Business Unit Lookup in Form
    Linu各种版本
    redis的具体使用
    php中date()函数使用的方法
    Spring整合Hibernate中自动建表
    Android之手机电池电量应用
    SSH整合时,关于访问数据库的load的错误
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/8136187.html
Copyright © 2020-2023  润新知