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