例如我有两个表:
BALANCE VS
╔══════╦══════╗ ╔══════╦═══════╗
║ V_ID ║ BAL ║ ║ V_ID ║ NAME ║
╠══════╬══════╣ ╠══════╬═══════╣
║ 1 ║ 1000 ║ ║ 1 ║ Carl ║
║ 1 ║ 500 ║ ║ 2 ║ Peter ║
║ 1 ║ -200 ║ ╚══════╩═══════╝
║ 2 ║ 350 ║
║ 2 ║ 1000 ║
╚══════╩══════╝
现在我完成了如下查询:
select
NAME,sum(BAL)
from VS,BALANCE
where VS.V_ID = BALANCE.V_ID
group by NAME
结果是:
╔═══════╦══════╗
║ NAME ║ BAL ║
╠═══════╬══════╣
║ Carl ║ 1300 ║
║ Peter ║ 1350 ║
╚═══════╩══════╝
但我想知道它是如何没有“group by”子句的。类似子查询的东西。 我尝试了不同的东西,但我不知道它是如何工作的。我总是以结果结束,例如将所有值汇总到一行中,或者结果与上面类似但没有分组。
谁能帮帮我
问候
编辑:忘记求和()
最佳答案
要让您当前的 SQL 使用 GROUP BY 工作,您需要以下内容(即 SUM 聚合函数):-
select NAME, SUM(BAL)
from VS, BALANCE
WHERE VS.V_ID = BALANCE.V_ID
group by NAME
请注意,这只是对您的原始 SQL 进行了最低限度的修改,它仍然使用您编码的隐式连接。通常应避免隐式连接,最好使用显式 INNER JOIN....ON 语法:-
select NAME, SUM(BAL)
from VS
INNER JOIN BALANCE
ON VS.V_ID = BALANCE.V_ID
group by NAME
如果你真的想避免 GROUP BY 那么可以使用子查询,但可能会更慢(因为它实际上必须对主查询返回的每一行执行额外的查询):-
select NAME, (SELECT SUM(BAL) FROM BALANCE WHERE BALANCE.V_ID = VS.V_ID)
from VS
编辑,以回应您对子查询的评论。
关联子查询有效地强制MySQL得到一个结果集,然后对结果集上的每一行执行另一个查询。大多数情况下,它们用于获取聚合值(例如与返回行上的行相关的字段的最大值,但主查询中的 GROUP BY 不可行)。
例如,如果您有一个用户的评论列表,但在每一行上您想知道该用户的最新评论的日期,您可以执行以下操作:-
SELECT users.user_name, comments.comment_date, (SELECT MAX(comment_date) FROM comments WHERE comments.user_id = users.id) AS latest_comment_date
FROM users
INNER JOIN comments
ON users.id = comments.user_id
这可以写成使用 GROUP BY 进行不相关的子查询,然后加入:-
SELECT users.user_name, comments.comment_date, latest_comment_date
FROM users
INNER JOIN comments
ON users.id = comments.user_id
INNER JOIN
(
SELECT user_id, MAX(comment_date) AS latest_comment_date
FROM comments
GROUP BY user_id
) sub1
ON users.id = sub1.user_id
如果您要处理大量用户记录,这可能会更快。
但是,如果您只处理少量用户记录(并且确定该数量非常复杂),则获取所有最大评论日期将是不必要的开销,并且它会强制对子查询进行连接'可能会使用索引。
关于mysql - 在没有分组依据但有子查询的情况下获取总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24036508/