Соединения

Псевдонимы таблиц

В условиях соединения ON имя таблицы обычно не пишут, т.к. читать длинные портянки кода весьма утомительно. Подобно псевдонимам столбцов в списке выборки SELECT можно задать псевдонимы таблицам. Для этого после названия таблицы через пробел нужно написать псевдоним таблицы. После того, как таблице назначен псевдоним, обращаться к ней по названию уже нельзя - только по псевдониму.

Перепишем запрос из предыдущей статьи с использованием псевдонимов для таблиц. Было:

SELECT *
  FROM city
  JOIN timezone
    ON timezone.timezone_id = city.timezone_id

стало:

SELECT *
  FROM city c
  JOIN timezone t
    ON t.timezone_id = c.timezone_id

Часто таблицам задают псевдонимы по первым буквам слов, входящих в название таблицы:

city - c
category - c
product - p
store_address - sa
product_price - pp

Алиасы таблиц также удобно использовать в списке выборки SELECT. Выберем, например, из таблиц городов и часовых поясов только идентификатор города, название города и время относительно UTC:

SELECT c.city_id,
       c.name,
       t.time_offset
  FROM city c
  JOIN timezone t
    ON t.timezone_id = c.timezone_id

Если поле встречается только в одной таблице, то в списке выборки таблицу, из которой взять столбец, указывать не обязательно. Последний запрос можно записать и так:

SELECT c.city_id,
       name,
       time_offset
  FROM city c
  JOIN timezone t
    ON t.timezone_id = c.timezone_id

Но мы рекомендуем всегда указывать в списке выборки из какой таблицы какое поле берется. При таком подходе читающий запрос человек сразу поймет из какой таблицы берутся данные. Да и никто не гарантирует, что столбец с таким же названием не появится в другой таблице позже.

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

SELECT c.city_id,
       name,
       timezone_id,
       time_offset
  FROM city c
  JOIN timezone t
    ON t.timezone_id = c.timezone_id

возникнет ошибка

column reference "timezone_id" is ambiguous

потому что СУБД не знает, из какой таблицы ей взять значение поля timezone_id.

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