这是一个例子:
表 1 -columnA -columnB
问题:
和有什么区别
SELECT * FROM Table1
和
SELECT columnA, columnB FROM Table1
我知道这两个查询返回相同的结果。但是有区别还是这两个查询做完全相同的事情?
此外,MySQL 服务器如何处理这些?
有人可以指出这方面的任何文件吗?
谢谢!
塞巴斯蒂安
没有区别。这是列的投影问题。
使用 时*
,您无法控制列名。它只是选择表中的所有列。
虽然指定列名可以更灵活,但在我自己看来,因为您可以给列名 analias
并且您可以在列中执行一些操作,例如将其传递给函数。
这是区别:
select count(*) from table, count all registers on that table,
非常相似
select count(1) from table, count all registers on that table
和
select count(column_name) from table,
计算该表上 column_name 不为空的所有寄存器
如果您专门选择列,然后通过添加、删除或重命名列来更改表的结构,您将被迫编辑查询以使其工作(或者,在添加列的情况下,包括附加数据)。选择*
将加载所有列,无论这些列是什么,因此如果稍后更新表结构,您的查询仍将完全有效。
但是:如果您的查询要包含连接,则需要*
在表名前面加上前缀,如果两个表都具有相同名称的列,则存在列名冲突的风险。因此,在连接查询的情况下,我认为从每个表中选择单个列总是一个好主意,而不是*
从一个表中选择另一个表中的单个列。
选择单个列还允许您使用别名重命名列,如下所示:
SELECT column_1 AS first, column_2 AS second
FROM some_table
通常,避免使用“SELECT *”。它是邪恶的、缓慢的,并且当您在几个月后返回它时,会使您的代码更难阅读。相反,命名并限定您的列。为您的表实例(如果您愿意,也可以为您的列)命名...
SELECT x.something, y.something_else FROM my_table x JOIN my_other_table y ON y.id = x.id
如果您查看我对 SO 的许多其他回复,您会发现我并不总是听从这个建议,但这仍然是个好建议!