Запятая против JOIN
Запрос на получение списка номеров телефонов клиентов, которые оформили заказ в течение последних двух недель, можно записать несколькими способами. Вот два из них:
SELECT * FROM clients, orders, phoneNumbers WHERE clients.id = orders.clientId AND clients.id = phoneNumbers.clientId AND orderPlaced >= NOW() - INTERVAL 2 WEEK;
SELECT * FROM clients INNER JOIN orders ON clients.id = orders.clientId INNER JOIN phoneNumbers ON clients.id = phoneNumbers.clientId WHERE orderPlaced >= NOW() - INTERVAL 2 WEEK;
Есть ли разница? В данном виде — нет. Но всё же следует использовать второй вариант. Почему?
- Читаемость. Как только условие WHERE содержит более двух условий, становится трудно отличить бизнес-логику (только даты в течение последних двух недель) от реляционной логики (какие поля связывают клиентов с заказами). Использование синтаксиса JOIN с предложением ON сокращает список WHERE и делает очень наглядным, как таблицы связаны друг с другом.
-
Гибкость. Допустим, нам нужно увидеть всех клиентов, даже если у них нет номера телефона в системе. Со вторым вариантом это легко; просто измените
INNER JOIN phoneNumbersнаLEFT JOIN phoneNumbers. Попробуйте это сделать с первым вариантом, и MySQL версии 5.0.12+ выдаст синтаксическую ошибку из-за изменения приоритета между оператором запятой и ключевым словом JOIN. Решением является перестановка предложения FROM или добавление скобок для переопределения приоритета, что быстро становится утомительным.
- Переносимость. Изменения в 5.0.12 были внесены для соответствия стандарту SQL:2003. Если ваши запросы используют стандартный синтаксис, вам будет проще перейти на другую базу данных, если возникнет такая необходимость.
См. также
- "MySQL joins: ON vs. USING vs. Theta-style" — Интересная запись в блоге по этой теме.
Начальная версия этой статьи была скопирована с разрешения с http://hashmysql.org/wiki/Comma_vs_JOIN 05.10.2012.
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительной проверки MariaDB. Мнения, информация и мнения, выраженные в данном содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/comma-vs-join/