EXISTS、EXCEPT、INTERSECT 运算符

时间:2023-03-08 18:00:09

转:http://www.cnblogs.com/WizardWu/archive/2011/10/01/2197147.html

EXISTS运算符

  EXISTS 可称之为运算符,有些书称它为关键词。 EXISTS 和 IN 关键词很类似,但仍有些不同,EXISTS 使用时不会返回数据,而是返回简单的 TRUE / FALSE。如下示例,即使子查询返回 NULL,用 EXISTS 也会得到 TRUE:

SELECT DepartmentID, Name
FROM HumanResources.Department
WHERE EXISTS (SELECT NULL)

EXISTS和JOIN比较

  两个示例虽然结果相同,但 EXISTS 的性能会较好 (书上说的)。当我们使用 EXISTS 关键词时,SQL Server 不会用 full row-by-row join,而是在记录当中搜寻,当它找到第一个符合条件的记录时,就会立即停止后续搜寻的动作,并标示为 TRUE,表示不需要再往下找了;反观 inner join 则不会有此种标示的动作。

  此外,NOT EXISTS 也有此种标示的功能。当 NOT EXISTS 找到符合条件的数据时,同样也会标示,但标示为 FALSE,表示不需要再往下找了。

  Join写法:

SELECT  e.BusinessEntityID,  FirstName,  LastName
FROM HumanResources.Employee e
JOIN Person.Person pp ON e.BusinessEntityID = pp.BusinessEntityID
JOIN HumanResources.JobCandidate jc ON e.BusinessEntityID = jc.BusinessEntityID

  Existis写法:

SELECT  e.BusinessEntityID,  FirstName,  LastName
FROM HumanResources.Employee e
JOIN Person.Person pp ON e.BusinessEntityID = pp.BusinessEntityID
WHERE EXISTS
(
SELECT BusinessEntityID
FROM HumanResources.JobCandidate jc
WHERE e.BusinessEntityID = jc.BusinessEntityID
)

检查对象是否存在

  第一次执行此语句时,若没有 DBCreateTest 数据库,则创建它;第二次执行时,由于该数据库已存在,因此会印出自定义的提示信息。

IF NOT EXISTS (SELECT 'True' FROM sys.databases WHERE name = 'DBCreateTest')
BEGIN
CREATE DATABASE DBCreateTest
END
ELSE
BEGIN
PRINT '此数据库已经存在。跳过了 CREATE DATABASE 语句'
END
GO