Spec-Zone.ru › MariaDB

Запятая против 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API