Задавайте вопросы, мы ответим
Вы не зашли.
Ребята, я попытался собрать информацию о различного рода JOIN'ах в сети и представить ее в виде сравнительной таблицы. Вы, как специалисты, не могли бы проверить правильность заполнения таблицы. Любые уточнения, дополнения принимаются!
Внимание: Приведенные данные актуальны только для MySQL и скорее всего будут отличаться для других СУБД!
Полезные ссылки:
1. Join (SQL). Wikipedia.
2. JOIN Syntax. dev.mysql.com.
2. A Visual Explanation of SQL Joins. codinghorror.com.
3. Объяснение SQL объединений JOIN/INNER/OUTER. skillz.ru.
4. Операции LEFT JOIN и RIGHT JOIN. vingrad.ru.
Отредактированно FiMko (23.09.2010 17:45:54)
Неактивен
INNER JOIN = JOIN и не требует отдельной строчки в таблице.
Названия колонок не очень понятны. В таблице нарушена симметрия LEFT и RIGHT JOIN. Если поменять местами первую и вторую таблицу описание LEFT JOIN должно превратиться в описание RIGHT JOIN
Неактивен
rgbeast написал:
INNER JOIN = JOIN и не требует отдельной строчки в таблице.
Названия колонок не очень понятны. В таблице нарушена симметрия LEFT и RIGHT JOIN. Если поменять местами первую и вторую таблицу описание LEFT JOIN должно превратиться в описание RIGHT JOIN
Чтобы было удобней меня редактировать переходим на текстовый вариант:
JOIN
ВЫПОЛНЕНИЕ УСЛОВИЯ СОЕДИНЕНИЯ: К ячейкам из первой (левой) таблицы присоединяются ячейки второй (правой). Записи из первой таблицы могут повторяться если им соответствует несколько записей во второй таблице.
НЕВЫПОЛНЕНИЕ УСЛОВИЯ СОЕДИНЕНИЯ: Строка игнорируется (не будет ячеек даже из первой таблицы).
ОТСУТСТВИЕ УСЛОВИЯ СОЕДИНЕНИЯ: Будет возвращено декартово произведение, в котором каждая строка одной таблицы будет сопоставлена с каждой строкой другой таблицы. То есть будут получены все возможные сочетания из обеих таблиц.
LEFT JOIN
ВЫПОЛНЕНИЕ УСЛОВИЯ СОЕДИНЕНИЯ: К ячейкам из первой (левой) таблицы присоединяются ячейки второй (правой).
НЕВЫПОЛНЕНИЕ УСЛОВИЯ СОЕДИНЕНИЯ: Поля правой таблицы заполняются значениями NULL.
ОТСУТСТВИЕ УСЛОВИЯ СОЕДИНЕНИЯ: Невозможно.
RIGHT JOIN
ВЫПОЛНЕНИЕ УСЛОВИЯ СОЕДИНЕНИЯ: К ячейкам из второй (правой) таблицы присоединяются ячейки первой (левой).
НЕВЫПОЛНЕНИЕ УСЛОВИЯ СОЕДИНЕНИЯ: Поля левой таблицы заполняются значениями NULL.
ОТСУТСТВИЕ УСЛОВИЯ СОЕДИНЕНИЯ: Невозможно.
INNER JOIN
То же самое, что JOIN.
CROSS JOIN
То же самое, что JOIN.
Отредактированно FiMko (23.09.2010 18:14:15)
Неактивен
Мне не нравятся заявления «невозможно». Это по крайней мере неправда:
mysql> select * from a left join b on 1=1; +------+------+ | a | b | +------+------+ | 1 | 1 | | 1 | 2 | | 1 | 2 | | 2 | 1 | | 2 | 2 | | 2 | 2 | +------+------+ 6 rows in set (0.00 sec)
Смысла в этом выражении, конечно, немного, но его немного и в случае с INNER JOIN
Учитывая, что RIGHT JOIN — это LEFT JOIN с операндами, расставленными в обратном
порядке, его тоже расписывать бесполезно.
Кажется, в этой таблице было бы куда полезнее написать, как из этих примитивов
собрать, например, FULL OUTER JOIN
Неактивен
paulus написал:
Мне не нравятся заявления «невозможно». Это по крайней мере неправда:
Код:
mysql> select * from a left join b on 1=1;
И указали условие ну да ладно сути в этом запросе действительно нет.
Кстати, спецификация MySQL также не предусматривает использование LEFT JOIN без join_condition:
http://dev.mysql.com/doc/refman/5.0/en/join.html написал:
table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
paulus написал:
Кажется, в этой таблице было бы куда полезнее написать, как из этих примитивов
собрать, например, FULL OUTER JOIN
Скорей всего не буду рассматривать, т.к. синтаксис FULL [OUTER] JOIN в прямом виде в MySQL [пока] не поддерживается. Его эмулируют, используя UNION. Но так как целью было описать и разобраться только с существующими в рамках MySQL JOIN'ами, то не буду пока запутывать себя и последователей Аналогично для UNION JOIN.
Вопрос 1
Исторический [любознательный] вопрос: Известно, INNER JOIN - полный аналог JOIN. Так исторически сложилось, что JOIN был введен просто как alias для INNER JOIN для краткости записи?
Вопрос 2
http://dev.mysql.com/doc/refman/5.0/en/join.html написал:
The NATURAL [LEFT] JOIN of two tables is defined to be semantically equivalent to an INNER JOIN or a LEFT JOIN with a USING clause that names all columns that exist in both tables.
Отредактированно FiMko (24.09.2010 22:17:36)
Неактивен
1. Да.
2. Попробуйте явно выбирать названиетаблицы.name — там просто
выбираются разные таблицы
3. Обычно верно обратное — вложенные запросы работают не быст-
рее объединений, но пишутся, как правило, проще (интуитивнее).
Неактивен
paulus написал:
2. Попробуйте явно выбирать названиетаблицы.name — там просто
выбираются разные таблицы
Не очень понял.. понял, что спутал местами таблицы sport_section и music_section.
Да, вижу, LEFT JOIN работает так же:
Отредактированно FiMko (26.09.2010 21:24:37)
Неактивен
А что Вас удивляет? Мой любимый пример — с корзинами яблок.
У Вас их две. В первой корзине у Вас зеленое яблоко с хвостиком
и красное без хвостика. Во второй — зеленое без хвостика и крас-
ное с хвостиком. И Ваша задача достать из корзин одинаковые
яблоки (сравните с внешним объединением: достать из первой кор-
зины яблоко, а потом из второй такое же, если найдется).
Неактивен
paulus написал:
А что Вас удивляет? Мой любимый пример — с корзинами яблок.
У Вас их две. В первой корзине у Вас зеленое яблоко с хвостиком
и красное без хвостика. Во второй — зеленое без хвостика и крас-
ное с хвостиком. И Ваша задача достать из корзин одинаковые
яблоки (сравните с внешним объединением: достать из первой кор-
зины яблоко, а потом из второй такое же, если найдется).
Нее, ну к работе INNER JOIN'а претензий нет, работает как положено, но:
http://dev.mysql.com/doc/refman/5.0/en/join.html написал:
The NATURAL [LEFT] JOIN of two tables is defined to be semantically equivalent to an INNER JOIN or a LEFT JOIN with a USING clause that names all columns that exist in both tables.
Вот этого я не вижу...
Отредактированно FiMko (26.09.2010 23:43:35)
Неактивен
А что Вас смущает то?
Неактивен
paulus написал:
А что Вас смущает то?
http://dev.mysql.com: NATURAL [LEFT] JOIN для двух таблиц является семантически эквивалентом INNER JOIN или LEFT JOIN с оператором USING, который перечисляет все поля, присутствующие в обеих таблицах.
Отредактированно FiMko (27.09.2010 11:41:07)
Неактивен
Из Ваших примеров видно, что NATURAL LEFT JOIN ~ LEFT JOIN.
Осталось проверить, что NATURAL JOIN ~ JOIN. Т.е. убедиться,
что он выдает пустую выборку. Справитесь?
Неактивен
paulus написал:
Из Ваших примеров видно, что NATURAL LEFT JOIN ~ LEFT JOIN.
Осталось проверить, что NATURAL JOIN ~ JOIN. Т.е. убедиться,
что он выдает пустую выборку. Справитесь?
всё понял. Я невнимательно посмотрел синтаксис для NATURAL JOIN и думал, что LEFT/RIGHT являются обязательными параметрами, а не опциональными. Спасибо!
http://dev.mysql.com написал:
table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
Неактивен
В результате обсуждения JOIN'ов здесь я попытался в своем блоге собрать описание всех видов Join в MySQL. Здесь я привожу полученный результат на ваш строгий, но справедливый суд Ниже приведен синтаксис всех возможных форматов записи оператора JOIN при использовании в командах SELECT (см. http://dev.mysql.com/doc/refman/5.0/en/join.html). Все примеры и описания рассмотрены на примере MySQL и вероятнее всего будут отличаться для других типов СУБД!
1. table_reference [INNER] JOIN table_reference
2. table_reference [CROSS] JOIN table_reference
3. table_reference STRAIGHT_JOIN table_reference
4. table_reference [INNER] JOIN table_reference join_condition
5. table_reference [CROSS] JOIN table_reference join_condition
6. table_reference STRAIGHT_JOIN table_reference ON conditional_expr
7. table_reference LEFT [OUTER] JOIN table_reference join_condition
8. table_reference RIGHT [OUTER] JOIN table_reference join_condition
9. table_reference NATURAL [LEFT [OUTER]] JOIN table_reference
10. table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference
При описании различных вариантов использования JOIN будут использоваться две тестовые таблицы – sport и music. Первая содержит список людей, посещающих спортивные секции, вторая для людей, посещающих занятия по музыке.
Отредактированно FiMko (24.03.2012 22:32:43)
Неактивен