FROM
提供column_alias
,SQL 规范调用这些<derived column list>
子句。这就是 postgres 文档对它们的评价,
FROM
包含别名的项目的替代名称。别名用于简洁或消除自连接的歧义(同一个表被扫描多次)。当提供别名时,它会完全隐藏表或函数的实际名称;比如给定FROM foo AS f
的,其余的SELECT
必须把这个FROM
item称为f
notfoo
。如果编写了别名,则还可以编写列别名列表来为表的一个或多个列提供替代名称。
什么时候需要这些?我什么时候不能只使用 COLUMN 别名?
SELECT t.*
FROM table_name AS t (a,b,c);
对比
SELECT t.col1 AS a, t.col2 AS b, t.col3 AS c
FROM table_name AS t;
此示例取自@ypercubeᵀᴹ 选择的答案,这似乎不太有用。
上述上下文中的 FROM 别名没有真正的好处,除非你是
- 依赖部分别名(不别名整个表)
- 这取决于升序列排序
- 你的表有超过三列(或者你可以在 from 子句中明确地写出来)。
这样做似乎依赖于t.*
增加模糊性的常规堆叠的危险。那么什么时候FROM
混叠有用呢?
如果列不存在(VALUES 子句)
PostgreSQL 为它们提供了默认名称,但这不是重点。您不能在不存在的 COLUMN 列表中为它们加上别名。
这将是VALUES LIST语法的一个很好的例子,它要求您在
FROM
列表中使用别名。从那里您甚至可以在选择列表中使用别名。
而且,这给我们带来了一个复杂的例子,比如PostGIS in Action, Second Edition第 190 页上的例子。
如果这很难理解,那么还有另一个尴尬的结构,那就是 SELECT 作为 COLUMN。
lo_create
返回一个oid。不过,这超出了此答案的范围。对于另一个真实世界的示例,请参阅我刚刚回答的这个问题。
在 SELF JOIN 中
这可能值得一提,因为它在文档中,
你自己加入你会得到两
bar
列。但是,使用 FROM 别名,您可以单独标记它们,
然而,这并不比 COLUMN-aliasing 方法更好,
唯一的区别是,在 FROM 别名方法中,您唯一地引用
t2.bar
as的所有实例bar2
。