Использование алиаса в WHERE-условии в MySQL: решение ошибки

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В MySQL невозможно использовать псевдонимы столбцов непосредственно в условии WHERE. Если Вам требуется отсеивать данные по результатам вычисленных столбцов, Вам придется повторить выражение или воспользоваться подзапросом. В отличие от ORDER BY, WHERE не принимает псевдонимы. Показательные примеры с подзапросами и без них:

SQL
Скопировать код
SELECT * FROM (SELECT salary * 12 AS annual_salary FROM employees) AS sub WHERE sub.annual_salary > 50000;
SQL
Скопировать код
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. Этот синтаксис понимает псевдонимы, так как агрегация данных производится до его применения.

SQL
Скопировать код
SELECT employee_id, AVG(salary) AS avg_salary 
FROM employees 
GROUP BY employee_id 
HAVING avg_salary > 50000;

Подзапросы: специальная техника

Основной прием – использование подзапросов для создания таблиц, в которых будет возможно фильтровать по псевдонимам.

SQL
Скопировать код
SELECT annual_salary FROM (
    SELECT employee_id, salary * 12 AS annual_salary FROM employees
) AS sub WHERE sub.annual_salary > 50000;

Визуализация

Вспоминайте простое правило:

Markdown
Скопировать код
1. SELECT – это этикетка на продукте, который уже находится на столе.
2. WHERE – это поиск продукта в кладовой. Этикетка еще не приставлена к нему!

Итак:

Markdown
Скопировать код
- `SELECT` – это наклейка этикетки на продукт.
- `WHERE` – только то, что лежит в кладовой.

Вы не можете искать в кладовой по новой этикетке (псевдониму). Она делает свое дело уже на столе, в SELECT! 🍳

Поглубже в псевдонимы в SQL

Преимущества подзапросов

С помощью подзапросов можно упорядочивать детали запросов, обеспечивая их чистоту и порядок.

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 позволяют избегать дублирования кода с псевдонимами.

SQL
Скопировать код
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.

SQL
Скопировать код
SELECT category, SUM(sales) AS total_sales
FROM transactions
GROUP BY category
HAVING total_sales > 1000;

Полезные материалы

  1. SQL Псевдонимы – W3Schools — Отличный гид по псевдонимам SQL.
  2. ENUM типы данных в Postgres или CHECK CONSTRAINT? – Stack Overflow — Информация о условных выражениях в SQL.
  3. SQL – Синтаксис псевдонимов – Tutorialspoint — Понятное объяснение синтаксиса и применения псевдонимов в SQL.
  4. SQL: ПСЕВДОНИМЫ – TechOnTheNet — Примеры использования псевдонимов в SQL-запросах.