为什么SQL查询时使用列别名会出现报错?
报错原因
你遇到的问题有两个核心触发点:
- 你写的第二条SQL中
FROM actor后多了一个多余的分号,直接把整条查询截断为两个不完整的语句,WHERE子句不属于前面的查询逻辑,首先触发语法错误。 - 就算你去掉这个多余分号,依然会报
fullname字段不存在的错误,这是SQL的执行顺序特性导致的:
SQL的逻辑执行顺序和语句的书写顺序不一致,你写语句的顺序是SELECT → FROM → WHERE,但数据库实际执行的顺序是:
- 第一步执行
FROM:定位要查询的目标表 - 第二步执行
WHERE:按过滤条件筛选表数据 - 第三步才执行
SELECT:计算列值、生成列别名
所以执行WHERE子句的时候,SELECT里定义的fullname别名还没有生成,数据库自然无法识别这个字段。
解决方法
你可以选以下任意一种方案修改代码,另外注意BETWEEN要求左值小于右值,字符串排序中Fred Costner的字典序远小于Zero Cage,写反顺序会查不到任何结果:
- 方案1:在WHERE中直接复用列计算逻辑,不需要用别名
SELECT first_name || ' ' || last_name AS fullname FROM actor WHERE first_name || ' ' || last_name BETWEEN 'Fred Costner' AND 'Zero Cage';
- 方案2:用子查询包裹别名生成逻辑,外层过滤时就可以识别别名
SELECT fullname FROM ( SELECT first_name || ' ' || last_name AS fullname FROM actor ) AS actor_with_fullname WHERE fullname BETWEEN 'Fred Costner' AND 'Zero Cage';
- 方案3:用CTE(公共表表达式)实现,可读性比子查询更好
WITH actor_with_fullname AS ( SELECT first_name || ' ' || last_name AS fullname FROM actor ) SELECT fullname FROM actor_with_fullname WHERE fullname BETWEEN 'Fred Costner' AND 'Zero Cage';
内容的提问来源于stack exchange,提问作者Robin Sage
相关产品推荐
相关产品推荐

