MySQL "ON" условие - Что это делает? - PullRequest
3 голосов
/ 18 января 2011

Прежде всего позвольте мне объяснить, что я искал, по крайней мере, час, что-нибудь относительно этого КЛЮЧЕВОГО ключевого слова, используемого в MySQL. Проблема в том, что любая поисковая система, которую я использую для поиска информации, соответствует слову «ВКЛ» в самых тривиальных и несвязанных результатах. Мне также не повезло в просмотре документации MySQL.

Я вижу, что используется с INNER JOIN как условие, но я понятия не имею, что он делает. Пример использования

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

Я знаю, что разница между "ГДЕ" и "ГЛАВНЫМ" - это разница между фильтрацией строк и групп фильтрации соответственно.

Я не могу себе представить, какие фильтры "ON", однако.

Я подумал, что это может потребоваться для фильтрации при использовании INNER JOIN, но я уже использовал WHERE в случаях INNER JOIN, как здесь:

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 голосов
/ 18 января 2011

INNER JOIN действительно можно записать без ON, просто переместив все предложения ON в предложение where.С разумным оптимизатором это не повлияет на производительность (но все равно сделает запрос более понятным!).

Внешние объединения (например, LEFT JOIN) не могут быть из-за нуляобработка.

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

вернет b.bar = NULL, если a.fk не существует в b.

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 голосов
/ 18 января 2011

Вместо написания длинного оператора WHERE вы ставите зависимость между таблицами в закрытие JOIN после ключевого слова ON

Ускоряет процесс поиска в базе данных (он реализован в матрице kartezjan), делает ваш код чище и проще в реальных условиях WHERE

0 голосов
/ 18 января 2011

К вашему сведению, оба идентичны, за исключением INNER JOIN ... ON с синтаксисом ANSI 92

Возможно, вам нужно Google ansi 92 syntax vs ansi 86/89 syntax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...