Sql 这两个查询有何不同?两者都给出了相同的结果

Sql 这两个查询有何不同?两者都给出了相同的结果,sql,sql-server,Sql,Sql Server,如果两者相同,我应该选择哪一个,为什么?通常,显式连接底部版本更易于阅读/调试。因此,如果其他人需要使用相同的代码,或者您需要在长时间后对其进行检查,这是首选。通常,显式连接底部版本更易于阅读/调试。因此,如果其他人需要使用相同的代码,或者您需要在很长时间后检查代码,这是首选。如果您想要连接两个表,可以通过两种方式进行连接。一个使用符合ANSI标准的内部联接,另一个使用旧式联接 但建议不要使用旧式连接。原因如下 让我们创建以下数据集 select a.MenuID,a.MenuStructure

如果两者相同,我应该选择哪一个,为什么?

通常,显式连接底部版本更易于阅读/调试。因此,如果其他人需要使用相同的代码,或者您需要在长时间后对其进行检查,这是首选。通常,显式连接底部版本更易于阅读/调试。因此,如果其他人需要使用相同的代码,或者您需要在很长时间后检查代码,这是首选。

如果您想要连接两个表,可以通过两种方式进行连接。一个使用符合ANSI标准的内部联接,另一个使用旧式联接

但建议不要使用旧式连接。原因如下

让我们创建以下数据集

select a.MenuID,a.MenuStructureID,b.MenuName from 
MenuStructure a, Menu b
where b.MenuID=a.MenuID

select a.MenuID,a.MenuStructureID,b.MenuName from 
MenuStructure a
join Menu b  
on b.MenuID=a.MenuID
如果要显示每个项目\项目描述以及销售的总数量,可以使用此代码

方法1:内部联接

方法2:使用WHERE子句进行旧式连接

两者都返回以下结果

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
,item_sales AS details
WHERE item.item_id=details.item_id
GROUP BY item.item_description;
但是如果您错误地忽略了方法2中的WHERE条件,会发生什么呢

item_description qty
 ------------------- ----------
 LG 25
 Samsung 2
结果是

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
,item_sales AS details
GROUP BY item.item_description;
这是完全错误的,因为它会导致交叉连接

但如果没有指定联接,方法1将抛出错误

item_description qty
 ------------------- ----------
 LG 27
 Samsung 27
错误是


参考资料:

如果要联接两个表,可以用两种方法。一个使用符合ANSI标准的内部联接,另一个使用旧式联接

但建议不要使用旧式连接。原因如下

让我们创建以下数据集

select a.MenuID,a.MenuStructureID,b.MenuName from 
MenuStructure a, Menu b
where b.MenuID=a.MenuID

select a.MenuID,a.MenuStructureID,b.MenuName from 
MenuStructure a
join Menu b  
on b.MenuID=a.MenuID
如果要显示每个项目\项目描述以及销售的总数量,可以使用此代码

方法1:内部联接

方法2:使用WHERE子句进行旧式连接

两者都返回以下结果

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
,item_sales AS details
WHERE item.item_id=details.item_id
GROUP BY item.item_description;
但是如果您错误地忽略了方法2中的WHERE条件,会发生什么呢

item_description qty
 ------------------- ----------
 LG 25
 Samsung 2
结果是

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
,item_sales AS details
GROUP BY item.item_description;
这是完全错误的,因为它会导致交叉连接

但如果没有指定联接,方法1将抛出错误

item_description qty
 ------------------- ----------
 LG 27
 Samsung 27
错误是


参考资料:

对于非常简单的查询,很难证明使用JOIN代替,。正如你所看到的,这两者非常相似。如果布局稍有不同,这一点更为明显

Incorrect syntax near the keyword 'group'.
看起来好像只是用JOIN替换,用ON替换

然而,一旦您编写了更复杂的查询,使用连接表示法就变得更容易阅读,并且从一开始就更难出错

缺失谓词

例如,这两种方法都有相同的错误,但只有连接表示法会给出语法错误,并且首先更容易直观地发现

第一个查询运行良好,相当于交叉连接项i,运行起来很昂贵,调试起来也很痛苦

