开发工具:
文件大小: 712kb
下载次数: 0
上传时间: 2019-07-02
详细说明:在关系型数据库中,join操作是将不同的表中的数据联合在一起时非常通用的一种做法。首 先让我们看看join是如何操作的,然后我们探索一下当join和where语句同时存在的时候的 执行顺序问题,最后来谈一谈不同类型的join的顺序问题。New Table join Table trans
Result of First Join
IDD Some TransCol
A id Sample Column1 B ld Sample Col2
Transaction 1
AA
RRR
23 Transaction 2
2
BBB
2 SSS
33Transaction 3
3 Transaction 4
5」1 Transaction5
Tab1eT¥ ans a3 C。nB.id=c.Idd
id Sample Column1 B_ld Sample Col2 Some Trans Col
AAA
1
RRR
Transaction 1
RRR
Transaction 5
Final Result
6、join类型
在两张不同的表做连接有3中join类型。
1、 full join
2、 inner Join
3, outer join (left outer join, right outer join)
在上面两个例了中我们看到的是 Inner Join。如果我们连接表自身就叫做 self joinε这个
特殊类型不会混淆连接类型
7、fu1 l join
full join和笛卡尔有些不同,笛卡尔积会获取所有可能的结果。而fu11join将匹配的结果
与所有左边的表中不匹配右边的行和右边的表中所有不匹配左边的行加在起,在不匹配的
地方使用M代替。结果行数-匹配行数-左表剩余行数+右表剩余行数
SYSTEM. North.QLQuery1sql Summary
Select from Table c
田Ress|Ms98
Id Some Col3
LLL
24 KKK
SYSTEM.North.QLQuery1 sql*Summary
Select A Id, A. SampleColumnl, C id, C. Some Col3
From Table A as A Full Join table c as c on a. Id=cId
国 Results Ea Messa
ld Sample Column1 idSomeCol3
VAA
LLL
BBB
NULL NULL
3NULLNULL
KKK
在上面的图片中,蓝色的行是两个表匹配的行。
第二行,左边绿色,右边红色的是不匹配的,左表中的行是存在的,而右表中的字段则被
nul1填充
第三行,左边红色,右边绿色的同样是不匹配的,右表中的行是存在的,而左表中的字段则
被nul1填充。
8、1 eft join
左连接( left join)保证左表屮的所有行都有,而当不匹配的时候以NULL填充右表字段。
SYSTEM.North.QLQuery1sql"Summary
Select A Id, A. SampleColumnl, C, id, c. some Col3
From Table a as 2 left Join table c as c on a id c. id
田 Results| Messages
ld sample Column1 idSomeCol3
AAA
LLL
22 BBB
NULLNULL
蓝色匹配,红色和绿色个匹配
9、 right join
反过来,右连接( right join)保证右表中所有的行都有,而当不匹配的时候以NUL填充左
表字段
SYSTEM. North.QLQuery1 sql*Summary
Select A Id, A. sampleColumn1, B id, B. sampleCol2
E。 m Table A as a Right oin tak1eBa3onA.a=B.工o
国Ress|Meae
ld Sample Column1 id SampleCol2
AAA
1 RRR
22
BBB
3NULL NULL
3PPP
蓝色匹配,红色和绿色不匹配
10、 inner Join
Inner Joln就是只列出匹配的行
l1、 self join
表连接自身叫做 self join。为了解释一下这个让我们看如下图屮的 employee表。
Employee ll是此表的主键, Repor tsTo引用了此表的主键。我们可以想象成这样, ReportTo
字段引用代表该雇员的上司,其上司同样也是雇员。
日 U Northwind
+ D Database Diagrams
日 Tables
D System Tables
dbo Categories
+l dbo. CustomerCustomerDemo
dbo Customer Demographics
a0o. customers
国 dbo. Employees
Columns
I EmployeeID(PK, int, not null)
A LastName (nvarchar (20), not nu
a FirstName(nvarchar(10), not null)
国 Title(nvarchar(30),nu
A Titleofcourtesy (nvarchar(25), null)
目 BirthDate( datetime,nu
References
目 HireDate( datetime,ru
A Address(nvarchar(60), null)
目at( archar(15),nu
a Region(nvarchar( 15), null)
a PostalCode(nvarchar(10), null)
a Country (nvarchar(15), null
A Home Phone(nvarchar(24), null)
A Extension(nvarchar(4), null)
目 Photo(mage,nu
目
ReportsTo(FK, int, null)
看如下例子
里,有 ReportTo指向的行是 Manager,所以 employee是左表, Manager是右表
12、执行顺序
连接中有 where语句的时候我们需要注意连接和 where的执行顺序问题。
1、将 where语句先于join执行,因为执行完 where查询的结果将会比较少,从而join操作性
能会提升。
2、将 where语句后与join执行
以上两者将在 Inner JoIn的时候返回同样的结果,但是当使用 outer join的时候全少有一种
连接操作的返回结果不同。看下面例子。
SYSTEM. North..QLQuery1 sql*,Summary
Select bid, b. SampleCol2, tidd, t. someTranscol
from Table 3 b left oin taole trang t on b, id=t,lda
where t. sometranscol
I Transaction 4
E Resutts Ea Messages
id SampleCol2 idd Some TransCol when outer join exists performs
PPP
3 Transaction 4 join first, then applied where
filter
Applying the where Clause First
Transaction 4
Making the Join Next
RR
NULL
123
SS
NULL
PP
Transaction 4
Result
Making the Join First
RR
Transac tion 1
113
RR
Transac tion 5
PP
Transaction 2
PP
Transac tion 3
15333
PP
Transac tion 4
2 SS
Null
Null
Applying the Where Clause Next
3
PP
Transaction 4
3
Result
所以记住当外连接的时候尽量先执行join操作然后执行 where语句。
13、连接的顺序
当你想将 Inner Join和 outer Joln同时使用的时候join的顺序也是非常重要的
什么是连接的顺序?如果我像这样连接三张表【 x inner y】 left z,顺序就是先iner
join再 left join
让我们回到上面的例子中,你想得到的结果是获取所有客户的名字,不管他们是否有订单。
如果他们确实有一些订单,还要列出了客户订购的数量
看如下的查询【先 outer join再 Inner Join】
SYSTEM.North.QLQuery1. ql* Summary
select c customerId, C ContactName,
O OrderId, o orderDate,
OD Quantity
from ( Orders o Right Join Customers C
On C CustomerId =0. CustomerID) Inner Join [Order Details oD
on o OrderId= oD OrderID
Order by Customerid;
国Re
Messages
customed Contact Name Orderld OrderDate
Quantity
2139 WILMK Matti Karttu.1091019980226000005
210WoL2A2 yszek Pi.1090519902200015
2141 WOLZA Zbyszek Pi..1087019980204000003
12142 WOLZA2 yszek Pi.10971990240002
2143 WoLza Zbyszek Pi..107921997-1223000010
214440242%2k.107921991221
24WoL2A2sekF.10792199120
2146WoL2A2ek.109919303012
2147 WOLZA Zbyszek.1099190403000007
2148 WOLZA Zbyszek Pi.1099199403000020
2149 WOLZA Zbyszek P.1099819904030000030
2150
WOLZ
Zbyszek P1.110441998042300:00:000012
2151
WOLZ
Zbyszek P1.1061119970725000:00006
252WoL2 A Zbyszek Pi.105111997072000000
2153WoL2A2bekP.10611197050001
2154 WOLZA Zbyszek Pi.10374199-1205000000030
2155 WOLZA Zbyszek Pi.103741996-120500:000.0015
1、在 Orders和 Customers中进行了 right join。石连接能保证你获取所有 Customer的信息,
不管他是否有 order
2、现在上面的结果将和 Order details连接。但是我们需要注意的是,在右连接的结果中有
两行 roderid为nu1的,因为这两个 customer并没有任何 order,而在后面做 inner Join的时
侯,由于 orderid为null, inner Join将跳过这两行,从而导致这两个 cus tomer的信息被过
滤掉了
再让我们看看下面的这个查询【先 Inner Join再 outer join】
SYSTEM. North. QLQuery1 sql*Summary
Select C customerId, c ContactName
O orderId, 0. orderDate
OD Quantity
from (Orders o inner join [Order Details] OD
On o orderId= oD OrderID) Right doin Customers C
On C CustomerId=o, customerId
Order by CustomerId;
田Rets| Messages
customer Contact Name
L Ordered OrderDate
Quantity
2154WoL2 A Zbyszek Piestrzeni..1061119970725000:0.010
2155 WOLZA Zbyszek Piestrzeni.10611 1997-07-2500: 0.0015
2156 WOLZA Zbyszek Piestrzeni.10374 1996-12-05000:00:0000030
2157WOLZA Zbyszek Piestrzeni. 10374 1996-12-0500:00:00.00015
Just by changing the Join orders we got these two records now
PARIS
Marie Bertra. NULL NULL
NULL
FISSA
Diego Roel NULL NULL
NULL
让我们分析一下为什么这才是我们想要的结果
首先 Order和 Order details表做 Inner Join,所有匹配的结果都将被列出来,然后将此结果
作为左表, Cus tomer表作为右表,右表的所有行都将被列出来,不管其匹配与否(言外之
意,那两个没有 order的 cus tomer也将被列出来)。
所以,在我们同时使用 Inner Join和 outer Join的时候一定要对连接的顺序做慎重考虑。
14、获取同样数据的其他办法
看如下查询
SYSTEM. North..QLQuery1 sql* Summary
select C customerId, c. contactNarme,
0. OrderId, o. OrderDater
OD Quantity
from Customers C Left Join(Orders o inner join [Order Details] OD
on o orderId = oD, OrderId)
On o. Customexla= c. customerla
Order by CustomerId;
国Rete| Messages
customer Contact Name Ordered OrderDate
Quantity
2154
NOLZA
Zbyszek Pi1061119970725000:0000010
2155
Zbyszek Pi.1061119970725000015
2156
WOLZA Zbyszek Pi.10374 1996-12-05 00: 0: 0.0030
2157
WOLZA
Zbyszek P..1037419961205000000015
1、首先查询出 Customers将其作为左表
2、然后将 Orders表查询出来,仍然作为左表
3、然后查询出 Order details表将其作为右表与 Orders表进行 InncrJoIn
4、最后 Customers表将于第三步查询出的结果进行左连接。别忘了左连接将保证 Customers
表不丢失任何记录。
0 CHina. n原创翻译/原文舴接
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.