两者之间的表现有什么不同
select *
from table name
Run Code Online (Sandbox Code Playgroud)
和
select [col1]
,[col2]
......
,[coln]
from table name
Run Code Online (Sandbox Code Playgroud)
它是一个使用的SQL 反模式SELECT *.当您指定列时,它对数据库来说更快(它不需要查找它们),更重要的是,您不应该指定比实际需要更多的列.如果您在查询中有一个连接,则至少有一个您不需要的列(连接列),因此SELECT *返回带有连接的查询中的记录总是较慢,因为它返回的信息多于必要的信息.
现在所有这些听起来都是一个很小的改进,并且可能在一个小系统中,但随着数据库的增长和繁忙,性能影响变得更大.没有借口可以使用SELECT *.
SELECT *对于维护也很糟糕,特别是如果你使用它来插入记录 - 总是指定要插入的列和使用SELECT的INSERT语句中的select字段.如果更改表结构,它将会中断.您最终还可能会显示您不希望他们看到的用户列,例如为复制添加的GUID.
如果SELECT *在视图中使用(至少在SQL Server中),则在更改基础表的情况下,视图仍不会自动更新.如果某人有愚蠢的想法重新安排表格中的列顺序(是的,我知道你不应该,但人们有时会这样做)使用SELECT *可能意味着数据将显示在报告或插入的错误列中,这可能会导致事情可能被误解的问题.我可以想到一个案例,其中两个列在临时表中交换,社会安全号码成为我们打算向发表演讲的人支付的金额.您可以看到除了我们没有使用之外,这可能会如何真正破坏会计,SELECT *因此我们是安全的,因为列保留了相同的名称.
我想要注意的是,你甚至没有通过使用节省很多开发时间SELECT *.当我从SQL Server中的对象浏览器中拖动它们时,即使在大型表中使用表名也需要大约15秒以上(您可以在一个步骤中获取所有列).