Соединения

Синтаксис через WHERE

Внутреннее соединение можно выполнить не используя ключевое слово JOIN. Для этого достаточно сделать декартово произведение строк таблиц, а условия соединения прописать в предложении WHERE. Например, соединим таблицы городов и часовых поясов:

SELECT c.name AS city_name,
       c.timezone_id AS timezone_id_city,
       t.timezone_id AS timezone_id_timezone,
       t.time_offset
  FROM city c,
       timezone t
 WHERE t.timezone_id = c.timezone_id
 ORDER BY c.name, t.timezone_id
city_nametimezone_id_citytimezone_id_timezonetime_offset
Барнаул55UTC+6
Владивосток88UTC+10
Иркутск77UTC+8
Калининград11UTC+2
Кемерово66UTC+7

Такая форма соединения таблиц не отличается от соединения через JOIN по производительности, но удобнее в запросах с большим количеством таблиц. Сравни:

SELECT r.name AS rank_name,
       s.name AS store_name,
       c.name as city_name,
       sa.address,
       t.time_offset
  FROM rank r
  JOIN store s
    ON s.store_id = r.store_id
  JOIN store_address sa
    ON sa.store_id = s.store_id
  JOIN city c
    ON c.city_id = sa.city_id
  JOIN timezone t
    ON t.timezone_id = c.timezone_id

и

SELECT r.name AS rank_name,
       s.name AS store_name,
       c.name as city_name,
       sa.address,
       t.time_offset
  FROM rank r,
       store s,
       store_address sa,
       city c,
       timezone t
 WHERE s.store_id = r.store_id
   AND sa.store_id = s.store_id
   AND c.city_id = sa.city_id
   AND t.timezone_id = c.timezone_id

Нам больше нравится второй вариант, т.к. запрос получается менее загруженным ключевыми словами и лучше видно из каких таблиц выбираются данные. Есть и обратная сторона - условия соединения отделены от таблиц. Но эта проблема становится не такой актуальной при одинаковом порядке таблиц в FROM и условий в WHERE.

    ПредыдущаяСледующая