您好,欢迎光临本网站![请登录][注册会员]  
文件名称: SQL中不同类型的表连接
  所属分类: MySQL
  开发工具:
  文件大小: 712kb
  下载次数: 0
  上传时间: 2019-07-02
  提 供 者: aba****
 详细说明:在关系型数据库中,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最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: