title: Why does EXCEPT exist in T-SQL?
body: <p>I was just reading about EXCEPT and INTERSECT in the MSDN Library and came across this example of how to use INTERSECT: </p>
  
  <pre><code>USE AdventureWorks2008R2 GO 
  SELECT ProductID 
  FROM Production.Product
  INTERSECT
  SELECT ProductID 
  FROM Production.WorkOrder ;
  --Result: 238 Rows (products that have work orders)
  </code></pre>
  
  <p>Maybe I'm old-fashioned, but I typically would use the following code to achieve the same result:</p>
  
  <pre><code>SELECT P.ProductID 
  FROM Production.Product P 
  INNER JOIN Production.WorkOrder W ON W.ProductID = P.ProductID
  </code></pre>
  
  <p>Am I missing something, or is INTERSECT the same as INNER JOIN?  Is there a performance benefit to using one over the other?  </p>
  
  <p>Same question for EXCEPT.  How is this: </p>
  
  <pre><code>USE AdventureWorks2008R2;
  GO
  SELECT ProductID 
  FROM Production.Product
  EXCEPT
  SELECT ProductID 
  FROM Production.WorkOrder ;
  --Result: 266 Rows (products without work orders)
  </code></pre>
  
  <p>different from this:</p>
  
  <pre><code>SELECT P.ProductID 
  FROM Production.Product P 
  LEFT JOIN Production.WorkOrder W ON W.ProductID = P.ProductID
  WHERE W.ProductID IS NULL
  </code></pre>
  
  <p>?</p>