【问题标题】:Why `ORDER BY` can use nonexist column at its execution time?为什么“ORDER BY”可以在执行时使用不存在的列?
【发布时间】:2020-05-14 00:41:57
【问题描述】:

假设我有一个 movies 表和一个带有 movies_id 外键的演员表

SELECT movies.id, movies.title
JOIN actors
ON movies.id = actors.movie_id
GROUP BY movies.id
ORDER BY COUNT(movies.id) DESC

这将正确地给我按演员数量排序的电影。

但我认为前 4 行应该生成一个类似的表格

id title 
2. Titanic
3. Fight club
1. Casablanca

每个电影id应该只出现一次,怎么ORDER BY按个数排序呢?除非 SQL 在执行前 4 行时做了一些底层魔法来秘密计算 COUNT(movies.id)

【问题讨论】:

  • 您的意思是order of execution of SQL,SQL 将逐步执行:JOIN,然后是 GROUP BY,然后是 SELECT,那么它如何在不知道 COUNT(*) 的情况下进行 ORDER BY? IMO 它将首先parse 查询,然后它会知道它应该在 GROUP BY/SELECT 步骤中计算 COUNT(*),以便在 ORDER BY 步骤中它将有信息进行排序。要知道,SQL 并不是一个未知的魔法实体,它只是一个由,嗯,一些书呆子写的程序。

标签: sql


【解决方案1】:

有趣的问题。 ORDER BY 可以使用任何可能SELECT 中的表达式。在内部,SQL 进行计算,因此可以使用。

这不仅适用于COUNT(*)等函数,也适用于带参数的函数。或者他们的任何表达。例如,这是允许的:

ORDER BY LENGTH(movies.title) DESC

首先获取最长的电影名称——假设您的数据库有一个LENGTH() 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多