0

我有一个主要包含数字的表格,顶部有 1 行列名。

我运行了以下查询:

select * , (High - Low) as DiffHL from exdata3; 

(exdata3 是表名,High、Low 是现有列。DiffHL是我在此查询中第一次提到的新列)

查询运行良好,并添加了DiffHL具有相应计算值的新列。

现在,当我在此之后运行另一个查询时

select * from exdata3 where DiffHL >100 

我收到以下错误:

错误 (1054) (42S22)“where 子句”中的未知列 DiffHL

我尝试用DiffHL它做任何查询都会给我同样的上述错误。我哪里错了。DiffHL在将值放入/分配值之前,我是否需要先创建?MySQL 新手,请多多包涵。

4

7 回答 7

3

实际上,您的第一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
于 2014-09-04T06:38:40.953 回答
2

不能通过分配给表达式的别名引用(在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 
       ^^^^^^^^^^^^^^^^
于 2014-09-04T06:38:34.937 回答
1

您误解了一些东西: DiffHL只是结果集中您的字段的名称。MySQL 不创建字段,它只是命名结果集中的列。

于 2014-09-04T06:38:36.093 回答
0

MySql 只是临时添加了该列以与该查询一起显示

于 2014-09-04T06:38:17.207 回答
0
select * , (High - Low) as DiffHL from exdata3

在上面的查询中,您将(高 - 低)别名为 DiffHL,它不会将新列添加到现有表中。

尝试以下正确查询:

select * , (High - Low) as DiffHL from exdata3 where DiffHL >100
于 2014-09-04T06:41:30.860 回答
0

该列在您的表中不存在。

select * , (High - Low) as DiffHL from exdata3;

此查询仅为列创建别名(High - Low)

利用

select * from exdata3 where (High - Low) >100 
于 2014-09-04T06:39:49.657 回答
0

您在第一次查询中运行的别名,您必须像这样定义。你能试试吗?

select * from exdata3 where DiffHL >100 

select * from exdata3 where (High - Low) > 100
于 2014-09-04T06:39:59.387 回答