AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 153
Accepted
Julien
Julien
Asked: 2011-01-05 05:47:14 +0800 CST2011-01-05 05:47:14 +0800 CST 2011-01-05 05:47:14 +0800 CST

INNER JOIN 和 OUTER JOIN 有什么区别?

  • 772

我是 SQL 新手,想知道这两种类型有什么区别JOIN?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

我什么时候应该使用其中一种?

join
  • 8 8 个回答
  • 50089 Views

8 个回答

  • Voted
  1. Best Answer
    LittleBobbyTables - Au Revoir
    2011-01-05T05:55:23+08:002011-01-05T05:55:23+08:00
    • 内连接只会选择连接键在两个指定表中的记录。
    • 左外连接将选择第一个表中的所有记录,以及第二个表中与连接键匹配的任何记录。
    • 右外连接将选择第二个表中的所有记录,以及第一个表中与连接键匹配的任何记录。

    在您的第一个示例中,如果用户至少存在一个电话记录,您将只返回用户列表和电话号码。

    在您的第二个示例中,您将返回所有用户的列表,以及任何可用的电话记录(如果它们不可用,您将获得NULL电话值)。

    • 32
  2. Spredzy
    2011-01-05T06:15:40+08:002011-01-05T06:15:40+08:00

    每次有人问这个问题,都有答案: http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

    希望能帮助你理解

    • 13
  3. Leigh Riffel
    2011-01-05T05:51:50+08:002011-01-05T05:51:50+08:00

    内连接返回可以根据连接条件组合的行。外连接
    返回这些和所有行...    ...从第一个表进行左连接    ...从第二个表进行右连接    ...从两个表进行完全连接



    选择何时使用其中一个是确定您需要哪些数据的问题。对于您的示例,如果您只需要电话中的 user_ids 与用户中的 ids 匹配的记录,则使用内部联接。如果您还想包含用户中没有匹配电话条目的行,那么左连接将是合适的。

    有关更多信息,请参阅StackOverflow 上的这个问题。

    • 8
  4. Am1rr3zA
    2011-01-05T06:14:24+08:002011-01-05T06:14:24+08:00

    如果您有 2 个如下表:

    Table1 :   A1    B1          Table2  :    B2     C2 
               -     -                        -      -
               1     2                        1      1
               2     4                        2      4
               3     5                        5      2
    

    如果您使用内部联接,您将获得:

     A1     B1     B2      C2  
     -      -      -       -
     1      2      2       4
     3      5      5       2
    

    如果您使用完全外部联接,您将获得:

     A1     B1     B2      C2  
     -      -      -       -
     1      2      2       4
     3      5      5       2
     2      4    NULL     NULL
    NULL   NULL    1       1
    

    如果您使用左外连接,您将获得:

     A1     B1     B2      C2  
     -      -      -       -
     1      2      2       4
     3      5      5       2
     2      4    NULL     NULL
    
    • 7
  5. onedaywhen
    2011-10-29T01:25:02+08:002011-10-29T01:25:02+08:00

    外连接被明确设计为在其结果中产生空值,因此通常应该避免。从关系上讲,这是一种霰弹枪婚姻:它迫使表成为一种联合——是的,我的意思是联合,而不是联合——即使所讨论的表不符合联合的通常要求。实际上,它是通过在执行联合之前用空值填充一个或两个表来做到这一点的,从而使它们最终符合那些通常的要求。但是没有理由不应该使用正确的值而不是空值来完成填充,如下例所示:

    SELECT SNO , PNO 
    FROM   SP 
    UNION  
    SELECT SNO , 'nil' AS PNO 
    FROM   S 
    WHERE  SNO NOT IN ( SELECT SNO FROM SP )
    

    或者,可以通过将 SQL 外连接运算符与 结合使用来获得相同的结果COALESCE,如下所示:

    SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
    FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP
    

    CJ Date《SQL与关系理论:如何编写准确的SQL代码》中关于外连接(4.6)的评论

    • 6
  6. indyK1ng
    2011-01-06T11:06:19+08:002011-01-06T11:06:19+08:00

    内连接是一种连接,其中显示的唯一结果是键在两个表中的结果。外连接将显示一个表中所有键的结果,第一个表的左连接和第二个表的右连接。例如:

    假设 table1 具有以下主键和数据对:(1, a), (2, b), (3, c)

    假设 table2 有以下主键和数据对:(1, fun), (3, can), (4, occur)

    因此,在主键上 table1 到 table2 的内部连接将产生以下结果三元组(公共主键第一,第一个表的第二项第二项,第二个表的第二项第三项):(1,a,fun),( 3、c、可以)

    主键上 table1 到 table2 的左外连接将产生以下结果三元组(格式与上述相同):(1, a, fun), (2, b, NULL), (3, c, can)

    主键上 table1 到 table2 的右外连接将产生以下结果三元组(格式与上述相同):(1, a, fun), (3, c, can), (4, NULL, hana)

    我希望这能很好地解释这个概念。

    • 5
  7. bernd_k
    2011-01-05T06:14:49+08:002011-01-05T06:14:49+08:00

    让我试着更直观地描述一下。

    内连接显示了拥有一部或多部电话及其电话号码的用户。

    左外连接还列出了那些没有电话的“用户”。

    • 4
  8. AmDB
    2011-12-16T21:42:40+08:002011-12-16T21:42:40+08:00

    由于您已询问何时使用什么,这里有一个带有查询的场景 - 根据要求选择要使用的。

    数据:

    表用户有 10 条记录。表Phoneno 有6 条记录(1:1 关系,意味着PhoneNo 中的条目将仅引用Users 中的一个条目,并且PhoneNo 中只有一个条目可以引用Users 中的给定条目)。

    要求 1:向所有用户显示他们的电话号码。忽略没有电话号码的用户。

    询问:

    SELECT u.uid, u.name, p.phonno 
      FROM user u 
    INNER JOIN phones p ON p.uid = u.uid
    

    结果:显示 6 个有电话号码的用户

    要求 2:向所有用户显示他们的电话号码。如果用户没有电话显示“N/A”(不可用)

    询问:

    SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
      FROM user u 
    LEFT OUTER JOIN phones p ON p.uid = u.uid
    

    结果:

    显示所有 10 条记录

    注意:ifnull 是一种 MySql 语法,用于转换 null 值。当 phonno 为空时,我使用此功能使数据库引擎显示“N/A”。如果您正在使用其他一些 DBMS,请寻找合适的功能。在 SQL Server 中,您必须使用该CASE语句。

    我希望这有帮助。

    • 4

相关问题

  • JOIN 语句的输出是什么样的?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve