MySQL的“ON”条件 - 它是什么作用?

3

首先,让我解释一下,我已经搜索了至少一个小时,寻找关于MySQL中这个非常常用的关键字的任何信息。问题在于,我使用任何搜索引擎查找与其相关的信息时,都会匹配到最琐碎和不相关的结果中的单词“ON”。我在浏览MySQL的文档时也没有找到什么有用的信息。

我看到INNER JOIN与ON一起作为条件使用,但我不知道它是做什么的。以下是一个使用示例:

SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

我知道"WHERE"和"HAVING"的区别在于前者过滤行,后者过滤分组。

但我无法想象"ON"过滤什么。

我原以为它可能是在使用INNER JOIN时进行过滤所必需的,但我之前在INNER JOIN的情况下使用了WHERE,比如这里:

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, 
    COUNT(i.id) as image_count

FROM gallery_groups g INNER JOIN
    users c INNER JOIN
    users u INNER JOIN
    gallery_images i

WHERE g.created_by=c.id AND g.updated_by=u.id AND i.group=g.id
GROUP BY g.name
ORDER BY g.date_updated DESC, g.name

有任何信息和/或示例将不胜感激!

3个回答

2

INNER JOIN可以不用ON子句,只需要将所有的ON子句移动到WHERE子句中即可。在合理的优化器下,这样做不会影响性能(但它仍然可以使查询更清晰!)。

外连接(例如LEFT JOIN)不能这样做,因为涉及到空值处理。

SELECT a.foo, b.bar FROM a LEFT JOIN b ON (a.fk = b.pk)

如果a.fk在b中不存在,那么将返回b.bar=NULL。
SELECT a.foo, b.bar FROM a, b WHERE a.fk.b.pk

如果a.fk在b中不存在,将不返回任何行。

提示:连接语法请参考http://dev.mysql.com/doc/refman/5.0/en/join.html


0

0

不要编写冗长的WHERE语句,而是在ON关键字后的JOIN闭包中放置表之间的依赖关系。

这将加速数据库中的搜索过程(与笛卡尔矩阵有关),使您的代码更清晰,更容易设置真实的WHERE条件。


尝试一些解释或基准测试,很不可能有所影响。优化器并不是那么糟糕。我怀疑即使3.x也不是。 - derobert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接