В MySQL JOIN
, в чем разница между ON
и USING()
? Насколько я могу сказать, USING()
это просто более удобный синтаксис, тогда как ON
позволяет немного больше гибкости, когда имена столбцов не идентичны. Тем не менее, эта разница настолько незначительна, что вы думаете, что с ними просто покончено USING()
.
Есть ли что-то большее, чем кажется на первый взгляд? Если да, что я должен использовать в данной ситуации?
using
есть и другое использование, кроме соединений. См stackoverflow.com/a/13750399/632951Ответы:
Это в основном синтаксический сахар, но заслуживает внимания пара отличий:
ON является более общим из двух. Можно объединить таблицы по столбцу, множеству столбцов и даже условию. Например:
ИСПОЛЬЗОВАНИЕ полезно, когда обе таблицы совместно используют столбец с одинаковым именем, к которому они присоединяются. В этом случае можно сказать:
Дополнительным приятным дополнением является то, что не нужно полностью определять объединяемые столбцы:
Чтобы проиллюстрировать вышеописанное с помощью ON , нам нужно написать:
Обратите внимание на
film.film_id
квалификацию вSELECT
пункте. Было бы неверно просто сказать,film_id
так как это сделало бы для двусмысленности:Что касается
select *
, столбец присоединения появляется в наборе результатов дважды с, вON
то время как он появляется только один раз сUSING
:источник
USING
интерпретируетON
.USING(
категорию,
field_id,)
которая полезна при объединении с помощью составных первичных ключей, также я слышал, что оптимизаторUSING
в некоторых случаях использует для повышения производительностиUSING
определение MySQL или это стандарт?Думал, что я бы скинулся, когда я нашел,
ON
чтобы быть более полезным, чемUSING
. Это когдаOUTER
объединения вводятся в запросы.ON
Выгодно отOUTER
ограничения набора результатов таблицы, к которой присоединяется запрос, при поддержанииOUTER
объединения. Попытка ограничить набор результатов путем указанияWHERE
предложения, по сути, изменитOUTER
объединение наINNER
объединение.Конечно, это может быть относительный случай. Стоит поставить там хотя .....
Например:
источник
using
, это не может быть объединено с другими предикатами:select*from t join t2 using(i) and on 1
не будет работать.where hasAirport ;
- что это значит ? Нет смысла сравнивать.SELECT * FROM country LEFT JOIN city ON country.countryId=city.countryId AND city.city BETWEEN 'C' AND 'E'
перечислит все страны, но только города, начинающиеся с C или D (если есть). (Плюс города под названием «E»)Википедия имеет следующую информацию о
USING
:Таблицы, о которых говорилось:
Документация Postgres также определяет их довольно хорошо:
источник
Для тех, кто экспериментирует с этим в phpMyAdmin, просто слово:
У phpMyAdmin, похоже, есть несколько проблем с
USING
. Для справки: phpMyAdmin работает на Linux Mint, версия: "4.5.4.1deb2ubuntu2", сервер базы данных: "10.2.14-MariaDB-10.2.14 + maria ~ xenial - mariadb.org бинарный дистрибутив".Я запускал
SELECT
команды с использованиемJOIN
иUSING
в phpMyAdmin, и в терминале (командная строка), а те, что в phpMyAdmin, вызывают некоторые удивительные ответы:1)
LIMIT
пункт в конце, кажется, игнорируется.2) предполагаемое количество строк, указанное в верхней части страницы с результатами, иногда неверно: например, возвращаются 4, но в верхней части написано «Показаны строки 0–24 (всего 2503, запрос занял 0,0018 секунд). "
Обычный вход в MySQL и выполнение тех же запросов не приводит к этим ошибкам. Эти ошибки также не возникают при выполнении одного и того же запроса в phpMyAdmin с помощью
JOIN ... ON ...
. Предположительно ошибка phpMyAdmin.источник