Неизвестный столбец в списке полей MySQL
У меня есть таблица, содержащая в основном числа с 1 строкой имен столбцов в верхней части.
Я выполнил следующий запрос:
select * , (High - Low) as DiffHL from exdata3;
(exdata3 - это имя таблицы, а High, Low - существующие столбцы. DiffHL
это новый столбец, который я упоминал впервые в этом запросе)
Запрос прошел нормально и добавил новый столбец DiffHL
с соответствующими расчетными значениями.
Теперь, когда я запускаю другой запрос после этого
select * from exdata3 where DiffHL >100
Я получаю следующую ошибку:
ошибка (1054) (42S22) Неизвестный столбец DiffHL в 'предложении where'
Я пытаюсь сделать любой запрос с DiffHL
это дает мне ту же ошибку выше. Где я ошибся. Нужно ли создавать DiffHL
сначала, прежде чем положить / присвоить значения в нем? Новичок в MySQL, так что терпите меня.
7 ответов
На самом деле, ваш первый SELECT
оператор не создал столбец в таблице:
SELECT *, (High - Low) as DiffHL FROM exdata3;
Вместо этого он создал "виртуальный" столбец, доступный только в его наборе результатов.
Вы должны добавить столбец вручную или переписать свой SELECT
в качестве таких:
SELECT *, (High - Low) as DiffHL FROM exdata3 WHERE (High - Low) > 100;
Если вы действительно хотите добавить столбец DiffHL
к таблице вы можете попробовать добавить столбец со следующими утверждениями:
ALTER TABLE exdata3 ADD COLUMN DiffHL INT NULL;
-- Create an empty DiffHL column
UPDATE exdata3 SET DiffHL = High - Low;
-- Fill DiffHL column with values
SELECT * FROM exdata3;
-- Here DiffHL column is actually exists
Это не возможно ссылаться (в WHERE
пункт) любое выражение в SELECT
список по псевдониму, назначенному выражению (в пределах одного SELECT, без встроенного представления).
Вы можете ссылаться на выражение по псевдониму в HAVING
пункт.
Например, это будет правильно:
SELECT t.*
, (t.High - t.Low) AS DiffHL
FROM exdata3 t
HAVING DiffHL > 100
^^^^^^
в WHERE
предложение, вам нужно будет повторить выражение. Например, это будет правильно:
SELECT t.*
, (t.High - t.Low) AS DiffHL
FROM exdata3 t
WHERE (t.High - t.Low) > 100
^^^^^^^^^^^^^^^^
Вы что-то не так понялиDiffHL
это просто имя вашего поля в вашем наборе результатов. MySQL не создает поле, он просто называет столбец в вашем наборе результатов.
select * , (High - Low) as DiffHL from exdata3
В приведенном выше запросе вы используете псевдоним (High - Low) для DiffHL, он не добавит новый столбец в вашу существующую таблицу.
Попробуйте ниже правильный запрос:
select * , (High - Low) as DiffHL from exdata3 where DiffHL >100
Столбец не существует в вашей таблице.
select * , (High - Low) as DiffHL from exdata3;
Этот запрос только создает псевдоним для столбца (High - Low)
использование
select * from exdata3 where (High - Low) >100
Псевдоним имя, которое вы запускали при первом запросе, вы должны определить следующим образом. Вы можете попробовать это?
select * from exdata3 where DiffHL >100
в
select * from exdata3 where (High - Low) > 100
MySql только временно добавил этот столбец для отображения с этим запросом