SQLaliasesAStutorial

Алиасы (AS) в SQL: псевдонимы таблиц и колонок для начинающих

Алиасы — короткие имена для таблиц и колонок в SQL. Делают запросы читаемыми, обязательны при JOIN-ах с одинаковыми колонками. Разбираем синтаксис, обязательные случаи, частые ошибки и три задачи.

5 мин чтенияСправочникSQL · aliases · AS · tutorial · beginner

Алиас — это псевдоним, короткое имя для таблицы или колонки в запросе. SQL позволяет на лету переименовать что угодно в выводе, а также задать таблице короткое имя, чтобы по ней было удобнее обращаться.

Две разновидности:

  • Алиас колонки — переименование результата. SELECT salary AS зарплата → в выводе колонка будет называться «зарплата».
  • Алиас таблицы — короткое имя для таблицы внутри запроса. FROM employees e → в этом запросе вместо employees.name можно писать e.name.

Ключевое слово — AS. Можно опускать.

Зачем нужны алиасы

  1. Читаемость. e.name короче employees.name. На запросе с пятью таблицами это критично.
  2. Обязательность при двусмысленности. Если две таблицы имеют колонку с одним именем (например id), без алиасов база не поймёт, что ты имеешь в виду.
  3. Понятный вывод. Если в результате LOWER(CONCAT(first_name, ' ', last_name)), колонка получит автоматическое уродливое имя. Алиас AS full_name делает её красивой.
  4. Self-join. Когда таблица соединяется сама с собой (например, иерархия сотрудников «начальник-подчинённый»), без алиасов вообще никак.

Алиас колонки

SELECT
  first_name AS имя,
  last_name  AS фамилия,
  salary * 12 AS годовая_зарплата
FROM employees;

Что происходит:

  • first_name в выводе будет назван «имя».
  • last_name → «фамилия».
  • Вычисляемая колонка salary * 12 получит имя «годовая_зарплата». Без алиаса было бы что-то вроде ?column? (PostgreSQL) или salary * 12 (MySQL) — некрасиво.

AS можно опускать: salary * 12 годовая_зарплата сработает так же. Но для читаемости лучше оставлять.

Пример с реальной таблицей employees:

id first_name last_name salary
1 Анна Иванова 120000
2 Борис Петров 80000
3 Вера Сидорова 150000

Запрос:

SELECT
  first_name AS имя,
  salary * 12 AS годовая_зарплата
FROM employees;

Результат:

имя годовая_зарплата
Анна 1440000
Борис 960000
Вера 1800000

Алиас таблицы

SELECT e.first_name, d.name
FROM employees e
JOIN departments d ON e.department_id = d.id;

Каждая таблица получила однобуквенное имя. Это короче, чем employees.first_name и departments.name.

Правило хорошего тона: первые буквы названий. users u, orders o, products p. Если две таблицы начинаются с одной буквы — users u, user_logs ul. Главное — алиас должен быть осмысленным, а не t1, t2.

Слово AS в алиасе таблицы тоже опционально и в большинстве кодстайлов его опускают:

-- эквивалентны
FROM employees AS e
FROM employees e

Когда алиас становится обязательным

Если в JOIN-е обе таблицы имеют колонку с одинаковым именем — без префикса (а значит, без алиаса для удобства) база скажет «ambiguous column reference».

Пример: пользователь имеет колонку id, и заказ имеет колонку id.

-- Так не работает — id двусмысленен
SELECT id FROM users JOIN orders ON users.id = orders.user_id;

-- Правильно
SELECT u.id, o.id
FROM users u
JOIN orders o ON u.id = o.user_id;

Self-join — без алиасов никак

Когда таблица соединяется сама с собой, без алиасов база не различит «копии». Пример: сотрудники с колонкой manager_id, ссылающейся на другого сотрудника в той же таблице.

employees:

id name manager_id
1 Анна NULL
2 Борис 1
3 Вера 1
4 Григорий 2
5 Денис 2

Задача: показать пары «сотрудник — его руководитель».

SELECT
  emp.name     AS employee,
  mgr.name     AS manager
FROM employees emp
LEFT JOIN employees mgr ON emp.manager_id = mgr.id;

Результат:

employee manager
Анна NULL
Борис Анна
Вера Анна
Григорий Борис
Денис Борис

Таблица одна, но в запросе она фигурирует дважды — как emp и как mgr. Без алиасов базе было бы непонятно, к какой именно колонке name ты обращаешься.

