一起添加 MySQL 别名字段

Posted

技术标签:

【中文标题】一起添加 MySQL 别名字段【英文标题】:Adding MySQL alias fields together 【发布时间】:2010-07-30 16:50:17 【问题描述】:

考虑类似以下的查询:

 SELECT sum(EXPR) as total,
        sum(EXPR) as total2, 
        sum(total+total2) as grandtotal 
 FROM tablename

这出现并表示字段列表中的未知列总数。

有没有办法在计算中引用别名字段而不重新输入总和表达式,因为每一边的sum(EXPR) 都很长。

【问题讨论】:

我有机会检查我的答案,发现我错了。因此,我将其删除。感谢您指出我的错误。 【参考方案1】:

这是在数据库引擎中执行事物的顺序。

请注意,这是事物如何执行的语义视图,数据库可能会以不同的顺序执行操作,但它必须产生结果,就好像它是以这种方式完成的一样。

    首先评估 FROM 部分,我从哪里获取数据 然后评估 WHERE 部分,我们对哪些行感兴趣 然后评估 GROUP BY 部分,我们如何组合结果行 然后评估 HAVING 部分,我们对哪些组感兴趣 然后评估 ORDER BY 部分,我们想要这些行/组的哪个顺序 最后,SELECT 部分被评估,我们对哪些列感兴趣

一些数据库引擎允许你规避这一点,通过在 SELECT 部分中按“GROUP BY 2”按第二列分组,但如果你坚持上述顺序,你现在应该知道原因您的代码不起作用是没有名称为 total 或 total2 的列(尚未)。

换句话说,您需要重复这两个表达式,或者找到另一种方法。

您可以做的是使用子查询(前提是您使用的是支持此功能的 mysql 版本):

SELECT total, total2, total+total2 as grandtotal
FROM (
    SELECT sum(EXPR) as total, sum(EXPR) as total2
    FROM tablename
    ) x

根据评论删除其余部分。

虽然我对 MySQL 了解不多,所以您可能必须为子查询起别名:

...

    FROM tablename
    ) AS x
      ^-+^
        |
        +-- add this

一些数据库引擎在给子查询起别名时也不允许使用关键字 AS,所以如果上面的方法不起作用,试试这个:

...

    FROM tablename
    ) x
      ^
      |
      +-- add this

【讨论】:

+1 表示非常彻底。是的,子查询需要别名。【参考方案2】:
SELECT total, total2, total + total2 as grandtotal from (
 SELECT sum(EXPR) as total, 
        sum(EXPR) as total2,  
 FROM tablename 
) x

【讨论】:

【参考方案3】:
SELECT
WITH Sums AS
(
 SELECT sum(EXPR) as total, 
        sum(EXPR) as total2
 FROM tablename 
)
SELECT SUM(sums);

为您的 tsql 粉丝...

【讨论】:

MySQL 不支持 WITH 子句:***.com/questions/1382573/… @Lasse V. Karlsen:WITH 子句不是专门的 TSQL - Oracle 从 9i 开始支持非递归 WITH。 我不关心 WITH,答案是“为你的 tsql 粉丝”。 我无法正确理解会引发这样一个问题的想法混乱。【参考方案4】:

你可以使用变量:

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

【讨论】:

不,你不能。请参阅我对@kunal 回答的评论。

以上是关于一起添加 MySQL 别名字段的主要内容,如果未能解决你的问题,请参考以下文章

arcmap修改字段别名后再次加载又变回原样,要怎么处理才不会改变?

mysql中数据库名字分大小写吗?

Mysql02

Mysql03

JAVA-Unit03: SQL(基础查询) SQL(关联查询)

MySQL操作命令(其二)