Использование алиаса в WHERE-условии в MySQL: решение ошибки
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
В MySQL невозможно использовать псевдонимы столбцов непосредственно в условии WHERE
. Если Вам требуется отсеивать данные по результатам вычисленных столбцов, Вам придется повторить выражение или воспользоваться подзапросом. В отличие от ORDER BY
, WHERE
не принимает псевдонимы. Показательные примеры с подзапросами и без них:
SELECT * FROM (SELECT salary * 12 AS annual_salary FROM employees) AS sub WHERE sub.annual_salary > 50000;
SELECT salary * 12 AS annual_salary FROM employees WHERE salary * 12 > 50000;
Углубляемся в WHERE и HAVING
Поиск псевдонима в WHERE
Если вы хоть раз пытались использовать псевдоним из SELECT
в WHERE
и столкнулись с ошибкой, то для вас не новость, что WHERE
обрабатывается до того, как SQL "знакомится" с псевдонимами из SELECT
.
Обходные решения для агрегатных функций с 'HAVING'
Когда работа идет с агрегированными данными (SUM()
, AVG()
, COUNT()
и прочими), WHERE
заменяется на HAVING
. Этот синтаксис понимает псевдонимы, так как агрегация данных производится до его применения.
SELECT employee_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY employee_id
HAVING avg_salary > 50000;
Подзапросы: специальная техника
Основной прием – использование подзапросов для создания таблиц, в которых будет возможно фильтровать по псевдонимам.
SELECT annual_salary FROM (
SELECT employee_id, salary * 12 AS annual_salary FROM employees
) AS sub WHERE sub.annual_salary > 50000;
Визуализация
Вспоминайте простое правило:
1. SELECT – это этикетка на продукте, который уже находится на столе.
2. WHERE – это поиск продукта в кладовой. Этикетка еще не приставлена к нему!
Итак:
- `SELECT` – это наклейка этикетки на продукт.
- `WHERE` – только то, что лежит в кладовой.
Вы не можете искать в кладовой по новой этикетке (псевдониму). Она делает свое дело уже на столе, в SELECT
! 🍳
Поглубже в псевдонимы в SQL
Преимущества подзапросов
С помощью подзапросов можно упорядочивать детали запросов, обеспечивая их чистоту и порядок.
SELECT employee_detail.annual_salary
FROM (
SELECT employee_id, (salary * benefits_factor) * 12 AS annual_salary
FROM employees
) AS employee_detail
WHERE employee_detail.annual_salary BETWEEN 60000 AND 120000;
Многофункциональность CASE
Выражения CASE
позволяют избегать дублирования кода с псевдонимами.
SELECT employee_id,
salary,
CASE
WHEN salary > 70000 THEN 'High'
WHEN salary > 50000 THEN 'Medium'
ELSE 'Low'
END AS salary_group
FROM employees
WHERE (
CASE
WHEN salary > 70000 THEN 'High'
WHEN salary > 50000 THEN 'Medium'
ELSE 'Low'
END
) = 'Medium';
Здесь CASE
применяется и в SELECT
, и в WHERE
.
Фильтрация данных с HAVING после агрегации
Для работы с данными после их агрегации используйте HAVING
.
SELECT category, SUM(sales) AS total_sales
FROM transactions
GROUP BY category
HAVING total_sales > 1000;
Полезные материалы
- SQL Псевдонимы – W3Schools — Отличный гид по псевдонимам SQL.
- ENUM типы данных в Postgres или CHECK CONSTRAINT? – Stack Overflow — Информация о условных выражениях в SQL.
- SQL – Синтаксис псевдонимов – Tutorialspoint — Понятное объяснение синтаксиса и применения псевдонимов в SQL.
- SQL: ПСЕВДОНИМЫ – TechOnTheNet — Примеры использования псевдонимов в SQL-запросах.