使用JOIN和普通选择选择多个表之间的区别

时间:2016-01-15 23:26:22

标签: sql sql-server

SQL Server如何执行这两个查询,有什么区别:

  1. 选择加入

    SELECT * 
    FROM AspNetUsers
    LEFT JOIN AspNetUserRoles ON AspNetUsers.Id = AspNetUserRoles.UserId
    LEFT JOIN AspNetRoles ON AspNetUserRoles.RoleId = AspNetRoles.Id
    
  2. 选择不加入

    SELECT * 
    FROM AspNetUserRoles, AspNetUsers, AspNetRoles
    WHERE AspNetUsers.Id = AspNetUserRoles.UserId 
      AND AspNetUserRoles.RoleId = AspNetRoles.Id
    
  3. 我得到的结果是相同的,除了列的顺序。

2 个答案:

答案 0 :(得分:0)

您必须使用SQL Server“实际执行计划”(按下SQL Server Management Studio中的“实际执行计划”按钮),以帮助您找到SQL Server执行它们的方式的区别。

如果它是“INNER JOIN”VS“没有加入”那么SQL Server将足够智能,使它们相同。

但是“LEFT JOIN”VS“没有加入”有不同的结果,也有不同的执行计划

查看附件照片enter image description here

答案 1 :(得分:0)

我不使用SQL Server,但我不认为它与SQL的基本方面(例如您的问题中涉及的那些)的其他DBMS不同[1]。 虽然请注意我的答案仅基于一般 SQL经验(例如dBase,Informix,Paradox,Oracle,显然是MySQL)

也就是说,我不希望您的两个版本之间存在不同的行为,因为您只使用ON和简单的WHERE条件,因此它绝对等同于使用AspNetUsers方法

然而,我很惊讶您报告只有列的订单不同。实际上,在您的#1版本中,您只能获得{{1}}表的那些,而#2应该返回所有表的所有列。

[1]在阅读了@Atheer Mostafa的答案之后添加:更确切地说,SQL Server可能内部工作不同,但结果应该相同。