INNER JOIN ON与WHERE子句

为了简单起见,假定所有相关字段都不是NOT NULL

你可以做:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

要不然:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

这两个工作是否在MySQL以相同的方式工作?


INNER JOIN是您应该使用的ANSI语法。

它通常被认为更具可读性,尤其是当您加入大量表格时。

只要需要,它也可以很容易地用OUTER JOIN替换。

WHERE语法更多地是以关系模型为导向的。

两个JOIN ed表的结果是应用过滤器的表的笛卡尔积,该过滤器仅选择具有匹配的连接列的那些行。

WHERE语法来看这很容易。

至于你的例子,在MySQL(通常是SQL)中,这两个查询是同义词。

另请注意,MySQL也有一个STRAIGHT_JOIN子句。

使用此子句,您可以控制JOIN顺序:在外部循环中扫描哪个表格,以及哪个表格在内部循环中。

你无法使用WHERE语法在MySQL中进行控制。


其他人指出,INNER JOIN有助于人类的可读性,这是重中之重; 我同意。 让我试着解释为什么连接语法更具可读性。

一个基本的SELECT查询是这样的:

SELECT stuff
FROM tables
WHERE conditions

SELECT子句告诉我们我们回来了什么 ; FROM子句告诉我们从哪里得到它,而WHERE子句告诉我们我们得到了哪些东西。

JOIN是关于这些表格的陈述,它们是如何绑定在一起的(概念上,实际上,放入单个表格中)。 任何控制表的查询元素(我们从中获取东西的语义)都属于FROM子句(当然,这就是JOIN元素去的地方)。 将连接元素放入WHERE子句中将哪些哪里来自 ; 这就是为什么JOIN语法是首选。


在ON / WHERE中应用条件语句

这里我已经解释了逻辑查询处理步骤。


参考:在Microsoft®SQL Server™2005 T-SQL查询内部
出版商:微软出版社
Pub日期:2006年3月7日
打印ISBN-10:0-7356-2313-9
打印ISBN-13:978-0-7356-2313-2
页数:640

内部Microsoft®SQL Server™2005 T-SQL查询

(8)  SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1)  FROM <left_table>
(3)       <join_type> JOIN <right_table>
(2)       ON <join_condition>
(4)  WHERE <where_condition>
(5)  GROUP BY <group_by_list>
(6)  WITH {CUBE | ROLLUP}
(7)  HAVING <having_condition>
(10) ORDER BY <order_by_list>

与其他编程语言不同的第一个值得注意的方面是处理代码的顺序。 在大多数编程语言中,代码按写入顺序进行处理。 在SQL中,处理的第一个子句是FROM子句,而首先出现的SELECT子句几乎是最后处理的。

每个步骤都会生成一个虚拟表格,用作以下步骤的输入。 这些虚拟表对调用者(客户端应用程序或外部查询)不可用。 只有最后一步生成的表才会返回给调用者。 如果在查询中没有指定某个子句,则简单地跳过相应的步骤。

逻辑查询处理阶段简述

如果现在对这些步骤的描述似乎没有多大意义,不要太担心。 这些仅供参考。 场景示例之后的部分将更详细地介绍这些步骤。

  • FROM:FROM子句中的前两个表之间执行笛卡尔积(交叉连接),结果生成虚拟表VT1。

  • ON:ON滤波器应用于VT1。 只有<join_condition>为TRUE的行被插入到VT2中。

  • OUTER(join):如果指定了一个OUTER JOIN(与CROSS JOIN或INNER JOIN相对),那么保留的表或未找到匹配的表中的行将作为外部行添加到VT2的行中,生成VT3。 如果FROM子句中出现两个以上的表,则在最后一次连接的结果与FROM子句中的下一个表之间重复执行步骤1至3,直到处理完所有表为止。

  • WHERE:WHERE过滤器应用于VT3。 只有<where_condition>为TRUE的行被插入到VT4中。

  • GROUP BY:来自VT4的行根据GROUP BY子句中指定的列列表按组排列。 产生VT5。

  • CUBE | ROLLUP:超级组(群组)被添加到VT5的行中,生成VT6。

  • HAVING:HAVING过滤器应用于VT6。 只有<having_condition>为TRUE的组被插入到VT7中。

  • SELECT:处理SELECT列表,生成VT8。

  • DISTINCT:从VT8中删除重复的行。 产生VT9。

  • ORDER BY:来自VT9的行根据ORDER BY子句中指定的列列表进行排序。 光标被生成(VC10)。

  • TOP:从VC10开始选择指定的行数或百分比。 表VT11生成并返回给调用者。



  • 因此,在应用WHERE子句之前,(INNER JOIN)ON会过滤数据(VT本身的数据计数本身会减少)。 随后的连接条件将使用可改善性能的过滤数据执行。 之后,只有WHERE条件将应用过滤器条件。

    (在ON / WHERE中应用条件语句在少数情况下不会有太大的区别,这取决于您加入了多少表以及每个连接表中可用的行数)

    链接地址: http://www.djcxy.com/p/15127.html

    上一篇: INNER JOIN ON vs WHERE clause

    下一篇: Difference between JOIN and INNER JOIN