mysql - 为什么在 MySQL 中使用 '' 或 ""不能通过 ORDER BY 对列别名进行排序?

标签 mysql sql database select sql-order-by

今天,在与我的 friend Dumisani Ndubane 进行的现场学习类(class)中,我们发现使用 ORDER BY 通过使用 ``、'' 或 ""引用类型对带有列别名的结果集进行排序时,行为发生了细微的变化.

'' 和 ""不受排序影响,只有 `` 有效,但所有引号都允许进行列别名。请参阅下面的查询;

  1. 这按升序对全名进行排序(在列别名上使用``引号):
SELECT
    CONCAT_WS(', ', lastName, firstname) `Full name`
FROM
    employees
ORDER BY
    `Full name`;

enter image description here

  • 这不会对结果集进行排序。请注意,我们使用了 '' 引号
  • SELECT
        CONCAT_WS(', ', lastName, firstname) 'Full name'
    FROM
        employees
    ORDER BY
        'Full name';
    

    enter image description here

  • 这不会对结果集进行排序。请注意,我们使用了“”引号
  • SELECT
        CONCAT_WS(', ', lastName, firstname) "Full name"
    FROM
        employees
    ORDER BY
        "Full name";
    

    enter image description here

    此外,我们在 Mac 上使用 MySQL 版本 mysql Ver 8.0.19 for osx10.13 on x86_64 (Homebrew)。这是故意的吗?对此行为有解释吗?另外,为什么不坚持对 MySQL 标识符使用反引号 (``),对字符串文字使用 '' 或 ""。为什么要混合它们?

    我认为这可能是 MySQL 的用户体验 (UX) 改进,因为当前的现状对于试图学习的新手来说似乎很困惑。

    SO 社区有何想法,并提前感谢您的帮助。

    最佳答案

    单引号(在 MySQL 中,双引号)代表文字字符串。所以 'Full name' 就是这样:一个文字字符串。使用它进行排序是没有意义的,因为该值对于所有行都是恒定的:因此,行的顺序是未定义,这意味着数据库可以自由地以其喜欢的任何顺序返回行。

    相反,请使用用于标识符的反引号,因此 order by 引用 select 子句中的表达式别名。

    或者更好的是,使用不需要引号的别名,这样您就不必担心这一切。

    关于mysql - 为什么在 MySQL 中使用 '' 或 ""不能通过 ORDER BY 对列别名进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61467696/

    相关文章:

    mysql - 如何在非常大的数据库上快速搜索

    database - 是否有任何图形数据库允许您首先定义标签和关系(模式)

    database - 在哪里执行桌面应用程序的数据验证?在数据库中还是在代码中?

    php - 提交时 PDO 查询检查重复的用户名

    php - 用户输入,在发送到数据库之前进行清理和 sanitizer

    mysql - 特定情况下SQL表的命名约定

    php - 检查用户名是否存在不起作用

    mysql - 两次连接或不连接-查询2个表

    php - 使用 php 将信息更新到 mysql

    php - MySQL Distinct 和 LEFT JOIN 返回重复