我最近在代码审核中发表了评论:
最好明确枚举字段。 "选择*"没有按'吨 保证订单
在这种情况下使用select * from (select a,b,c ...)
之类的查询是否正确?我无法想象一个数据库引擎会重新排序结果中的列,但是我的想象力比某些数据库引擎更合乎逻辑。
答案 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子句,则不会始终以相同的顺序提取行。