zoukankan      html  css  js  c++  java
  • MySQL中的内连接、外连接、交叉连接

    内连接(INNER JOIN):  
      分为三种 等值连接、自然连接、不等连接  
          
    外连接(OUTER JOIN):  
      左外连接(LEFT OUTER JOIN或LEFT JOIN)  
      右外连接(RIGHT OUTER JOIN或RIGHT JOIN)  
      全外连接(FULL OUTER JOIN或FULL JOIN)  
      
    交叉连接(CROSS JOIN):  
      没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积

     SQL中的各种JOIN, SQL中的连接可以分为内连接,外连接,以及交叉连接(即是笛卡尔积)
     a. 交叉连接 CROSS JOIN:
      如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积; 举例
      SELECT * FROM table1 CROSS JOIN table2 等同于
      SELECT * FROM table1,table2

     b. 内连接 INNER JOIN :
        如果仅仅使用 SELECT * FROM table1 INNER JOIN table2 没有指定连接条件的话,和交叉连接的结果一样。 但是通常情况下,使用INNER JOIN需要指定连接条件。
        -- 等值连接(=号应用于连接条件, 不会去除重复的列) SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column
        -- 不等连接(>,>=,<,<=,!>,!<,<>) 例如 SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column<>b.column
        -- 自然连接(会去除重复的列)


     c. 外连接 OUTER JOIN:
      首先内连接和外连接的不同之处: 内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂地要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。 指定条件的内连接,仅仅返回符合连接条件的条目。外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者两边连接(全外连接时)的所有数据行 
      1)左外连接LEFT [OUTER] JOIN :
          显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL 例如 SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column                                                                                                                                    
      2)右外连接RIGHT [OUTER] JOIN:
         显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL 例如 SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column                                                                                                                                              
      3)全外连接:
        显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL

    例子:   
    -------------------------------------------------
      a表     id   name     b表     id   job   parent_id   
                  1   张3                   1     23     1   
                  2   李四                 2     34     2   
                  3   王武                 3     34     4       
      a.id同parent_id   存在关系   
    --------------------------------------------------    
     1) 内连接   
      select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id       
      结果是     
      1   张3                   1     23     1   
      2   李四                  2     34     2   

      2)左外连接   
      select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id       
      结果是     
      1   张3                   1     23     1   
      2   李四                  2     34     2   
      3   王武                  null   

     3) 右外连接   
      select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id       
      结果是     
      1   张3                   1     23     1   
      2   李四                  2     34     2   
      null                       3     34     4   

     4) 全外连接   
      select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   
      结果是     
      1   张3                  1     23     1   
      2   李四                 2     34     2   
      null                   3     34     4   
      3   王武                 null

     


    并集UNION :SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2
    交集JOIN :SELECT * FROM table1 AS a JOIN table2 b ON a.name=b.name
    差集NOT IN :SELECT * FROM table1 WHERE name NOT IN(SELECT name FROM table2)
    笛卡尔积CROSS JOIN :SELECT * FROM table1 CROSS JOIN table2 (   与 SELECT * FROM table1,table2相同)



     SQL中的UNION 与UNION ALL的区别是,前者会去除重复的条目,后者会仍旧保留。
        a. UNION :SQL Statement1 UNION SQL Statement2
        b. UNION ALL: SQL Statement1 UNION ALL SQL Statement2

  • 相关阅读:
    手撸ORM浅谈ORM框架之Add篇
    手撸ORM浅谈ORM框架之基础篇
    C#深入浅出获取时间DateTime
    win10安装OpenSSL及简单的使用
    .net core执行dotnet ef migrations createmodel等命令出错
    C#文字转换语音朗读或保存MP3、WAV等格式
    .Net上传图片压缩质量,不改变尺寸
    二叉平衡树
    线索排序树
    大数乘法
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/8324475.html
Copyright © 2011-2022 走看看