我是 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
我什么时候应该使用其中一种?
我是 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
我什么时候应该使用其中一种?
在您的第一个示例中,如果用户至少存在一个电话记录,您将只返回用户列表和电话号码。
在您的第二个示例中,您将返回所有用户的列表,以及任何可用的电话记录(如果它们不可用,您将获得
NULL
电话值)。每次有人问这个问题,都有答案: http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
希望能帮助你理解
内连接返回可以根据连接条件组合的行。外连接
返回这些和所有行... ...从第一个表进行左连接 ...从第二个表进行右连接 ...从两个表进行完全连接
选择何时使用其中一个是确定您需要哪些数据的问题。对于您的示例,如果您只需要电话中的 user_ids 与用户中的 ids 匹配的记录,则使用内部联接。如果您还想包含用户中没有匹配电话条目的行,那么左连接将是合适的。
有关更多信息,请参阅StackOverflow 上的这个问题。
如果您有 2 个如下表:
如果您使用内部联接,您将获得:
如果您使用完全外部联接,您将获得:
如果您使用左外连接,您将获得:
外连接被明确设计为在其结果中产生空值,因此通常应该避免。从关系上讲,这是一种霰弹枪婚姻:它迫使表成为一种联合——是的,我的意思是联合,而不是联合——即使所讨论的表不符合联合的通常要求。实际上,它是通过在执行联合之前用空值填充一个或两个表来做到这一点的,从而使它们最终符合那些通常的要求。但是没有理由不应该使用正确的值而不是空值来完成填充,如下例所示:
或者,可以通过将 SQL 外连接运算符与 结合使用来获得相同的结果
COALESCE
,如下所示:CJ Date《SQL与关系理论:如何编写准确的SQL代码》中关于外连接(4.6)的评论
内连接是一种连接,其中显示的唯一结果是键在两个表中的结果。外连接将显示一个表中所有键的结果,第一个表的左连接和第二个表的右连接。例如:
假设 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)
我希望这能很好地解释这个概念。
让我试着更直观地描述一下。
内连接显示了拥有一部或多部电话及其电话号码的用户。
左外连接还列出了那些没有电话的“用户”。
由于您已询问何时使用什么,这里有一个带有查询的场景 - 根据要求选择要使用的。
数据:
表用户有 10 条记录。表Phoneno 有6 条记录(1:1 关系,意味着PhoneNo 中的条目将仅引用Users 中的一个条目,并且PhoneNo 中只有一个条目可以引用Users 中的给定条目)。
要求 1:向所有用户显示他们的电话号码。忽略没有电话号码的用户。
询问:
结果:显示 6 个有电话号码的用户
要求 2:向所有用户显示他们的电话号码。如果用户没有电话显示“N/A”(不可用)
询问:
结果:
显示所有 10 条记录
注意:ifnull 是一种 MySql 语法,用于转换 null 值。当 phonno 为空时,我使用此功能使数据库引擎显示“N/A”。如果您正在使用其他一些 DBMS,请寻找合适的功能。在 SQL Server 中,您必须使用该
CASE
语句。我希望这有帮助。