select * from(select a,b,c ...)保证结果列的顺序?

时间:2015-04-01 12:57:04

标签: sql postgresql select relational-database relation

我最近在代码审核中发表了评论:

  

最好明确枚举字段。 "选择*"没有按'吨   保证订单

在这种情况下使用select * from (select a,b,c ...)之类的查询是否正确?我无法想象一个数据库引擎会重新排序结果中的列,但是我的想象力比某些数据库引擎更合乎逻辑。

2 个答案:

答案 0 :(得分:4)

针对select *的建议主要针对您直接查询表格。

在某些数据库中,可以在表格的中途插入新列,以便表格t (a, b)成为表格t (a, c, b)。 PostgreSQL(尚)支持此功能,但它仍然可以附加列,并且可以从任何位置删除列,因此如果添加t (a, c)并删除c,您仍然可以获得b

这就是为什么在生产查询中使用*被认为是不好的做法,特别是如果您的应用程序依赖于序数列位置来读取结果。但实际上,这仅适用于您未在查询中的其他位置指定字段的情况。

在您的情况下,您可以在子查询中执行此操作。所以*非常安全,IMO在这种用法中是完全可以接受的。

此:

select * from (select a,b,c ... from t)

很好。

此:

select * from t

select * from (select * from t)

是有问题的,因为它们将未定义的列顺序留给应用程序。即使这样,如果您的应用程序假定列顺序而不检查查询元数据,那么这只是一个问题。

我个人更喜欢在大多数情况下完全限定我的列,但肯定有时*是最易读的选项。

IMO,当客户端应用程序按名称而不是按顺序读取列时,使用select *非常好。如果您的应用从不关心c是第二列还是第三列,因为它使用结果元数据来构建行字典(比如Perl的DBI或Python的psycopg2可以做),那么&# 39;没有理由不使用*

但是,当您只需要列的子集时,SELECT *可能会有性能成本。错过了使用仅索引扫描,不必要地获取外线TOASTed数据以及浪费不需要的值等带宽的机会。所以大部分时间它仍然不是一个好主意。

答案 1 :(得分:1)

列始终按表中定义的顺序排列。但是,如果不包含order by子句,则不会始终以相同的顺序提取行。