【问题标题】:Why doesn't this query work and this one does?为什么这个查询不起作用而这个起作用?
【发布时间】:2019-07-11 18:17:53
【问题描述】:

在 MySQL Shell 中,两个几乎相同的查询。一个有效,一个无效。区别是一个关键词。这是为什么?

工作查询只会根据您在子查询中使用的限制数获得您选择的薪水。所以“限制4”会给你第四高的薪水。

SELECT SALARY
FROM (
      SELECT DISTINCT SALARY
      FROM TBLEMPLOYEE
      ORDER BY SALARY DESC LIMIT 3
      ) RESULT
ORDER BY SALARY LIMIT 1

这成功给了第三高的薪水。

如果我删除“结果”一词,它将不再有效。结果有什么作用?那是别名吗?我明白了: ERROR 1248 (42000): 每个派生表都必须有自己的别名

【问题讨论】:

  • 因为 MySQL 中的派生表需要表别名。
  • 是的,它是一个别名。 (在 SQL 标准中,它被称为“关联名称”。)MySQL 需要内联视图的关联名称。在 MySQL 用语中,内联视图(括号中的 FROM 关键字后面的 SELECT)称为“派生表”。并且 MySQL 要求分配一个名称,该名称必须遵循有效标识符的规则。它不需要特别是result,我们可以使用r2d2v

标签: mysql sql


【解决方案1】:

每个派生表(AKA 子查询)确实必须有一个别名。 IE。括号中的每个查询都必须有一个别名(不管是什么),它可以用来在外部查询的其余部分中引用它。是的结果是一个别名。它可以是任何名称来代替结果,如 myalias 或别的东西。

SELECT SALARY
FROM (
      SELECT DISTINCT SALARY
      FROM TBLEMPLOYEE
      ORDER BY SALARY DESC LIMIT 3
      ) AS RESULT
ORDER BY SALARY LIMIT 1

更多示例

SELECT ID
FROM (SELECT ID,
             msisdn 
      FROM (SELECT * FROM TT2) as myalias
     ) as anotheralias;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多