Соединение таблиц

Соединение трёх и более таблиц

Содержание курса

WHERE и ORDER BY применяются к результату всех JOIN

WHERE и ORDER BY в многотабличном запросе — не фильтр отдельной таблицы, а операция над уже собранным результатом всех соединений. Логически сначала формируется результат соединений, затем WHERE отсекает лишние строки, а ORDER BY сортирует остаток. Физический план может применить фильтр раньше или переставить JOIN ради скорости, сохраняя тот же результат.

Позиция клозов жёстко фиксирована синтаксисом: WHERE идёт после последнего JOIN, ORDER BY — в самом конце:

SELECT c.name        AS клиент,
       o.order_date  AS дата,
       p.title       AS товар
FROM   customers   AS c
JOIN   orders      AS o  ON c.customer_id = o.customer_id
JOIN   order_items AS oi ON o.order_id   = oi.order_id
JOIN   products    AS p  ON oi.product_id = p.product_id
WHERE  p.price > 10000
ORDER BY c.name;

Здесь p.price > 10000 фильтрует строки объединённого набора — те сочетания клиент–заказ–товар, где цена товара не превышает порог, просто не попадут в итог. ORDER BY c.name сортирует оставшееся по имени клиента.

В условии WHERE и в ORDER BY используются те же псевдонимы, что объявлены в FROM/JOIN. Сейчас WHERE price > 10000 тоже сработает: в показанной схеме имя price однозначно. Запись p.price предпочтительнее для ясности и защитит запрос, если позже в цепочке появится другой одноимённый столбец.

ORDER BY может сортировать по любому столбцу из результата, в том числе по столбцу, которого нет в SELECT. Это работает, потому что сортировка применяется к строкам объединённого набора, а не только к тому, что выводится.