当前位置: 首页 > 面试题库 >

在MySQL中按别名选择列

朱鸿畅
2023-03-14
问题内容

我想了解MySQL中的某些特定行为。运行“ select @@ version”,我看到我的版本是5.6.34-log。

让我使用生成的表放置样本,以使其更易于重现:

SELECT 
    CONCAT(a, b) AS 'c1', CONCAT((SELECT c1), 2)
FROM
    (SELECT 'a', 'b', 'c' UNION ALL SELECT 1, 2, 3) t1;

正如标题所建议的那样,我最初搜索的是如何通过别名选择列,以便重用计算所得的字段,从而避免了冗长的查询。如文档中所述,大多数答案要么建议使用子查询,要么使用变量-
一种可读性差,而另一种则不能由自己的数据库开发人员来保证。然后,我从这个答案中学到了这种方法,并且不太了解它-
的确,我什至不知道该如何称呼这种操作/条款。

至少在此MySQL版本中,它似乎工作得很好。唯一的例外是涉及包含聚合函数的列(如下所示)-它会引发1247(错误引用)错误,并且感觉很合理。

-- THIS DOESN'T WORK!
SELECT 
    CONCAT(a, b) AS c1, CONCAT((SELECT c1), 2) as c2
FROM
    (SELECT 'a' as a, 'b' as b, 'c' as c UNION ALL SELECT '1', 2, 3) t1;

我已经阅读了有关该主题的许多答案,但这是对此类操作的唯一参考,并且由于我不知道其名称,因此无法对其进行更深入的研究。有谁知道该结构的名称,我如何更好地理解它?

编辑:我不试图执行在不工作查询中显示的操作。确实,我正在尝试了解MySQL的行为。已经存在的问题很容易理解如何使用子查询来执行此操作,依此类推-
并不是重点。我的主要问题是了解MySQL在其中执行哪种操作以及如何调用该操作,因为我从未读过类似的东西(这将是带有自动选择的查询吗?)

编辑2:这篇文章激发了有关此MySQL行为的更具体,更好的书面问题,可以在此处找到。


问题答案:

简短答案:

  1. SELECT列表中对别名的引用或
  2. 别名表达

到目前为止,我发现的唯一文档是:https :
//bugs.mysql.com/bug.php?id=79549

在该链接中有以下内容:

[2015年12月9日15:35] Roy Lyseng …这是原始决定的较长背景:

与在WHERE子句(和GROUP BY)中子查询中对别名的引用相反,
没有理由(除标准合规性之外)我们不应该在SELECT列表中允许对别名的引用
,因为它们应该 在SELECT列表
中可用。查询执行的同一阶段。但是5.6中的支持相当随意:

鉴于此:创建表t1(a int,b int),

SELECT列表中的别名无效:

  select a+b as c,c+1 from t1;

错误1054(42S22):“字段列表”中的未知列“ c”

但是在子查询中,对c的引用是有效的:

  select a+b as c,(select c+1) from t1;

并且子查询必须在别名定义之后:

  select (select c+1),a+b as c from t1;

错误1247(42S22):不支持参考“ c”(项目列表中的前向参考)

因此,很容易说 在SELECT列表中对别名的引用的
支持是非常特殊的。尽管如此,我们将尝试重新实现旧的解决方案,但没有尝试清除此功能支持中的明显漏洞。但是,不会在WHERE子句中的子查询中引用别名。

除了在标准文档中描述此功能的错误报告之外,我还一直在寻找文档。但到目前为止没有运气。



 类似资料:
  • 本文向大家介绍MySQL 按列名选择,包括了MySQL 按列名选择的使用技巧和注意事项,需要的朋友参考一下 示例 询问 结果            

  • 本文向大家介绍MySQL 使用别名选择(AS),包括了MySQL 使用别名选择(AS)的使用技巧和注意事项,需要的朋友参考一下 示例 SQL别名用于临时重命名表或列。它们通常用于提高可读性。 询问 (注意:  AS在语法上是可选的。) 结果            

  • 问题内容: 我有2个表:table_a和table_b。两者都包含一个名为“ open”的列。 我想编写一个查询,返回以下内容 我尝试以下查询: 这将为table_a.open的每个值返回具有table_b.open的每个值的表 我可以在这里误解别名的正确用法。有任何想法吗? 问题答案: 这不是您遇到的别名问题。您正在表上执行创建直角坐标结果集的操作。 这会乘以您的结果集,因此的每一行都直接与中的

  • 在Loc vs. iloc vs. ix vs. at vs. iat的答案中选择?例如。 现在我想要所有的栏目,除了“食物”和“高度”。 我认为类似于的东西可以工作,但是Python返回。 我知道有一种解决方法:。然而,在我的现实生活中,我有数百列要删除。键入所有列名是如此低效。 我期待类似于R语言中的或。 还阅读了选择/排除Pandas中的列集。

  • 问题内容: 我想选择列名,但我不知道表结构是否会提前更改,因此它可能会发生变化,因此我不能只对带有列名的select语句进行硬编码。我也不想选择每一列。有没有简单的方法可以做到这一点? 我的想法是这两个查询的某种组合,但是我的SQL并不是那么好。 我尝试使用子选择,但没有用。似乎什么都没发生,我没有收到错误,只是没有结果 也许我需要参加吗?..无论如何,任何帮助都将是很大的,谢谢 问题答案: 试试

  • 问题内容: 我是MSSQL用户,现在将数据库转换为MySQL。我在MySQL中编写以下查询: 我得到以下错误 如何用MySQL正确编写这样的查询? 问题答案: 使用CREATE TABLE SELECT语法。 http://dev.mysql.com/doc/refman/5.0/en/create-table- select.html