Алиас в подзапросе — обязателен

Если в FROM стоит подзапрос (subquery), ему обязательно нужно дать алиас:

SELECT t.country, t.cnt
FROM (
  SELECT country, COUNT(*) AS cnt
  FROM users
  GROUP BY country
) t
WHERE t.cnt > 10;

Подзапрос — это «временная таблица». Без имени к ней не обратиться. PostgreSQL и MySQL без алиаса для подзапроса в FROM просто ругнутся: «every derived table must have its own alias».

Алиасы и порядок выполнения

Важный нюанс: алиас колонки нельзя использовать в WHERE. Запрос:

-- НЕ РАБОТАЕТ
SELECT salary * 12 AS annual
FROM employees
WHERE annual > 1000000;

Почему: SQL выполняет WHERE раньше, чем SELECT. На момент WHERE алиаса annual ещё не существует. Решение:

-- Способ 1: повторить выражение
WHERE salary * 12 > 1000000

-- Способ 2: подзапрос или CTE
SELECT * FROM (
  SELECT salary * 12 AS annual FROM employees
) t WHERE t.annual > 1000000;

А вот в ORDER BY алиасы работают, потому что ORDER BY выполняется после SELECT:

SELECT salary * 12 AS annual
FROM employees
ORDER BY annual DESC;  -- ОК

Большой пример: соцсеть

users:

id name
1 Анна
2 Борис

posts:

id author_id title likes
10 1 Мой первый пост 12
11 1 Котики 87
12 2 Рецепт борща 45

comments:

id post_id author_id text
20 10 2 Здорово!
21 11 1 Спасибо за лайки!
22 11 2 Класс :)

Задача: показать «автор поста — название поста — автор комментария — текст комментария».

SELECT
  pa.name AS post_author,
  p.title AS post_title,
  ca.name AS comment_author,
  c.text  AS comment_text
FROM posts p
JOIN users pa     ON pa.id = p.author_id
JOIN comments c   ON c.post_id = p.id
JOIN users ca     ON ca.id = c.author_id
ORDER BY p.id, c.id;

Результат:

post_author post_title comment_author comment_text
Анна Мой первый пост Борис Здорово!
Анна Котики Анна Спасибо за лайки!
Анна Котики Борис Класс :)

Здесь обязательные алиасы:

  • users участвует дважды (как автор поста и как автор комментария) → нужны разные алиасы pa и ca.
  • Колонка name есть и в pa, и в ca → без префикса было бы двусмысленно.
  • Алиасы колонок (AS post_author, AS comment_author) делают вывод понятным.

Без алиасов этот запрос вообще нельзя написать.

Частые ошибки новичков

1. Использовать алиас колонки в WHERE. Не сработает (см. раздел про порядок выполнения). В ORDER BY — да, в WHERE — нет.

2. Забыть алиас у подзапроса в FROM. Получишь ошибку «every derived table must have its own alias».

3. Алиас на одну букву везде. Если у тебя пять таблиц a, b, c, d, e — через неделю не вспомнишь, что есть что. Используй осмысленные сокращения: users u, orders o, payments p.

4. Двойные кавычки или пробелы в алиасе. Если хочешь алиас с пробелом или ключевым словом — нужны двойные кавычки в PostgreSQL: AS "My Column". Лучше избегать — используй snake_case.

5. Использовать AS для таблицы, а потом всё равно писать полное имя. Бессмысленно: FROM employees e ... WHERE employees.id = 1 — алиас задан, но не используется. Будет ошибка «invalid reference to FROM-clause entry for table 'employees'».

6. Алиас совпадает с зарезервированным словом SQL. AS user, AS order — могут конфликтовать в некоторых БД. Лучше избегать или брать в кавычки.

Мини-резюме

  • Алиас — псевдоним для таблицы или колонки, через AS.
  • AS опционален и в столбцах, и в таблицах.
  • Алиасы колонок видны в SELECT, ORDER BY, GROUP BY, но не в WHERE и HAVING (порядок выполнения).
  • Алиасы таблиц обязательны при JOIN-е таблиц с одинаковыми именами колонок.
  • Self-join без алиасов невозможен.
  • Подзапросу в FROM обязательно нужен алиас.

Закрепи на практике

Решай задачи в SQL-тренажёре с мгновенной проверкой и подсказками.

Открыть тренажёр