但是,第二个查询在JOIN Items i附近出现语法错误,原因是缺少i.MenuID=b.MenuID或类似的谓词

这样的语法错误对于及早发现打字错误和其他愚蠢的错误非常有帮助

外连接

使用外部联接比使用+

这与旧的符号相比

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a
LEFT OUTER JOIN
  Menu b  
    ON b.MenuID = a.MenuID
外部联接不仅更容易阅读,如果您错误地键入以下内容,您将得到不同的结果!细微的打字错误同样是合法的,但后果难以察觉

甚至有些表达式可以用外部联接编写,但不能用、和+编写。我把它留给你去研究

因此,几乎每个主要发行版都建议不要使用+

如果不打算使用+,则需要使用外部联接。 如果要使用外部联接,则不能使用, 而且真的真的不混,用外接。。。 使用Oracle进行传播的主要罪魁祸首之一是Oracle。它的教程和帮助文件都充满了,。但即使是Oracle也建议不要使用+

结论

总的来说,连接语法更易于阅读,并且更容易出现语法错误,其中可能会出现无声故障

当引入外部联接时,它会变得复杂,甚至导致、+无法处理的情况


更不用说JOIN是在1992年编纂的。你为什么要使用比这更古老的标准呢

对于非常简单的查询,很难证明使用JOIN而不是,。正如你所看到的,这两者非常相似。如果布局稍有不同,这一点更为明显

Incorrect syntax near the keyword 'group'.
看起来好像只是用JOIN替换,用ON替换

然而,一旦您编写了更复杂的查询,使用连接表示法就变得更容易阅读,并且从一开始就更难出错

缺失谓词

例如,这两种方法都有相同的错误,但只有连接表示法会给出语法错误,并且首先更容易直观地发现

第一个查询运行良好,相当于交叉连接项i,运行起来很昂贵,调试起来也很痛苦

但是,第二个查询有语法错误n 由于i.MenuID=b.MenuID或类似项上缺少谓词,因此ear连接项i

这样的语法错误对于及早发现打字错误和其他愚蠢的错误非常有帮助

外连接

使用外部联接比使用+

这与旧的符号相比

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a
LEFT OUTER JOIN
  Menu b  
    ON b.MenuID = a.MenuID
外部联接不仅更容易阅读,如果您错误地键入以下内容,您将得到不同的结果!细微的打字错误同样是合法的,但后果难以察觉

甚至有些表达式可以用外部联接编写,但不能用、和+编写。我把它留给你去研究

因此,几乎每个主要发行版都建议不要使用+

如果不打算使用+,则需要使用外部联接。 如果要使用外部联接,则不能使用, 而且真的真的不混,用外接。。。 使用Oracle进行传播的主要罪魁祸首之一是Oracle。它的教程和帮助文件都充满了,。但即使是Oracle也建议不要使用+

结论

总的来说,连接语法更易于阅读,并且更容易出现语法错误,其中可能会出现无声故障

当引入外部联接时,它会变得复杂,甚至导致、+无法处理的情况


更不用说JOIN是在1992年编纂的。你为什么要使用比这更古老的标准呢

我相信有人会以更高的洞察力回答rhis,但一般来说:第二种方法是更新的,你应该坚持下去。一个优点是您不能忘记使用ON子句,因为它将提供一个错误;虽然第一种方法可以在没有where的情况下工作,并返回一个巨大的笛卡尔积。我相信有人会以更高的洞察力回答rhis,但一般来说:第二种方法是更新的,你应该坚持。一个优点是您不能忘记使用ON子句,因为它将提供一个错误;而第一个将在没有where的情况下工作,并返回一个巨大的笛卡尔乘积。这当然不是您应该使用join的原因。@Hello\u my\u dog\u can\u code:实际上,可读性和可维护性也是我使用join的首要原因。您的主要原因是什么?这只是一个坏习惯,例如SQL Server 2008-2012中不推荐/停止使用此语法的外部联接版本。这当然不是您应该使用联接的原因。@Hello\u my\u dog\u can\u code:实际上,可读性和可维护性也是我使用联接的主要原因。您的主要原因是什么?这只是一个坏习惯,例如,SQL Server 2008-2012中不推荐/停止使用此语法的外部联接版本。