前言
本节开始我们进入联接学习,关于连接这一块涉及的内容比较多,我们一步一步循序渐进学习,简短内容,深入的理解。
交叉联接(CROSS JOIN)
交叉连接是最简单的联接类型。交叉联接仅执行一个逻辑查询处理阶段-笛卡尔乘积。例如对两个输入表进行操作,联接并生成两个表的笛卡尔乘积,也就是说,将一个表的每一行与另一个表的所有行进行匹配。所以,如果一个表有m行,另一个表有n行,得到的结果中则会有m*n行。我们就拿SQL Server 2012教程中的例子说下
SELECT C.custid, E.empid FROM Sales.Customers AS C CROSS JOIN HR.Employees AS E ORDER BY E.empid
在Sales.Customers表中有91行数据,HR.Employees表中有9行数据,则利用交叉联接数据则有819(91*9)行数据,简略数据如下。
交叉联接我们可以用如下图表示
交叉联接最大的用途在于生成数字表以便我们用于其他目的,我们一起来看看。
IF OBJECT_ID('dbo.Digits','U') IS NOT NULL DROP TABLE dbo.Digits; CREATE TABLE dbo.Digits ( digit INT NOT NULL );
插入10条基础数据
USE TSQL2012 GO INSERT INTO dbo.Digits ( digit ) VALUES ( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 )
创建数字表
USE TSQL2012 GO CREATE TABLE Nums ( n INT NOT NULL PRIMARY KEY );
利用交叉联接在数字表中插入100万条数据
USE TSQL2012 GO INSERT INTO dbo.Nums(n) SELECT D6.digit * 100000 + D5.digit * 10000 + D4.digit * 1000 + D3.digit * 100 + D2.digit * 10 + D1.digit + 1 AS n FROM dbo.Digits AS D1 CROSS JOIN dbo.Digits AS D2 CROSS JOIN dbo.Digits AS D3 CROSS JOIN dbo.Digits AS D4 CROSS JOIN dbo.Digits AS D5 CROSS JOIN dbo.Digits AS D6 ORDER BY n
内部联接(INNER JOIN)
内部联接用法如下
SELECT * FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.Id = t2.Id
内部联接返回表中更多数据
我们首先给出如下三个测试表
USE TSQL2012 GO CREATE TABLE FirstTable (Col1 INT) CREATE TABLE SecondTable (Col1 INT) CREATE TABLE ThirdTable (Col1 INT) GO INSERT INTO FirstTable (Col1) VALUES (1), (2), (3), (NULL) GO INSERT INTO SecondTable (Col1) VALUES (1), (2), (3), (NULL) GO INSERT INTO ThirdTable (Col1) VALUES (2), (2), (2), (2), (2), (NULL) GO
(1)等值条件查询
SELECT f.Col1 fCol1 FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 = f.col1 GO
(2)非等值条件查询
USE TSQL2012 GO SELECT f.Col1 fCol1 FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 <> f.col1 GO
上述我们同样可以利用交叉连接实现同样效果
USE TSQL2012 GO SELECT f.Col1 fCol1 FROM FirstTable AS f CROSS JOIN SecondTable AS s where s.Col1 <> f.col1 GO
(3)查询非重复行(NON-DISTINCT)
我们在创建第三个测试表时,插入的数据是5个2,而在第一个表中插入的数据分别是1、2、3,此时我们利用等值联接得到的结果到底是1个2,还是5个2呢?
USE TSQL2012 GO SELECT f.Col1 fCol1 FROM FirstTable f INNER JOIN ThirdTable s ON s.Col1 = f.col1 GO
我们得到的结果是5个2,为什么利用内部联接也就是说利用的等值条件不是返回1个2呢,其实我们可以总结如下:
结论:利用内部联接比实际表中返回更多数据的原因在于,内部联接返回的结果集是基于查询条件中的JOIN,若有多行满足条件则返回多条数据。
内部联接安全性
在两个表利用等值条件查询时,我们有两种写法。
ANSI SQL-92写法
USE TSQL2012 GO SELECT * FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD ON SOD.orderid = SO.orderid
ANSI SQL-89写法
USE TSQL2012 GO SELECT * FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD WHERE SOD.orderid = SO.orderid
虽然这两种写法都可以,都能满足需求,但是SQL Server 2012基础教程强烈建议使用ANSI SQL-92写法,为什么呢,因为用ANSI SQL-89写法时若出现错误,此时解析根本不会生成错误,而对于ANSI SQL-92写法则会,下面我们一起来看下ANSI SQL-89写法的问题
USE TSQL2012 GO SELECT COUNT(*) AS '利用等值条件查询总数据行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD WHERE SOD.orderid = SO.orderid
上面是我们利用正确的写法得到的正确的总数据行为2155条,下面我们看看有问题的写法
SELECT COUNT(*) AS '利用等值条件查询总数据行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD
此时我们没有给出WHERE条件,而解析未出现错误,当然返回的结果集也就是错误的。当我们利用ANSI SQL-92写法时,我们同样也未给出比较条件,如下
USE TSQL2012 GO SELECT * FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD;
此时会出现解析错误,也就是无法再继续查询,自然也就得不到错误的结果。
结论:强烈推荐使用ANSI SQL-92写法,这样一来使得数据不会出现不一致性,同时可读性和可维护性比ANSI SQL-89写法强。
总结
本节我们讲了交叉联接和内部联接,同时也给出了使用需要注意的地方,本节到此结束,我们下节再讲讲自联接和外部联接。简短的内容,深入的理解,我们下节再会,good night。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多支持!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】