Синтаксис через 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_name timezone_id_city timezone_id_timezone time_offset
Барнаул 5 5 UTC+6
Владивосток 8 8 UTC+10
Иркутск 7 7 UTC+8
Калининград 1 1 UTC+2
Кемерово 6 6 UTC+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.

3.9 Декартово произведение

4.1 Агрегатные функции