SELECT last_name,department_id,salary*12 annual_sal
FROM employees
ORDER BY annual_sal DESC;
#以上代码可以正常运行
但是吧字段别名annual_sal换成 "salary of year",倒序排列的部分就失效了
请教各位大虾是为什么??
#以下代码可以运行,但是排序部分失效
SELECT last_name,department_id,salary*12 "salary of year"
FROM employees
ORDER BY "salary of year" DESC;
参考GPT和自己的思路:
问题出在字段别名上,如果使用了双引号将别名包裹起来,SQL会将其视为标识符处理,不再作为计算结果中的字段别名。所以在ORDER BY语句中引用“salary of year”时,它被视为列名而不是字段别名,所以排序无法按预期生效。解决办法是要么去掉双引号,让SQL将别名作为字段别名处理,要么换用合法的标识符名来替代该别名。例如可以这样改写查询语句:
SELECT last_name,department_id,salary*12 AS salary_of_year
FROM employees
ORDER BY salary_of_year DESC;
这样就能正确地对”salary of year”这个字段进行倒序排序了。
ORDER BY "salary of year" DESC;
这里的字符串不是字段,所以等于以一个常数作为排序依据,那当然没有排序
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在 SQL 中,ORDER BY 子句使用别名时需要注意,因为别名只是在查询结果中显示的名称,而不是在内部处理中使用的列名。
在第一个查询中,使用的是表达式 salary*12 的别名 annual_sal 进行排序,这个别名对应的是一个有效的表达式,可以在排序过程中正常使用。
而在第二个查询中,使用的是别名 "salary of year" 进行排序,这个别名对应的并不是一个有效的表达式,因此在排序过程中会发生错误,导致排序无法正常进行。
如果你想在第二个查询中使用别名进行排序,可以在 SELECT 语句中使用子查询来定义别名,例如:
SELECT last_name, department_id, annual_sal AS "salary of year"
FROM (
SELECT last_name, department_id, salary*12 AS annual_sal
FROM employees
) sub
ORDER BY annual_sal DESC;
这里先使用子查询定义了别名 annual_sal,然后在外层查询中使用这个别名进行排序,最终结果中使用了别名 "salary of year" 来显示这个值。
好的,明白了,谢谢!!
终极解决方案:
SELECT last_name,department_id,salary*12 "salary of year"
FROM employees
ORDER BY `salary of year` DESC;
`` 这个不是单引号,而是键盘第二排最左边(数字1按键的左边)的按键输入的符号,也可称之为飘号。