首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个sql可以这样写呢?

为什么这个sql可以这样写呢?
EN

Stack Overflow用户
提问于 2022-05-02 03:56:16
回答 2查看 49关注 0票数 0

我想按ssex字段分组,然后在每个组中拿出最大的sage记录。

代码语言:javascript
复制
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;

问:为什么子查询可以在“来自学生”之后使用?

EN

回答 2

Stack Overflow用户

发布于 2022-05-02 04:20:31

这是因为在支持所有SQL数据库的关系集理论中,表被正式定义为relation的持久化形式。查询结果只是另一种形式的关系。在查询中,您可以将与任何其他类型的关系(表、子查询、视图、表值构造函数等)连接起来。

因此,我们问题中的代码使用了旧的 join 语法,这种语法自1992年以来就已经过时,可以将表关系与查询关系连接起来。它应该写成这样:

代码语言:javascript
复制
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;

希望这对你来说更有意义。

但是,今天我们将使用一个窗口函数而不是一个自连接来编写这种查询,它的性能应该会更好:

代码语言:javascript
复制
SELECT *
FROM (
    SELECT *, dense_rank() over (partition by ssex order by sage desc) dr
    FROM Student
) s
WHERE dr = 1

我预计这将在一小部分时间内运行,就像原来的那样。

因此,虽然我们看到原始代码可以这样编写,但有两个很好的理由不应该这样编写。

票数 1
EN

Stack Overflow用户

发布于 2022-05-02 04:24:55

选择可以指定多个表,笛卡尔积将在这些表之间执行。

代码语言:javascript
复制
SELECT fieldName FROM table1,table2 … WHERE table1.field = table2.fied AND other condition

table2可以是子查询。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72082181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档