选择

SELECT *以与表中定义的顺序相同的顺序返回所有列。

使用 SELECT *时,只要表定义发生更改,查询返回的数据就会发生变化。这会增加应用程序或数据库的不同版本彼此不兼容的风险。

此外,读取更多列不必要可以增加磁盘和网络 I / O 的数量。

因此,你应始终明确指定实际要检索的列:

--SELECT *                                 don't
  SELECT ID, FName, LName, PhoneNumber  -- do
  FROM Emplopees;

(进行交互式查询时,这些注意事项不适用。)

但是,SELECT *在 EXISTS 运算符的子查询中不会受到影响,因为 EXISTS 无论如何都会忽略实际数据(它只检查是否至少找到了一行)。出于同样的原因,列出 EXISTS 的任何特定列是没有意义的,所以 SELECT *实际上更有意义:

-- list departments where nobody was hired recently
SELECT ID,
       Name
FROM Departments
WHERE NOT EXISTS (SELECT *
                  FROM Employees
                  WHERE DepartmentID = Departments.ID
                    AND HireDate >= '2015-01-01');