mysql子查询和sql中的groupby子句

xriantvc  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(412)

我们可以不使用子查询编写这个查询吗?

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);
enxuqcxy

enxuqcxy1#

正如barmar已经解释的那样,第二个查询将不起作用,因为查找列的最大值需要一个正式的独立子查询。早于8+的mysql版本就是这样。从引入窗口函数的mysql 8+开始,我们可以尝试以下方法:

SELECT *
FROM
(
    SELECT *, MAX(EmpTran) OVER () max_val
    FROM test
) t
WHERE EmpTran = max_val;

演示

演示是在sql server中进行的,因为rextester还不支持MySQL8+。但是,它应该在任何实现ansi窗口函数标准的数据库上运行。

7eumitmz

7eumitmz2#

第二个查询不起作用,因为只要在查询中的任何位置使用聚合函数,就会导致行被聚合。既然你没有 GROUP BY ,所有数据都聚合到结果集中的一行中(正如您所引用的:在缺少groupby的情况下,将整个数据作为一个组)。在这个结果集中, EmpTran 以及 EmpName 从表中的任意行中获取(它们甚至可能不来自同一行)。 HAVING 然后过滤这个结果集。如果选定的值 EmpTran 不匹配 MAX(EmpTran) ,则该行将从结果集中删除,并得到一个空结果。
处理顺序为:
使用 WHERE 选择要放入结果集中的行。
必要时聚合结果集。
使用 HAVING 筛选聚合结果集。
我不认为在mysql 5.x中没有子查询就可以做到这一点。在mysql 8.x中,您可以通过一个窗口函数来实现它(我不熟悉这些函数,所以我不会在我的答案中显示它)。

相关问题