我是 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
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用其中一种?
小智 32
在您的第一个示例中,如果用户至少存在一个电话记录,您将只返回用户和电话号码的列表。
在您的第二个示例中,您将返回所有用户的列表,以及任何可用的电话记录(如果它们不可用,您将获得NULL电话值)。
Spr*_*dzy 13
每次有人问这个问题,都有答案:http : //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
希望能帮助你理解,
一个内连接,可以根据连接标准组合返回行。
一个外连接这些回报和所有行...
...从第一个表的左连接
...从一个第二个表右侧加入
...两个表的全加盟
选择何时使用一种或另一种是确定您需要什么数据的问题。对于您的示例,如果您只需要电话中的 user_ids 与 user 中的 id 匹配的记录,则使用内部联接。如果您还想包括来自用户的没有匹配电话条目的行,那么左联接将是合适的。
有关更多信息,请参阅StackOverflow 上的这个问题。
如果您有 2 个表,如下所示:
Table1 : A1 B1 Table2 : B2 C2
- - - -
1 2 1 1
2 4 2 4
3 5 5 2
Run Code Online (Sandbox Code Playgroud)
如果您使用内部联接,您将获得:
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
Run Code Online (Sandbox Code Playgroud)
如果您使用完全外部联接,您将获得:
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
2 4 NULL NULL
NULL NULL 1 1
Run Code Online (Sandbox Code Playgroud)
如果您使用左外连接,您将获得:
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
2 4 NULL NULL
Run Code Online (Sandbox Code Playgroud)
外连接被明确设计为在其结果中产生空值,因此通常应该避免。从关系上讲,这是一种猎枪式联姻:它迫使表成为一种联合——是的,我的意思是联合,而不是加入——即使有问题的表不符合联合的通常要求。实际上,它通过在进行联合之前用空值填充一个或两个表来实现这一点,从而使它们毕竟符合那些通常的要求。但是没有理由不应该使用正确的值而不是空值来完成填充,如下例所示:
SELECT SNO , PNO
FROM SP
UNION
SELECT SNO , 'nil' AS PNO
FROM S
WHERE SNO NOT IN ( SELECT SNO FROM SP )
Run Code Online (Sandbox Code Playgroud)
或者,可以通过将 SQL 外连接运算符与 结合使用来获得相同的结果COALESCE,如下所示:
SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP
Run Code Online (Sandbox Code Playgroud)
CJ日期在“SQL与关系理论:如何编写准确的SQL代码”中对外部联接(4.6)的评论
内部联接是这样一种联接,其中显示的唯一结果是键在两个表中的结果。外部联接将显示一个表中所有键的结果,第一个表的左联接和第二个表的右联接。例如:
假设 table1 具有以下主键和数据对:(1, a), (2, b), (3, c)
假设 table2 有以下主键和数据对:(1, fun), (3, can), (4,happen)
因此,主键上 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,发生)
我希望这很好地解释了这个概念。
| 归档时间: |
|
| 查看次数: |
49625 次 |
| 最近记录: |