繁体   English   中英

子查询并在SQL中具有group by子句

[英]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 )。 在此结果集中, EmpTranEmpName从表中的任意行中获取(它们甚至可能不在同一行中)。

HAVING然后过滤该结果集。 如果EmpTran的选定值与MAX(EmpTran)不匹配,则从结果集中删除该行,您将得到一个空结果。

处理顺序为:

  1. 使用WHERE选择要放入结果集中的行。
  2. 如有必要,汇总结果集。
  3. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM