目录
JOIN关键字能让我们将多个表和/或视图中的数据组合到一个结果集中。它将一列或多列从一个表联结到另外一个表,计算它们是否匹配。
使用JOIN关键字,可以根据联结条件来联结两个表。大多数情况下,你会看到有一个联结条件来测试一个表中的一列和第二个表中的另外一列相比是否相等(相联结的列不需要有相同的名字,只需要有可兼容的数据类型)。
作为查询性能的最佳实践,尽量避免在JOIN子句中转换列的数据类型(例如使用CONVERT或CAST).最好是修改底层的架构来匹配数据类型(或者预先在单独的表、临时表、表变量或者公共表表达式( CTE)中进行数据转换)。在频繁执行的查询中进行隐式数据类型转换会引发明显的性能问题(例如,将nchar转换为char)。
SQL Server的联结类型有3种:内联结、外联结和交叉联结。
- 内联结使用INNliR JOIN关键字。INNER JOIN通过匹配两个表中共同的值进行操作。只有满足联结条件的行才会用来构建结果集。INNER JOIN是默认的JOIN类型,因此如果你喜欢,可以在INNER JOJN操作中仅使用JOIN关键字。
- 外联结有3种联结类型:LEFT OUTER、RIGHT OUTER和FULL OUTER联结。LEFT OUTER和RIGHT OUTER联结与INNER JOlhl相似,都是返回匹配联结条件的行。不过和INNER JOIN不同的是,LEFT OUTER JOIN返回联结对中第一个表不匹配的行,而RIGHT OUTER JOIN返回联结对中第二个表不匹配的行。FULL OUTERJOIN子句返回左表和右表都不匹配的行。
- 一个不常使用的联结类型是交叉联结CROSS JOIN。当没有使用WHERE子句的时候,一个CROSS JOIN返回一个笛卡尔积(cartersian product)。笛卡尔积根据左表中的行乘以右表中的行的每一种可能的组 合产生结果集。例如,如果Stores表有7行,Sales表有22行,那么在查询结果中你会获取154行(7乘22),显示出行的每一种可能的组合。
1.使用内联结
SELECT p.Name,s.DiscountPct
FROM Sales.SpecialOffer s
INNER JOIN Sales.SpecialOfferProduct o ON
s.SpecialOfferID=o.SpecialOfferID
INNER JOIN Production.Product p ON
o.ProductID=p.ProductID
WHERE p.Name='