
我想按ssex字段分组,然后在每个组中拿出最大的sage记录。
select * from student ,
(select max(sage) maxAge,ssex from student group by ssex) as st2
where student.ssex=st2.ssex and student.sage= st2.maxAge;问:为什么子查询可以在“来自学生”之后使用?
发布于 2022-05-02 04:20:31
这是因为在支持所有SQL数据库的关系集理论中,表被正式定义为relation的持久化形式。查询结果只是另一种形式的关系。在查询中,您可以将与任何其他类型的关系(表、子查询、视图、表值构造函数等)连接起来。
因此,我们问题中的代码使用了旧的 join 语法,这种语法自1992年以来就已经过时,可以将表关系与查询关系连接起来。它应该写成这样:
SELECT *
FROM student st1
INNER JOIN (
SELECT max(sage) maxAge, ssex
FROM student
GROUP BY ssex
) as st2 ON st1.ssex = st2.ssex and st1.sage = st2.maxAge;希望这对你来说更有意义。
但是,今天我们将使用一个窗口函数而不是一个自连接来编写这种查询,它的性能应该会更好:
SELECT *
FROM (
SELECT *, dense_rank() over (partition by ssex order by sage desc) dr
FROM Student
) s
WHERE dr = 1我预计这将在一小部分时间内运行,就像原来的那样。
因此,虽然我们看到原始代码可以这样编写,但有两个很好的理由不应该这样编写。
发布于 2022-05-02 04:24:55
选择可以指定多个表,笛卡尔积将在这些表之间执行。
SELECT fieldName FROM table1,table2 … WHERE table1.field = table2.fied AND other conditiontable2可以是子查询。
https://stackoverflow.com/questions/72082181
复制相似问题