zoukankan      html  css  js  c++  java
  • SQL中 Inner Join(内连),Left Join(左连),Right Join(右连),Full Join(全外连) 之间的区别

    I. 概念

    1. CROSS JOIN(交叉连接)
    如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积。
    例如:
    A:SELECT a.*,b.* FROM table1 a,table2 b WHERE a.id=b.id
    B:SELECT * FROM table1 a CROSS JOIN table2 b WHERE a.id=b.id
    一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。因此,如果两个需要求交集的表太大,将会非常非常慢。

    2. INNER JOIN(内连接)

    两边表同时符合条件的组合。
    例如:
    SELECT * FROM table1 a INNER JOIN table2  b ON a.id=b.id

    如果仅仅使用 SELECT * FROM table1 INNER JOIN table2  内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

    3. LEFT [OUTER] JOIN(左外连接 )

    显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
    例如:
    SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column

    4. RIGHT [OUTER] JOIN(右外连接)

    显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
    例如:
    SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column

    5. FULL [OUTER] JOIN(全外连接)

    显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集。
    例如:
    SELECT * FROM table1 FULL JOIN table2 ON table1.id=table2.id

    II. 辨析

    > Join = Inner Join
    > Left Join = Left Outer Join
    > Right Join = Right Outer Join
    > Full Join = Full Outer Join 
    > A left join B 的连接的记录数与A表的记录数同
    > A right join B 的连接的记录数与B表的记录数同
    > A left join B 等价于 B right join A
    > A inner join B 查询出来是A、B都有的数据
    > A full outer join B 查询出来是A、B所有总共的数据

    III. 示例

    示例表:
    A表(a1,b1,c1)      B表(a2,b2)
    a1   b1   c1       a2    b2
    01   数学 95       01    张三
    02   语文 90       02    李四
    03   英语 80       04    王五

    1. Inner Join
    select A.*,B.* from A
    inner join B on(A.a1=B.a2)
    结果是:
    a1   b1   c1       a2    b2
    01   数学 95       01    张三
    02   语文 90       02    李四

    2. Left Join
    select A.*,B.* from A
    left outer join B on(A.a1=B.a2)
    结果是:
    a1   b1   c1       a2    b2
    01   数学 95       01    张三
    02   语文 90       02    李四
    03   英语 80       NULL  NULL

    3. Right Join
    select A.*,B.* from A
    right outer join B on(A.a1=B.a2)
    结果是:
    a1   b1   c1       a2    b2
    01   数学 95       01    张三
    02   语文 90       02    李四
    NULL NULL NULL     04    王五

    4. Full Join
    select A.*,B.* from A
    full outer join B on(A.a1=B.a2)
    结果是:
    a1   b1   c1       a2    b2
    01   数学 95       01    张三
    02   语文 90       02    李四
    03   英语 80       NULL  NULL
    NULL NULL NULL     04    王五

  • 相关阅读:
    定时器
    javascript之循环保存数值
    Web 前端之HTML和CSS
    [讲解]容斥原理
    [vijos1048]送给圣诞夜的贺卡<DFS剪枝>
    [vijos1145]小胖吃巧克力<概率dp>
    [noip2012]国王游戏<贪心+高精度>
    [codevs3118]高精度除法<高精度>
    [noip2016]组合数问题<dp+杨辉三角>
    [codevs2370]小机房的树<LCA>
  • 原文地址:https://www.cnblogs.com/jancco/p/2489016.html
Copyright © 2011-2022 走看看