【发布时间】: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;
我无法理解的是:
- 为什么“a_value”和“total”别名是绝对必要的(我从不在此查询中使用它们)而它们的缺失给了我“每个派生表都必须有自己的别名”?
- 为什么“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 不需要任何括号,也不需要别名。