工科小石头 2024-06-30 19:16 采纳率: 40%
浏览 3
已结题

【SQL】为什么order by后面可以这样子填?

这是SQLZOO的SELECT from Nobel 的第14题,题目我看得懂,就是将1984年诺贝尔获奖者按照名字和获奖领域进行升序排序,但是物理和化学奖得者要放到最后。
但这个思路我不是很懂,为什么subject IN ('Chemistry','Physics') 可以直接放在order by后面,还能使物理和化学奖得者出现在最后排。
有专家解答吗?

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-30 19:16
    关注

    引自免费微信小程序:皆我百晓生

    在SQL中,ORDER BY子句用于对查询结果进行排序。你可以按照一个或多个列的值对结果进行排序。在ORDER BY子句中使用的表达式可以非常复杂,包括函数、常量值等。你提到的subject IN ('Chemistry', 'Physics')这种情况实际上是利用了SQL中表达式的特性来实现特定的排序需求。

    首先,对于题目中的需求:将1984年诺贝尔获奖者按照名字和获奖领域进行升序排序,但是物理和化学奖得者要放到最后。我们可以通过一个稍微不同的角度来思考这个问题。我们可以先对所有其他领域的获奖者进行排序,然后再将化学和物理领域的获奖者添加到结果集的末尾。这就需要使用到ORDER BY子句中的表达式。

    在你的查询中,order by subject in ('Chemistry', 'Physics')这个表达式的返回值实际上是一个布尔值(True或False)。当某个记录的subject字段是'Chemistry'或'Physics'时,这个表达式的结果为True,否则为False。在SQL中,True会被当作更大的值来处理,因此含有这两个主题的记录会被移到排序结果的末尾。这个原理是类似的,但是通常情况下,我们会在表达式前面加上一些额外的处理,例如将布尔值转换为数值来确保正确的排序顺序(在这种情况下不是必需的)。接下来按领域(subject)进行排序以确保除化学和物理领域以外的其他领域也按照特定的顺序排列。最后按照胜者名字(winner)进行排序以确保每个领域内的胜者都按照字母顺序排列。因此整个排序逻辑是首先按非化学和物理领域排序,然后是化学和物理领域。在化学和物理领域内部,则按名字进行排序。

    关于你提到的图中的内容,看起来像是SQLZoo的解答提示或者解释。实际上,这个提示解释了如何使用IN表达式在ORDER BY子句中实现特定的排序需求。它通过将化学和物理领域的记录移到排序结果的末尾来实现题目的要求。同时,它也展示了查询语句的各个部分如何协同工作以产生所需的结果集。至于图中的示例查询语句本身可能存在一些小错误或遗漏的部分(例如缺少字段列表),在实际应用中需要修正以确保其正确性和完整性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月30日
  • 已采纳回答 6月30日
  • 创建了问题 6月30日