SQL加入ON字段差异

时间:2014-10-08 09:33:28

标签: sql

我有一个关于从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条件如何影响主查询,查询实际如何工作,它首先带来什么以及它如何应用条件?

2 个答案:

答案 0 :(得分:0)

前两个查询之间没有区别,您只提供了连接两个表的条​​件,因此Table1.FieldName = Table2.FieldName与Table2.FieldName = Table1.FieldName相同。

后两个查询之间的区别在于您在产品表中搜索产品名称的第一个查询,以及Employee表中的第二个查询。

如果产品表中有名称为'%prod01%'的产品,那么第一个查询将返回它,第二个查询将不返回,如果在employee表中有一个名称为'%prod01%'的产品,第二个查询将返回值,第一个不会。

查询从构建连接开始,首先选择Employee表,然后加入Employee表和Product表的值,其中idemployee等于idEmployee,并对Products和ProductsDetails表以及ProductsDetails表和OtherTable执行相同的操作。查询根据Employee Table的ProductNumber和OtherTable的idOfAnotherFields过滤结果。

答案 1 :(得分:0)

评论时间有点长。

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

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

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