很多数据库脚本的格式如下:
IF NOT EXISTS(SELECT * FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)
但是,我也见过人们这样做:
IF NOT EXISTS(SELECT CountryID FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)
甚至:
IF NOT EXISTS(SELECT 1 FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)
最后一个的优点可能是它更有效:查询实际上并没有使用子查询中的任何列,因此可能更快不能将它们中的任何一个带回来。但它看起来很奇怪,所以它让我觉得它可能让一些人感到困惑。它对实际执行时间有什么影响吗?
答案 0 :(得分:10)
我认为它回到了SQL Server的6.5到7期间,他们让查询优化器足够聪明,知道:
IF NOT EXISTS(SELECT * FROM Countries WHERE Name = 'France')
实际上不需要返回任何行数据。建议使用SELECT 1
作为神话的前提,但仍在继续作为一个神话。
可以说,这是SQL标准的错误 - 他们应该允许EXISTS
从FROM
子句开始,而根本没有SELECT
部分。
EXISTS引入的子查询的选择列表几乎总是由星号(*)组成。没有理由列出列名,因为您只是测试是否存在满足子查询中指定条件的行。
答案 1 :(得分:3)
没有, sql server足够智能,可以为您进行优化。
答案 2 :(得分:3)
没有。唯一重要的是返回行是否返回,这就是SELECT 1足够好的原因。