高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL

这是一个新进阶系列的第一篇文章,我们将浏览Transact-SQL(T-SQL)的更多高级特性。这个进阶系列将会包含一系列的文章,它们会扩展你在之前的两个TSQL进阶系列所掌握的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。

原文地址:https://www.cnblogs.com/qianxingmu/p/11782361.html

时间: 2024-11-10 20:34:19

高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL的相关文章

翻译:Gregory Larsen,2016/02/19(第一版:2014年12月17日)高级T-SQL阶梯1级:使用CROSS JOIN介绍高级T-SQL

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/119933/ 原文作者:Gregory Larsen,2016/02/19(第一版:2014年12月17日) 系列 本文是"Stairway Series:Stairway to Advanced T-SQL"的一部分 这个阶梯将包含一系列文章,这些文章将在前面两个T-SQL阶梯,T-SQL DML和T-SQL超越基础知识的T-SQL基础上进行扩展. 这个楼梯应

高级T-SQL进阶系列 (一)【下篇】:使用 CROSS JOIN 介绍高级T-SQL

[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 性能考虑产生了笛卡尔积的这个CROSS JOIN操作符具有一些性能方面的问题需要考虑.因为SQL引擎需要将一个数据集的每一行与另一个数据集的每一行进行关联,其结果集合将会非常巨大.如果我将一个具有 1,000,000行数据的表与另一张具有 1,000,000行数据的表进行CROSS JOIN,那么我的结果集将会包含 1,000,000* 1,000,000行数据,也就是100,000,000,000行数据.这是一个非常巨大结果集

SQL进阶系列之7用SQL进行集合运算

写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL来支持 SQL的集合运算符提供了允许重复和不允许重复两种用法,UNION和INTERSECT结果里不会出现重复的行,UNION ALL则会保留重复行:ALL的作用和SELECT子句中的DISTINCT相反.ALL有助于优化查询性能,这是因为使用ALL后不再进行排序 注意事项2:集合运算符存在优先级

SQL进阶系列之8EXISTS谓词的用法

写在前面 支撑SQL和关系数据库的基础理论:数学领域的集合论和逻辑学标准体系的谓词逻辑 理论篇 什么是谓词?谓词是返回值为真值(true false unknown)的函数 关系数据库里,每一个行数据可以看作是一个命题 实体的阶层 0阶实体(单行) -- 1阶谓词( = between and) 1阶实体(行集合/表) -- 2阶谓词 (exists) 2阶实体(表的集合) -- 3阶谓词 1970被毙掉,目前数据库均以二阶谓词为基准 全称量化与存在量化 全称量词:所有的\(x\)都满足条件\(

SQL进阶系列之9用SQL处理数列

写在前面 关系模型的数据结构里,并没有顺序的概念,但SQL处理有序集合也有坚实的理论基础 生成连续编号 --生成连续编号 CREATE TABLE Digits (digit INTEGER PRIMARY KEY); INSERT INTO Digits VALUES (0); INSERT INTO Digits VALUES (1); INSERT INTO Digits VALUES (2); INSERT INTO Digits VALUES (3); INSERT INTO Digi

Sql的各种连接用法(cross join、inner join、full join)

1.名词解释: 笛卡尔乘积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积,又称直积,表示X x Y ,第一个对象是X的成员,而第二个对象       是Y的所有可能有序列的其中的一个成员.假设集合A={a,b},集合B={0,1, 2},则两个笛卡尔积为{(a,0),(a,1),(a,2),         (b,0),(b,1),(b,2)} 2.原址参考:http://ashui.net/archives/2013/552.html 1> 交叉连接CROSS JOIN SELECT *

Linq To Sql进阶系列(六)用object的动态查询与保存log篇

动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动态查询呢? 1,用object的查询是什么?我们可以简单的举这么一个例子.我们到公安局查找一个人.首先,我们会给出他的一些特征,比如,身高多少,年龄多少,性别,民族等.那么,我们把这个人的一些特征输入电脑.我们希望,电脑能给我们返回这个人的信息.而实际上,有相同特征的人太多了,常常返回一个集合.那让

《SQL必知必会(第4版)》中英文PDF及代码+《SQL进阶教程》中文PDF及代码 (学习总结)

下载:https://pan.baidu.com/s/1hRb-TS_R-0fnXPodS5OoDg <SQL必知必会(第4版)>高清中文PDF+高清英文PDF+代码 下载:https://pan.baidu.com/s/11-MnDu0khzwO4tiJqHznnA <SQL进阶教程>高清中文PDF+源代码 <SQL必知必会(第4版)>高清中文PDF+高清英文PDF+代码 高清中文PDF,258页,带书签目录,文字可以复制粘贴:高清英文PDF,497页,带书签目录,文

SQLSERVER表连接(INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN,CROSS JOIN,CROSS APPLY,OUTER APPLY)

1 常用表连接(inner join,left join,right join,full join,cross join) if object_id(N'table1',N'U') is not null drop table table1 if object_id(N'table2',N'U') is not null drop table table2 create table table1(id int,name varchar(20)) insert into table1 select