Псевдонимы в SQL
Когда несколько таблиц объединяются в одном запросе, необходимо указывать имя каждого столбца с именем таблицы, к которой он принадлежит, например employees.dept_id
, departments.dept_id
, чтобы избежать путаницы и ошибки неоднозначного столбца. Она возникает в случае, если столбцы в разных таблицах имеют одинаковые имена.
Если имена таблиц длинные и встречаются несколько раз в запросе, то написание запроса становится сложной и раздражающей задачей. Чтобы сэкономить время и не писать полные имена таблиц, можно дать каждой таблице короткий псевдоним (alias) и ссылаться на ее столбцы по псевдониму.
Давайте разберемся с псевдонимами на примере таблицы employees
и departments
.
Таблица employees |
Таблица departments |
+--------+--------------+------------+---------+ | emp_id | emp_name | hire_date | dept_id | +--------+--------------+------------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 4 | | 2 | Tony Montana | 2002-07-15 | 1 | | 3 | Sarah Connor | 2005-10-18 | 5 | | 4 | Rick Deckard | 2007-01-03 | 3 | | 5 | Martin Blank | 2008-06-24 | NULL | +--------+--------------+------------+---------+ |
+---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ |
Следующий запрос извлекает идентификатор сотрудника, его имя и название отдела, объединяя таблицы employees
и departments
по общему полю dept_id
.
SELECT employees.emp_id, employees.emp_name, departments.dept_name
FROM employees LEFT JOIN departments
ON employees.dept_id = departments.dept_id ORDER BY emp_id;
Ниже — более компактная версия того же запроса, но с использованием псевдонимов таблиц:
SELECT t1.emp_id, t1.emp_name, t2.dept_name
FROM employees AS t1 LEFT JOIN departments AS t2
ON t1.dept_id = t2.dept_id ORDER BY emp_id;
После выполнения любого из этих запрос вы получите одинаковый результат:
+--------+-----------------+--------------------+ | emp_id | emp_name | dept_name | +--------+-----------------+--------------------+ | 1 | Ethan Hunt | Human Resources | | 2 | Tony Montana | Administration | | 3 | Sarah Connor | Sales | | 4 | Rick Deckard | Finance | | 5 | Martin Blank | NULL | +--------+-----------------+--------------------+
Обратите внимание, насколько меньше текста потребовалось написать во втором запросе. В этом и есть преимущество псевдонимов таблиц.
Подробнее об объединении таблиц мы говорили в предыдущем разделе.
Определение псевдонимов для столбцов таблицы
В MySQL, когда вы используете функцию для создания пользовательского вывода, имя столбца в выводе может быть нечитаемым или очень сложным для понимания. В этом случае лучше использовать псевдонимы, чтобы временно дать другое имя столбцу в выводе.
Рассмотрим следующий запрос, он переформатирует даты в столбце hire_date
для создания пользовательского вывода:
SELECT emp_name, DATE_FORMAT(hire_date, '%M %e, %Y') FROM employees;
+--------------+-------------------------------------+ | emp_name | DATE_FORMAT(hire_date, '%M %e, %Y') | +--------------+-------------------------------------+ | Ethan Hunt | May 1, 2001 | | Tony Montana | July 15, 2002 | | Sarah Connor | October 18, 2005 | | Rick Deckard | January 3, 2007 | | Martin Blank | June 24, 2008 | +--------------+-------------------------------------+
Как вы видите, имя последнего столбца в выводе длинное и громоздкое. Эта проблема решается с помощью псевдонимов столбцов:
SELECT emp_name, DATE_FORMAT(hire_date, '%M %e, %Y') AS hire_date
FROM employees;
В результате выполнения этого запроса вы получите более читаемый вывод:
+--------------+------------------+ | emp_name | hire_date | +--------------+------------------+ | Ethan Hunt | May 1, 2001 | | Tony Montana | July 15, 2002 | | Sarah Connor | October 18, 2005 | | Rick Deckard | January 3, 2007 | | Martin Blank | June 24, 2008 | +--------------+------------------+
Примечание. Псевдоним можно использовать в выражениях
GROUP BY
,ORDER BY
илиHAVING
, чтобы ссылаться на столбец. А вот вWHERE
использовать псевдонимы нельзя.