Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

В чём разница между using и on в join-запросах?

#sql


Сабж в заголовке, т.е. равносильны ли запросы (если mysql рассматривать)

SELECT * FROM `tab1` RIGHT JOIN `tab` ON `table2`.`id` = `table1`.`id`  


и

SELECT * FROM `tab1` RIGHT JOIN `tab2` USING(`id`)


если нет, то какой лучше и в чём различие?
    


Ответы

Ответ 1



USING (column_name(s)), по сути, является синтаксическим сахарочком над ON. Согласно докам — служит для указания списка столбцов, которые должны существовать в обеих таблицах. Такое выражение USING, как: A LEFT JOIN B USING (C1, C2, C3, ...) семантически идентично выражению ON: A.C1 = B.C1 AND A.C2 = B.C2 AND A.C3 = B.C3,... В то время как ON можно "склеить" столбцы с различными именами. Но с ON можно проделать операций чуть больше, например можно присоединить не только колонку, но и набор колонок или даже целое условие, пример: SELECT * FROM world.City JOIN world.Country ON (City.CountryCode = Country.Code) WHERE ... Дополнительно USING — при перечислении полей в запросе не обязательно указывать префикс: SELECT film.title, film_id // # film_id указан без префикса FROM film JOIN film_actor USING (film_id) WHERE ... Тоже самое с ON: SELECT film.title, film.film_id // # film.film_id обязателен префикс FROM film JOIN film_actor ON (film.film_id = film_actor.film_id) WHERE ... Если не перечислять поля явно, а использовать select * для соединения столбцов, то в результирующем наборе при ON колонка "всплывёт" дважды, в то время как с USING — только раз: mysql> create table t(i int); insert t select 1; create table t2 select*from t; Query OK, 0 rows affected (0.11 sec) Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 Query OK, 1 row affected (0.19 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from t join t2 on t.i = t2.i; +------+------+ | i | i | +------+------+ | 1 | 1 | +------+------+ 1 row in set (0.00 sec) mysql> select * from t join t2 using(i); +------+ | i | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> инфа позаимствована на enSO MySQL ON vs USING?

Комментариев нет:

Отправить комментарий