Алиас — это псевдоним, короткое имя для таблицы или колонки в запросе. SQL позволяет на лету переименовать что угодно в выводе, а также задать таблице короткое имя, чтобы по ней было удобнее обращаться.
Две разновидности:
- Алиас колонки — переименование результата.
SELECT salary AS зарплата → в выводе колонка будет называться «зарплата».
- Алиас таблицы — короткое имя для таблицы внутри запроса.
FROM employees e → в этом запросе вместо employees.name можно писать e.name.
Ключевое слово — AS. Можно опускать.
Зачем нужны алиасы
- Читаемость.
e.name короче employees.name. На запросе с пятью таблицами это критично.
- Обязательность при двусмысленности. Если две таблицы имеют колонку с одним именем (например
id), без алиасов база не поймёт, что ты имеешь в виду.
- Понятный вывод. Если в результате
LOWER(CONCAT(first_name, ' ', last_name)), колонка получит автоматическое уродливое имя. Алиас AS full_name делает её красивой.
- 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.
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 ещё не существует. Решение:
WHERE salary * 12 > 1000000
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:
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 позволяет на лету переименовать что угодно в выводе, а также задать таблице короткое имя, чтобы по ней было удобнее обращаться.
Две разновидности:
SELECT salary AS зарплата→ в выводе колонка будет называться «зарплата».FROM employees e→ в этом запросе вместоemployees.nameможно писатьe.name.Ключевое слово —
AS. Можно опускать.Зачем нужны алиасы
e.nameкорочеemployees.name. На запросе с пятью таблицами это критично.id), без алиасов база не поймёт, что ты имеешь в виду.LOWER(CONCAT(first_name, ' ', last_name)), колонка получит автоматическое уродливое имя. АлиасAS full_nameделает её красивой.Алиас колонки
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:Запрос:
SELECT first_name AS имя, salary * 12 AS годовая_зарплата FROM employees;Результат:
Алиас таблицы
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:Задача: показать пары «сотрудник — его руководитель».
SELECT emp.name AS employee, mgr.name AS manager FROM employees emp LEFT JOIN employees mgr ON emp.manager_id = mgr.id;Результат:
Таблица одна, но в запросе она фигурирует дважды — как
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:posts:comments:Задача: показать «автор поста — название поста — автор комментария — текст комментария».
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;Результат:
Здесь обязательные алиасы:
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 (порядок выполнения).