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

    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    王五


  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/IS2120/p/6745979.html
Copyright © 2011-2022 走看看