Зачем делать алиас таблице в SQL-запросе
Что проверяют
Знаете ли вы случаи, где алиас обязателен, а не просто сокращает запись, и понимаете ли логический порядок выполнения запроса. Следом часто спрашивают, можно ли сослаться на алиас колонки в WHERE.
Как отвечать
Сначала про удобство: в запросе с несколькими JOIN короткие o, c, p читаются лучше полных имён, а при одинаковых колонках (id, name, created_at) квалификация обязательна, иначе база ответит ошибкой о неоднозначной колонке. Дальше случаи, где без алиаса никак:
- self-join: одна таблица дважды, например сотрудник и руководитель:
FROM employees e JOIN employees m ON e.manager_id = m.id; - подзапрос во
FROM: в MySQL производной таблице алиас нужен всегда, в PostgreSQL он стал необязательным только с 16-й версии, поэтому в переносимом SQL его пишут; - коррелированный подзапрос: внутренний запрос ссылается на строку внешнего, и если таблица та же, различить их можно только алиасами.
У Java-разработчика своя сторона. В JPQL и HQL через алиас обращаются к сущности: select e from Employee e where e.department.name = :name. В нативных запросах Spring Data с интерфейсными проекциями и в BeanPropertyRowMapper у JdbcTemplate поля сопоставляются по именам колонок, и алиас колонки решает, заполнится ли поле. А в логах Hibernate SQL выглядит как e1_0.first_name, и эти алиасы нужно уметь читать.
Где спотыкаются
Используют алиас колонки в WHERE. Логически WHERE выполняется раньше SELECT, алиаса там ещё нет, а в ORDER BY он уже доступен. Выражение повторяют или выносят в подзапрос либо CTE.
После назначения алиаса пишут полное имя таблицы: FROM employees e WHERE employees.id = 1. PostgreSQL ответит ошибкой, потому что в этом запросе таблица теперь называется e.
Пишут AS перед алиасом таблицы в Oracle. Там AS допустим только для колонок, а переносимый вариант для таблиц это алиас без ключевого слова.