【问题标题】:Where to put aliases in MySQL query在 MySQL 查询中放置别名的位置
【发布时间】:2020-10-27 20:47:30
【问题描述】:

总的来说,我对 MySQL 和 SQL 还很陌生,不能完全理解如何以及在何处放置别名。 例如,我有这样的架构:

CREATE DATABASE testdb;
USE testdb;

CREATE TABLE table_a (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    value INT NOT NULL,
    PRIMARY KEY(id)
);

CREATE TABLE table_b (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    value INT NOT NULL,
    PRIMARY KEY(id)
);

INSERT INTO table_a (value) VALUES (25), (43), (15);
INSERT INTO table_b (value) VALUES (11), (15), (16);

我需要获取每条记录的值的总和(在两个表中)。对于给定的示例,它应该是 125。我的查询看起来像这样

SELECT SUM(value) FROM
(
    SELECT * FROM
        (SELECT value FROM table_a) AS a_value
    UNION ALL
        (SELECT value FROM table_b) #AS b_value
) as total;

我无法理解的是:

  1. 为什么“a_value”和“total”别名是绝对必要的(我从不在此查询中使用它们)而它们的缺失给了我“每个派生表都必须有自己的别名”?
  2. 为什么“b_value”在第一次选择时出现“SELECT 在这个位置无效”错误?它不也是一个派生表,比如具有“a_value”别名的表吗?

我有一个关于括号和子查询的问题:为什么我需要这个“SELECT * FROM”来将 UNION 放在括号中?我是从这样的要求开始的:

SELECT SUM(value) FROM
    (SELECT value FROM table_a) AS a_value
UNION ALL
    (SELECT value FROM table_b);

但我想要的不是总和,而是给我来自“table_a”的“价值”总和与来自“table_b”的“价值”列 - [83、11、15、16]。因此,我尝试将 FROM 之后的所有内容都放在括号中,但没有成功:我收到“SELECT is not valid at this position”错误。

我不太确定,只是首先尝试了我想到的,然后将 SELECT * FROM 放在括号内,然后放在其他所有内容之前,它就起作用了。所以我想知道为什么它有效,为什么我的第一种方法(只有括号)不起作用?

【问题讨论】:

  • 我不太清楚你真正想要回答的是哪个问题
  • UNION 的 SELECT 不需要任何括号,也不需要别名。

标签: mysql sql


【解决方案1】:

所有派生表——FROM 子句中的子查询——都需要有一个表别名。如果它们曾经被使用过,那并没有什么不同。

但是,不需要子查询。您可以将UNION ALL 放在FROM 子句中:

SELECT SUM(value) as total
FROM (SELECT value FROM table_a UNION ALL
      SELECT value FROM table_b
     ) ab
-------^ note that this is needed although it is not used in the query

可以使用别名

SELECT SUM(ab.value) as total

在子查询中先进行聚合可能会稍微快一些:

SELECT SUM(value)
FROM (SELECT SUM(value) as value FROM table_a UNION ALL
      SELECT SUM(value) as value FROM table_b
     ) ab

【讨论】:

  • 两个(或三个)SUM 会比一个快,这似乎违反直觉,但似乎确实如此 - 每个表大约 100,000 行的速度大约是两倍
【解决方案2】:

这是因为子查询的结果可以唯一标识。即使您不打算在任何地方引用该名称,您也必须这样做。

在 SELECT 语句中使用子查询时,它们只能返回一个值。

一般来说,子查询对整个查询只运行一次,其结果会被重复使用。

【讨论】:

  • "在 SELECT 语句中使用子查询时,它们只能返回一个值" - 这是错误的,除非您的意思是“在选择 列表中” (即列的列表)
  • 可以参考这个链接:“essentialsql.com/….”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2015-04-27
  • 1970-01-01
  • 2022-01-04
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多