MySQL“开启”状态 - 它做了什么?

时间:2011-01-18 05:44:57

标签: mysql inner-join

首先让我解释一下,我已经搜索了至少一个小时的任何关于MySQL中这个MUCH使用的关键字。问题是,我用来查找信息的任何搜索引擎都匹配最简单和无关的结果中的单词“ON”。我在浏览MySQL的文档时也没有运气。

我看到使用INNER JOIN作为一个条件,但我不知道它做了什么。使用的一个例子是

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 个答案:

答案 0 :(得分:2)

只需将所有ON子句移动到where子句,就可以在没有ON的情况下写入{p> INNER JOIN。使用理智的优化器,它在性能方面不会有所作为(但它仍然会使查询更清晰!)。

由于处理空值,外连接(例如,LEFT JOIN)不能。

SELECT a.foo, b.bar FROM a LEFT JOIN b ON (a.fk = b.pk)
如果b中不存在a.fk,

将返回b.bar = NULL。

SELECT a.foo, b.bar FROM a, b WHERE a.fk.b.pk
如果b。

中不存在a.fk,

将不会返回一行

仅供参考:加入语法为http://dev.mysql.com/doc/refman/5.0/en/join.html

答案 1 :(得分:0)

仅供参考,两者都是相同的,除了INNER JOIN ... ON是ANSI 92语法

您可能需要google ansi 92 syntax vs ansi 86/89 syntax

答案 2 :(得分:0)

而是编写长WHERE语句,在ON关键字

之后在JOIN闭包中的表之间放置依赖关系

它加快了数据库中的搜索过程(它实现了kartezjan矩阵),使你的代码更清晰,更容易实现真正的WHERE条件