如何在MySQL中为字段或列设置别名?

33

我想做类似于这样的操作,但是遇到了一个未知列错误:

SELECT SUM(field1 + field2) AS col1, col1 + field3 AS col3 from core

我只想使用别名来避免之前已执行的操作,MySQL是否支持这种操作?


错别字,应该是col1。 - user225269
为什么在col1已经是别名的情况下,你还要在select语句中使用它? - xkeshav
表中的一个字段具有整数数据类型,字段1和字段2以及别名col1也是整数。 - user225269
SELECT SUM(field1 + field2 + field3) AS coll from core 中存在什么问题? - xkeshav
@diEcho:我只想重复使用之前已经计算过的东西。 - user225269
如果这不可能的话,我想我会在php中进行计算。感谢那些评论过的人。 - user225269
6个回答

39

select @code:= SUM(field1 + field2), @code+1 from abc;

请注意以下内容(来自MySQL 5.6文档):

通常情况下,在除 SET 语句以外的语句中,您不应该给用户变量赋值并在同一语句中读取该值。例如,要递增一个变量,可以这样做:

SET @a = @a + 1;

对于其他语句,如SELECT语句,您可能会得到所期望的结果,但这并不是保证的。在下面的语句中,您可能认为MySQL将首先评估@a,然后再进行第二次赋值:

SELECT @a, @a:=@a+1, ...;

然而,涉及用户变量的表达式评估顺序未定义。

因此,请自行决定使用风险。


1
那是甜蜜的语法糖。 :-) - Denis de Bernardy
遗憾的是,这在查询中运行得非常出色,但在视图中却不行 :( - maxhugen
@kenn 对我来说很好用,在Mysql上! - Mirage
3
根据 http://dev.mysql.com/doc/refman/5.6/en/user-variables.html ,涉及用户变量表达式的计算顺序未定义。实际上,使用上述查询我得到了 NULL 结果。请参考文档了解更多信息。 - kenn
1
@kenn,我已经作为编辑添加了警告。感谢你的提醒,这可能会影响那些不知道的人。 - insaner
这在测试简单内容时运行良好,但当我将其应用于生产中使用的查询时,结果不可靠。有时字段值会存在,有时不存在。 - rclai

21

考虑使用子查询,例如:

SELECT col1
,      col1 + field3 AS col3 
FROM   (
       SELECT  field1 + field2 as col1
       ,       field3
       from    core
       ) as SubQueryAlias

16

您可以选择别名:select

SELECT SUM(field1 + field2) AS col1, (select col1) + field3 AS col3 from core

这个有效。


2
它可以工作。与此问题和解决方案相同:https://dev59.com/XXI95IYBdhLWcg3w8y6N - dxvargas
5
在MySQL中这个很好用,其他数据库不确定。应该是最佳答案。 - But those new buttons though..
2
如果您引用的列是基于分组函数计算的,例如在 SELECT MAX(ID) AS c1, (SELECT c1) AS c2 FROM log GROUP BY ID 中,这个语句会报错(“引用到组函数”的错误)。但是,如果您在此示例中将 MAX(ID) 替换为 ID,则可以正常工作。 - Christopher K.
@ChristopherK. 是正确的。我也遇到了这个问题。我正在定义一个视图,而不仅仅是运行一个简单的查询。因此,我通过将一个视图嵌套在另一个视图中来解决了这个问题。第一个视图使用聚合函数。第二个(包装器视图)在第一个视图的基础上执行计算。问题得到解决。 - BuvinJ

5
select @code:= SUM(field1 + field2), (@code*1) from abc;

@code*1 转换为数值表达式后,您可以在任何地方使用它。

select @code:= SUM(field1 + field2), (@code*1)+field3 from abc;

我来这里为你投票,这在我们的场景中完美运作。将@code替换为更加匈牙利式/代码风格友好的变量,并保留AS。 @fVariable:=SUM(column) AS alias``(别名应该用反引号括起来,因为SO无法正确渲染它们)。 - ReSpawN
@ReSpawN 这是未定义的行为。那时它恰好给了你期望的答案。由于它是开源的,如果您检查代码,则某些读取+写入用法对于特定构建是安全的(如果您不认为这是一个自相矛盾的说法)。 - philipxy

2

简短的回答是不可以:

mysql> select 1 as a, a + 1 as b;
ERROR 1054 (42S22): Unknown column 'a' in 'field list'

postgresql# select 1 as a, a + 1 as b;
ERROR:  column "a" does not exist

尽管如此,一些SQL实现允许在where/group by/having子句中使用别名,例如:

postgresql# select 1 as a group by a; -- 1 row

1
如果您在使用聚合函数(group by)时遇到问题,可以将计算列放在最后并进行前向列引用。

SELECT FNC2(AF), FNC1(A) AS AF,  B, C,  FROM Table GROUP BY ...

1st one doesn't work due to forward column referencing. Do this instead 

SELECT FNC1(A) AS AF, B, C, FNC2((SELECT AF)) FROM Table GROUP BY ...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接