SQL基本联接类型

CROSS
    交叉联接对两个表执行笛卡尔积。也就是说,它为左表行和右表行的每种可能的组合返回一行。如果左表有n行,右表有m行,则交叉联接将返回一个包含n×m行的表。
SELECT e.EmployeeID, d.Name AS Department
FROM HumanResources.Employee e
CROSS JOIN HumanResources.Department d

    对于交叉联接,我们更偏爱使用逗号(不使用CROSS JOIN关键字),这样代码会更短。由于优化器将为这两种语法生成相同的计划,因此你不必担心它的性能。
SELECT e.EmployeeID, d.Name AS Department
FROM HumanResources.Employee e, HumanResources.Department d


INNER
    内部联接用于按一些标准匹配两个表中的行。在查询的前3个逻辑处理阶段中,内部联接应用其中的前两个阶段。即,笛卡尔积和ON筛选器。没有添加外部行的阶段。因此,如果INNER JOIN查询包含了ON子句和WHERE子句,逻辑上它们会依次应用。除了有一个例外之外,在INNER JOIN的ON子句中或WHERE子句中指定逻辑表达式没有任何区别,因为这两个步骤中没有添加外部行这一步
SELECT *
FROM HumanResources.Employee AS e
    
INNER JOIN Person.Contact AS c
    
ON e.ContactID = c.ContactID

    此内部联接称为同等联接。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。


OUTER
    外部联接用于按一些条件匹配两个表中的行,并添加保留表中未找到匹配的行。
    仅当两个表中都至少有一个行符合联接条件时,内部联接才返回行。内部联接消除了与另一个表中的行不匹配的行。而外部联接会返回 FROM 子句中提到的至少一个表或视图中的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左外部联接引用的左表中的所有行,以及通过右外部联接引用的右表中的所有行。在完全外部联接中,将返回两个表的所有行。
    可以用LEFT、RIGHT、或FULL关键字指定保留表。LEFT把左表标记为保留表,RIGHT把右表标记为保留表,FULL把这两表都标记为保留表。

LEFT OUTER JOIN 或 LEFT JOIN
    左外部联接运算符 LEFT OUTER JOIN 指明:不管第二个表中是否有匹配的数据,结果中都将包括第一个表中的所有行。
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID

 
RIGHT OUTER JOIN 或 RIGHT JOIN
    右外部联接运算符 RIGHT OUTER JOIN 指明:不管第一个表中是否有匹配的数据,结果中都将包括第二个表中的所有行。

SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st 
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID 


FULL OUTER JOIN 或 FULL JOIN
    若要通过在联接的结果中包括不匹配的行来保留不匹配信息,请使用完全外部联接。SQL Server 提供了完全外部联接运算符 FULL OUTER JOIN,它将包括两个表中的所有行,不论另一个表中是否有匹配的值。

SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL
OR sod.ProductID IS NULL



 

posted @ 2008-06-09 15:10  ajayumi  阅读(239)  评论(0)    收藏  举报