【问题标题】:SQL Join ON field differencesSQL Join ON 字段差异
【发布时间】:2014-10-08 09:33:28
【问题描述】:

我有一个关于从 SQL 中使用 JOINS 的问题:

两者有什么区别:

Select * From Employees E
JOIN Products P ON E.idEmployee = P.idEmployee
JOIN ProductsDetails PD ON P.idProduct = PD.idProduct

Select * From Employees E
JOIN Products P ON P.idEmployee = E.idEmployee
   JOIN ProductsDetails PD ON PD.idProduct = P.idProduct

还有,有什么区别:

Select * From Employees E
JOIN Products P ON E.idemployee =P.idemployee
Where P.name like '%prod01%'

 Select * From Employees E
    JOIN Products P ON E.idemployee =P.idemployee
    Where E.ProdName like '%prod01%' //considering the fact that the field ProdName also exists in the table Products.

实际上,查询实际上是如何工作的,我的意思是工作流程:

Select * From Employees E
JOIN Products P ON E.idemployee = P.idEmployee
JOIN ProductsDetails PD ON P.idProduct = PD.idProduct
JOIN OtherTable OT ON E.idField = OT.idField
where E.ProductNumber = 1 and OT.idOfAnotherField = value

Join 子句上的 where 条件如何影响主查询,查询实际如何工作,它首先带来什么以及如何应用条件?

【问题讨论】:

  • 所有这些问题都已在 stackoverflow 上得到解答。请先搜索。例如:stackoverflow.com/questions/16360860/… 通常,这取决于您使用的 rdbms(例如 MS SQL-Server 或 Oracle)。优化器可以更改顺序。
  • 我想知道ProdNameEmployees 表中做了什么。
  • 这只是一个基于真实查询的示例

标签: sql


【解决方案1】:

评论有点长。

SQL 是一种描述性 语言而不是过程 语言。也就是说,select 语句描述了处理数据产生的结果,而不是用于实现它的方法。数据库引擎的两个重要部分是确定如何执行查询的 优化器 和实际执行查询的 执行引擎

从优化器的角度来看,col1 = col2col2 = col1 是一样的。因此,前两个查询没有区别。从查询的作用来看,name 的两个示例是相同的。或者,至少,表面上是一样的。两个产品列可能有不同的排序规则集,这会影响含义。

至于您的最后一个问题,您需要查看您的数据库文档。执行的细节高度依赖于数据库。您还应该了解explain 和执行计划。

【讨论】:

    【解决方案2】:

    前两个查询没有区别,只是提供了连接两个表的条​​件,所以 Table1.FieldName = Table2.FieldName 与 Table2.FieldName = Table1.FieldName 相同。

    后两个查询的区别在于,第一个查询是在 product 表中搜索产品名称,而第二个查询是在 Employee 表中。

    如果产品表中存在名称为“%prod01%”的产品,则第一个查询将返回它,第二个查询将不会返回,如果员工表中有名称为“%prod01%”的产品,则第二个查询会返回值,第一个不会。

    查询从构建连接开始,首先选择 Employee 表,然后连接 Employee 表和 Product 表的值,其中 idEmployee 和 Products 和 ProductsDetails 表以及 ProductsDetails 表和 OtherTable 最后查询根据Employee表的ProductNumber和OtherTable的idOfAnotherFields过滤结果。

    【讨论】:

      猜你喜欢
      • 2020-08-20
      • 2018-09-05
      • 2020-09-04
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多