我是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
什么时候应该使用其中一个?
Answers:
每当有人问这个问题时,都有答案:http : //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
希望它能帮助您理解,
一个内连接,可以根据连接标准组合返回行。
一个外连接这些回报和所有行...
...从第一个表的左连接
...从一个第二个表右侧加入
...两个表的全加盟
选择何时使用一个或另一个是确定所需数据的问题。对于您的示例,如果您只需要电话中具有与用户ID匹配的用户ID的记录,则使用内部联接。如果您还希望包括没有匹配电话条目的用户行,那么左联接将是适当的。
有关更多信息,请参见StackOverflow上的此问题。
明确设计外部联接以使其结果为空,因此通常应避免使用外部联接。从关系上讲,这是一种of弹枪的婚姻:它迫使表成为一种联合体-是的,我的意思是说联合体,而不是联接-即使有问题的表不符合通常的联合体要求。实际上,这是通过在进行联合之前用一个空值填充一个或两个表来实现的,从而使它们毕竟符合那些通常的要求。但是没有理由不应该使用适当的值而不是空值来进行填充,如以下示例所示:
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
内部联接是一个联接,其中显示的唯一结果是两个表中的键均在其中的结果。外部联接将显示一个表中所有键的结果,第一个表的左联接,第二个表的右联接。例如:
假设table1具有以下主键和数据对:(1,a),(2,b),(3,c)
我们还假设table2具有以下主键和数据对:(1,fun),(3,can),(4,事件)
因此,在主键上将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,事件)
我希望这可以很好地解释这个概念。
由于您已询问何时使用什么,因此这里有一个查询场景-根据需求选择要使用的内容。
数据:
表用户有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为null时,我使用此函数使数据库引擎显示“ N / A”。如果使用其他DBMS,请寻找适当的功能。在SQL Server中,您必须使用该CASE
语句。
我希望这有帮助。