SqlServer2008实例07从多个数据源查询

 

目录

1.使用内联结

2.使用外联结

3.使用交叉联结

4.在同一查询中多次引用同一个表

5.使用衍生表

6.使用UNION组合结果集


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='All-Purpose Bike Stand'

    一旦在查询中使用了多个表,知道各列属于哪个数据源非常重要。如果在两个不同的表中存在同样的列名,SQL编译器会给出一个错误,要求你明确哪个列是你希望返回的。
    只要列名在查询中指定,最好使用别名。对于每一个引用的表,每个表名都使用字符来代替——让你不用为每次都拼写表名而烦恼。这个查询使用了一个字符作为表别名,但你可以使用任何有效的标识符。表别名不仅能让你缩短或明确原始表名,而且如果你希望使用其他的表或视图名替代它或者需要自联结表,你可以换掉基表名。表别名是可选的,但是如果查询超过1个表则推
荐使用别名。表别名跟在FROM子句中表名的后面。由于表别名是可选的,因此也可以在每次引用表中的列时指定整个表名。

    INNER JOIN是基于两个列的相等性,一列来自第一个表,另外一列来自第三个表。

2.使用外联结

   第一个查询使用Person.StateProvince表和Sales.SalesTaxRate表显示税率状态和省。下面的查询使用INNER JOIN:

use adventureworks
go

SELECT s.CountryRegionCode,s.StateProvinceCode,t.TaxType,t.TaxRate
FROM Person.StateProvince s
INNER JOIN Sales.SalesTaxRate t ON
           s.StateProvinceID=t.StateProvinceID

    使用INNER JOIN,只能看到那些在Sales .SalesTaxRate表中有行的Person .StateProvince表中的数据。要查看Person.StateProvince表中的所有行,而不去管它是否有关联的税率,可以使用LEFT OUTER JOIN:

use adventureworks
go

SELECT s.CountryRegionCode,s.StateProvinceCode,t.TaxType,t.TaxRate
FROM Person.StateProvince s
LEFT OUTER JOIN Sales.SalesTaxRate t ON
                s.StateProvinceID=t.StateProvinceID

3.使用交叉联结

use adventureworks
go

SELECT s.CountryRegionCode,s.StateProvinceCode,t.TaxType,t.TaxRate
FROM Person.StateProvince s
CROSS JOIN Sales.SalesTaxRate t

4.在同一查询中多次引用同一个表

    有时可能会需要将同一个表作为两个独立的表来使用。这可能是因为表中包含嵌套层次的数据(例如,表中包含将管理员ID作为外键的职员记录,而这个管理员ID是引用到职员ID的),或者可能你希望在不同时间段引用同一个表(比较2007年和2008年的销售记录)。
    可以通过使用表别名来完成表的自联结。
    示例中,在FROM子句中引用了两次Sales .SalesPersonQuotaHistory表,一个引用了2004年的销售定额数据,另一个引用了2003年的销售定额数据:

SELECT s.SalesPersonID,
       SUM(s2004.SalesQuota) Total_2004_SQ,
       SUM(s2003.SalesQuota) Total_2003_SQ
FROM Sales.SalesPerson s
LEFT OUTER JOIN Sales.SalesPersonQuotaHistory s2004 ON
				s.SalesPersonID=s2004.SalesPersonID AND
				YEAR(s2004.QuotaDate)=2004
LEFT OUTER JOIN Sales.SalesPersonQuotaHistory s2003 ON
				s.SalesPersonID=s2003.SalesPersonID AND
				YEAR(s2003.QuotaDate)=2003
GROUP BY s.SalesPersonID

5.使用衍生表

    衍生表是在FROM子句中作为表的SELECT语句。衍生表有些时候可以提供比临时表更好的性能。不像临时表,衍生表不需要预先填充固定数据。
 

use adventureworks
go

SELECT DISTINCT s.PurchaseOrderNumber
FROM Sales.SalesOrderHeader s
INNER JOIN (SELECT salesOrderID
            FROM Sales.SalesOrderDetail
            WHERE UnitPrice BETWEEN 1000 AND 2000) d ON
     s.SalesOrderID=d.SalesOrderID

    这个查询使用lNNER JOIN将表联结到一个衍生表。衍生表查询包含在括号中,且后面跟着一个表别名。衍生表本身也是一个查询,并且不需要使用临时表来保存结果。因为消除了SQL Server在使用前创建和分配临时表所需要的步骤,所以使用衍生表的查询有时比临时表性能好很多。

6.使用UNION组合结果集

    使用UNION运算符可以追加两个或多个SELECT语句的结果到一个结果集中。每一个合并的SELECT语句必须有相同数量的列,列次序相同并且有相同的或可兼容的数据类型:

use adventureworks
go

SELECT salespersonID,GETDATE() QuotaDate,SalesQuota
FROM Sales.SalesPerson
WHERE SalesQuota>0
UNION
SELECT SalesPersonID,QuotaDate,SalesQuota
FROM Sales.SalesPersonQuotaHistory
WHERE SalesQuota>0
ORDER BY SalesPersonID DESC,QuotaDate DESC

    默认情况下使用UNION运算符会移除所有重复行,并且基于第一个结果集显示列名。对于大结果集来说,这可能会是一个相当耗费资源的操作,所以如果你不需要去除重复数据或者数据本身就是不重复的话,可以在UNION巾使用ALL关键字:
    UNION AII
    加了ALL子句之后,重复的行将不会被移除。
 

展开阅读全文

Windows版YOLOv4目标检测实战:训练自己的数据集

04-26
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值