这是一个新进阶系列的第一篇文章, 我们将浏览 Transact-SQL(T-SQL) 的更多高级特性. 这个进阶系列将会包含一系列的文章, 它们会扩展你在之前的两个 TSQL 进阶系列所掌握的 TSQL 的基础.
TSQL DML 进阶
TSQL 进阶: 超越基础
本系列 "高级 Transact-SQL" 将会包含如下 T-SQL 主题:
使用 CROSS JOIN 操作符
使用 APPLY 操作符
理解通用表表达式 (CTE's)
使用 TSQL 游标的记录级别处理
使用 UNPIVOT 实现列转行
使用排序函数对数据进行排序
使用相关函数来操作日期和时间
理解 OVER 子句的变量
本进阶的读者应该已经很好的理解了如何从数据库表进行查询, 更改, 插入, 删除数据. 此外他们应该具有实际的工作经验用以控制 TSQL 代码的执行流, 以及能够测试和操作数据.
本进阶应该可以帮助读者准备通过微软认证考试 70-461: 查询 SQL SERVER 2012.
对于本进阶系列的第一部分, 我们将讨论一下 CROSS JOIN 操作符.
介绍 CROSS JOIN 操作符
CROSS JOIN 操作符可以用来将一个数据集的所有记录和另一个数据集的所有数据进行比较. 通过在两个数据集之间使用 CROSS JOIN 操作符, 你便创建了成为笛卡尔积的东西.
这儿有一个简单的示例, 其使用 CROSS JOIN 操作符来连接两张表 A 和 B:
SELECT * FROM A CROSS JOIN B
注意当使用 CROSS JOIN 操作符时, 没有像你使用 INNER,OUTER JOIN 那样, 有一个 JOIN 子句来连接两张表.
你应该意识到使用 CROSS JOIN 操作符会产生很大的数据集合. 为了浏览这种行为让我们看看两个不同的示例, 看看从一个 CROSS JOIN 产生的数据集会多么的巨大. 对于第一个示例我们假设你会交叉连接两个表, 其中表 A 具有 10 行而表 B 具有 3 行, 那么结果集合便会具有 10*3 行或者说是 30 行. 对于第二个示例我们假定表 A 具有 1000 万条数据而表 B 具有 300 万条数据. 那么表 A 和表 B 的 CROSS JOIN 产生的结果集会有多少条数据呢? 那会产生高达 30,000,000,000,000 条数据. 那是许多行并且它会占用 SQL SERVER 大量的时间和资源来创建结果集. 因此当在大的记录集合上使用 CROSS JOIN 操作符时, 你需要特别小心.
让我们通过几个示例来更近一点查看 CROSS JOIN 操作符.
使用 CROSS JOIN 操作符的基本示例
对于第一组示例我们将连接连个示例表. 列表 1 的代码用来创建这两个示例表. 确保你在一个用户数据库上执行此脚本而不是在 master 库上.
- CREATE TABLE Product (ID int,
- ProductName varchar(100),
- Cost money);
- CREATE TABLE SalesItem (ID int,
- SalesDate datetime,
- ProductID int,
- Qty int,
- TotalSalesAmt money);
- INSERT INTO Product
- VALUES (1,'Widget',21.99),
- (2,'Thingamajig',5.38),
- (3,'Watchamacallit',1.96);
- INSERT INTO SalesItem
- VALUES (1,'2014-10-1',1,1,21.99),
- (2,'2014-10-2',3,1,1.96),
- (3,'2014-10-3',3,10,19.60),
- (4,'2014-10-3',1,2,43.98),
- (5,'2014-10-3',1,2,43.98);
列表 1 CROSS JOIN 的测试表
对于第一个 CROSS JOIN 示例, 我们将运行列表 2 的代码.
- SELECT * FROM
- Product CROSS JOIN SalesItem;
列表 2: 简单的 CROSS JOIN 示例
当我们在 SSMS 窗口运行列表 2 的代码时, 在我的结果窗口我们得到了报告 1 的输出:
- ID ProductName Cost ID SalesDate ProductID Qty TotalSalesAmt
- --- --------------------- -------- ---- ----------------------- --------- ---- ---------------
- 1 Widget 21.99 1 2014-10-01 00:00:00.000 1 1 21.99
- 1 Widget 21.99 2 2014-10-02 00:00:00.000 3 1 1.96
- 1 Widget 21.99 3 2014-10-03 00:00:00.000 3 10 19.60
- 1 Widget 21.99 4 2014-10-03 00:00:00.000 1 2 43.98
- 1 Widget 21.99 5 2014-10-03 00:00:00.000 1 2 43.98
- 2 Thingamajig 5.38 1 2014-10-01 00:00:00.000 1 1 21.99
- 2 Thingamajig 5.38 2 2014-10-02 00:00:00.000 3 1 1.96
- 2 Thingamajig 5.38 3 2014-10-03 00:00:00.000 3 10 19.60
- 2 Thingamajig 5.38 4 2014-10-03 00:00:00.000 1 2 43.98
- 2 Thingamajig 5.38 5 2014-10-03 00:00:00.000 1 2 43.98
- 3 Watchamacallit 1.96 1 2014-10-01 00:00:00.000 1 1 21.99
- 3 Watchamacallit 1.96 2 2014-10-02 00:00:00.000 3 1 1.96
- 3 Watchamacallit 1.96 3 2014-10-03 00:00:00.000 3 10 19.60
- 3 Watchamacallit 1.96 4 2014-10-03 00:00:00.000 1 2 43.98
- 3 Watchamacallit 1.96 5 2014-10-03 00:00:00.000 1 2 43.98
报告 1: 当运行列表 2 的结果
如果你查看报告 1 的结果你将会发现会有 15 条不同的记录. 前 5 条记录包含了列值, 是从 Product 表的第一行与 SalesItem 表的 5 条不同的记录进行连接. 同样对于 Product 表的第二行与第三行也是如此. 最终返回的总行数是 Product 表的行数乘以 SalesItem 表的行数, 也就是 15.
来源: http://www.bubuko.com/infodetail-3269485.html