我们可以不使用子查询编写这个查询吗?
select * from test where EmpTran in
(select max(EmpTran) from test);
我尝试了这个代码,但它返回空集。我读到,'在没有groupby的情况下,整个数据被作为一个组',如果是这样的话,查询应该返回与上面查询相同的结果。
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);
2条答案
按热度按时间enxuqcxy1#
正如barmar已经解释的那样,第二个查询将不起作用,因为查找列的最大值需要一个正式的独立子查询。早于8+的mysql版本就是这样。从引入窗口函数的mysql 8+开始,我们可以尝试以下方法:
演示
演示是在sql server中进行的,因为rextester还不支持MySQL8+。但是,它应该在任何实现ansi窗口函数标准的数据库上运行。
7eumitmz2#
第二个查询不起作用,因为只要在查询中的任何位置使用聚合函数,就会导致行被聚合。既然你没有
GROUP BY
,所有数据都聚合到结果集中的一行中(正如您所引用的:在缺少groupby的情况下,将整个数据作为一个组)。在这个结果集中,EmpTran
以及EmpName
从表中的任意行中获取(它们甚至可能不来自同一行)。HAVING
然后过滤这个结果集。如果选定的值EmpTran
不匹配MAX(EmpTran)
,则该行将从结果集中删除,并得到一个空结果。处理顺序为:
使用
WHERE
选择要放入结果集中的行。必要时聚合结果集。
使用
HAVING
筛选聚合结果集。我不认为在mysql 5.x中没有子查询就可以做到这一点。在mysql 8.x中,您可以通过一个窗口函数来实现它(我不熟悉这些函数,所以我不会在我的答案中显示它)。