连接 合并思想。N个表1个表 连接的定义 将2个或2个以上的表通过一定的条件拼接起来形成一个虚表的过程。连接是from子句的一部分。 从2个表的连接开始。 左表:放置在你左手边的表。lefttab 右表:放置在你右手边的表。righttab 连接语法1、连接类型 三种基本类型:交叉连接,内连接与外连接 交叉连接 返回的就是一个笛卡尔积。数学中A{1,2,3}B{4,5}AXB{1,4,1,5,2,4,2,5,3,4,3,5}数据库中表就是一个集合,每一行就是一个元素A表:a1a2111213B表:b1b2222324a1a2b1b2112211231124122212231224132213231324lefttab:mrowsxcolsrighttab:nrowsycolslefttabrighttab:mnrowsxycols 交叉连接语法 内连接 在交叉连接的基础上,仅返回满足连接条件的行。 连接条件 1。使用on关键字来指定。 2。on的用法与where类似。 3。on可以使用连接的所有表中的列值进行判断连接条件onA。a2B。b2tabname。colname交叉连接返回的结果a1a2b1b2112211231124122212231224132213231324内连接返回的结果a1a2b1b212221323 内连接的语法 外连接 在内连接的基础上,返回一些额外的行。 左外连接(左连接) 在内连接的基础上,左表除了返回满足连接条件的行之外,剩下的所有不满足连接条件的行也要一并返回,右表中与之没有匹配的行的列值设置为null连接条件onA。a2B。b2tabname。colname内连接返回的结果a1a2b1b212221323左外连接返回的结果a1a2b1b21222132311nullnull 右外连接(右连接) 在内连接的基础上,右表除了返回满足连接条件的行之外,剩下的所有不满足连接条件的行也要一并返回,左表中与之没有匹配的行的列值设置为null连接条件onA。a2B。b2tabname。colname内连接返回的结果a1a2b1b212221323右外连接返回的结果a1a2b1b212221323nullnull24 外连接语法查询示例SELECTFROMa;SELECTFROMb;SELECTFROMaCROSSJOINb;SELECTFROMaINNERJOINbONa。a2b。b2;SELECTFROMaLEFTOUTERJOINbONa。a2b。b2;SELECTFROMaRIGHTOUTERJOINbONa。a2b。b2;2、内连接应用 语法:哪些商品被用户购买过?思路1。确定表数据来源于哪些表中,或需要将哪些表结合起来查询SELECTFROMSELECTFROM2。确定连接条件找出左表与右表中有逻辑关系的列,将两个表中的列值进行比较来描述连接条件3。确定连接类型若仅返回满足连接条件的行则使用内连接;否则使用外连接SELECTDISTINCTecsgoods。goodsid,ecsgoods。goodsname,ecsgoods。shoppriceFROMecsgoodsINNERJOINecsordergoodsONecsgoods。goodsidecsordergoods。 表的别名selectlistfromtabnamealiasname。。。表名别名selectlistfromtabnameasaliasname。。。表名AS别名 注意:一旦给表设置了别名,则以后只能通过别名引用表中的列。别名会隐藏表名。SELECTDISTINCTg。goodsid,g。goodsname,g。shopprice此处不能写成ecsgoods。goodsidFROMecsgoodsASgINNERJOINecsordergoodsASogONg。goodsidog。此处不能写成ecsgoods。goodsid列出商品表中商品类型编号对应的类型名称SELECTFROMSELECTFROMSELECTg。goodsid,g。goodsname,gt。catname,shoppriceFROMecsgoodsASgINNERJOINecsgoodstypeASgtONg。goodstypegt。 join嵌套 可以在一个join中嵌套另外一个join 一般来说,当连接的表的个数N3时需要使用嵌套join。 当连接的表的个数为N时,则至少需要N1个连接条件。列出哪些用户购买了哪些商品,每一次购买该商品的花费是多少?SELECTFROMSELECTFROMSELECTFROMSELECTu。userid,u。username,og。orderid,og。goodsname,og。goodspriceog。goodsnumberamountFROM(ecsordergoodsogINNERJOINecsorderinfooiONog。orderidoi。orderid)INNERJOINecsusersuONoi。useridu。useridORDERBYu。userid,og。假设有三个表:t1,t2,t3(t1,t2),t3t1,(t2,t3)转换成连接语法的方法:将,改为连接类型,在右表(连接类型后的表)后加上连接的条件selectlistfrom(t1innerjoint2onjc1)innerjoint3onjc2;selectlistfromt1innerjoin(t1innerjoint3onjc1)onjc2;四个表:t1,t2,t3,t4((t1,t2),t3),t4(t1,t2),(t3,t4)t1,((t2,t3),t4)t1,(t2,(t3,t4))selectlistfrom((t1innerjoint2onjc1)innerjoint3onjc2)innerjoint4onjc3;3、外连接应用 语法:selectlistfromlefttableftrightouterjoinrighttabonjoincondition〔wherekeywordisnull〕过滤满足条件的数据,保留不满足条件的数据哪些商品没有被客户购买过?SELECTFROMSELECTFROMSELECTDISTINCTg。goodsid,g。goodsname,g。shopprice,og。goodsidFROMecsgoodsgLEFTOUTERJOINecsordergoodsogONg。goodsidog。goodsidWHEREog。goodsidISNULL;商品类型表中哪些商品类型没有出现在商品表中SELECTgt。FROMecsgoodsASgRIGHTOUTERJOINecsgoodstypeASgtONg。goodstypegt。catidWHEREg。goodstypeISNULL; join嵌套 与内连接中的join嵌套用法类似。找出没有购买过诺基亚E66商品的客户信息SELECTFROMSELECTFROMSELECTFROMSELECTu。userid,u。username,u。emailFROM(ecsordergoodsogINNERJOINecsorderinfooiONog。orderidoi。orderidANDog。goodsname诺基亚E66)RIGHTOUTERJOINecsusersuONoi。useridu。useridWHEREoi。useridISNULL;