[英]Sub-Query and having group by clause in sql
我们可以不使用子查询来编写此查询吗?
select * from test where EmpTran in
(select max(EmpTran) from test);
我尝试了此代码,但返回空集。 我读到,“在没有分组依据的情况下,整个数据被视为一个分组”,如果是这种情况,查询应返回与上述查询相同的结果。
select EmpTran,EmpName from test
having EmpTran = max(EmpTran);
样本数据:
create table test(EmpName varchar(10),EmpTrans int);
insert into test values('Ans',100);
insert into test values('Sam',50);
insert into test values('Kar',150);
insert into test values('Sar',200);
insert into test values('Raj',200);
第二个查询不起作用,因为一旦您在查询中的任何地方使用了聚合函数,就会导致行被聚合。 由于您没有GROUP BY
,因此所有内容都汇总到结果集中的一行中(正如您所引用的: 在没有group by的情况下,整个数据将被视为一个group )。 在此结果集中, EmpTran
和EmpName
从表中的任意行中获取(它们甚至可能不在同一行中)。
HAVING
然后过滤该结果集。 如果EmpTran
的选定值与MAX(EmpTran)
不匹配,则从结果集中删除该行,您将得到一个空结果。
处理顺序为:
WHERE
选择要放入结果集中的行。 HAVING
过滤汇总的结果集。 我认为在MySQL 5.x中没有子查询就没有办法做到这一点。 在MySQL 8.x中,您可以使用窗口函数来完成此操作(我对它们不熟悉,因此我不会在答案中显示它)。
正如Barmar已经解释的那样,您的第二个查询将不起作用,因为查找列的最大值需要一个正式的单独子查询。 对于早于8+的MySQL版本就是这种情况。 从引入窗口函数的MySQL 8+开始,我们可以尝试这样的事情:
SELECT *
FROM
(
SELECT *, MAX(EmpTran) OVER () max_val
FROM test
) t
WHERE EmpTran = max_val;
该演示在SQL Server中,因为Rextester尚不支持MySQL 8+。 但是,它应该在实现ANSI标准窗口功能的任何数据库上运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.