• 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

  • 相关阅读:
    javaweb基础----省市县三级联动(javascript版)
    javaweb开发出错排查思路
    javaweb基础----使用原生fileupload上传文件时找不到上传的文件位置
    javaweb基础----Tomcat启动失败(Tomcat9)
    javaweb基础----Tomcat端口被占用
    命令行显示
    java开发环境
    java se ee me 区别
    解决win10 2503 2502 权限等问题
    浏览器只有ie可以登录
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/8324475.html
Copyright © 2020-2023  润新知