欢迎来到天天文库
浏览记录
ID:37976572
大小:127.46 KB
页数:4页
时间:2019-06-04
《[原创]多表连接(join)小结》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、[原创]多表连接(join)小结参考:《sql查询初学者指南》第二版,机械工业出版社基础内链接就是对表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on语句后边的限制条件的条目。左连接就是在内连接的基础上,将A中有但C中没有的元组也加上。由于C的列数比A的列数多,所以这新增的元组左边照搬a,右边为null。右链接就是在内连接的基础上,将B中有但C中没有的元组也加上。由于C的列数比B的列数多,所以这新增的元组右边照搬B,左边为null。所谓的fulljoin,就是在join的结果d后边先加上lef
2、tjoin要加的项,再加上rightjoin要加的项所谓的交叉连接(select*fromtableName1crossjointableName2)和select*fromtableName1,tableName2是一样的,都是得到笛卡尔积。可以用select*fromtable1,table2where....模拟join操作。所谓的自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。直接写join就是内连接,相当于innerjo
3、in,inner可省写leftjoin或者rightjoin就是外连接,outer可省 例子有两表A和BAB下面是一些select操作select*fromAcrossjoinAselect*fromAjoinBonA.name=B.name就是对笛卡尔积,也即上边的crossjoin的结果进行进一步筛选,选出满足A.name=B.name的行。只有两行符合条件在上衣select语句的基础上增加了一行select*fromAleftjoinBonA.name=B.name同上select*fromArightjoinB
4、onA.name=B.nameselect*fromAfulljoinBonA.name=B.name进阶重要理论依据:在可以指定一个表名的任何地方,都可以指定一个括号括起来的join子句。在两个表的一个完整join语句出现的任何一个地方,我们都可以只用一个表名来代替它。 所谓“两个表的一个完整join语句”也即“join子句”,就是指如“AjoinBonA.a=B.b”这样一个完整的句子比如:欲连接ABCDE五个表可以这样:Select*fromAinnerjoin(((BinnerjoinConB.b=C.c)in
5、nerjoinDonB.b=D.d)innerjoinEonD.d=E.e)onA.a=E.e也可以这样:select*from(((AinnerjoinBonA.a=B.b)innerjoinConC.c=A.a)innerjoinDonD.d=C.c)innerjoinEonE.e=D.d也可以这样:select*fromAinnerjoinBonA.a=B.binnerjoinConC.c=A.ainnerjoinDonD.d=C.cinnerjoinEonE.e=D.d我们可以先把A和B连接起来,然后将结果与C
6、连接,当然,如果C只和B相关而不和A相关的话,我们也可以先把B和C连接起来,结果再与A连接,只要保持关系是正确的,你可以以任意方式来定义嵌套的join。然而大多数数据库系统会分析整个from子句,然后尝试确定组合连接表的最有效方式,也就是说数据库不不一定会从最里边的括号开始执行查询。这很可能打乱你的逻辑设计,得到意外的结果。另外,一些数据库系统中的优化器对于join定义的顺序很敏感。如果你发现使用很多join的查询在一个较大的数据库上执行花很长时间,通过改变sql语句中的join顺序很可能能够使它运行的更快。注意:有时
7、候,你只需要A和C表中的一部分数据,但A和C只有通过B才能发生关系,那么你依然要先将A和B连接,然后再连接C一个比较全面的例子:selectRCFiltered.ClassName,R.RecipeTitlefrom(selectRecipeClassId,RecipeClassDescriptionasClassNameFromRecipe_ClassesasRCwhereRC.ClassName='Salads'orRC.ClassName='Soup'orRc.ClassName='MainCourse')asR
8、CFilteredleftouterjoinRecipesasRonRCFiltered.RecipeClassId=R.RecipeClassId这个例子的内涵:1.在大多数sql的实现中,我们可以把from子句中的任何表名替换成一条完整的select语句.当然,必须分配一个相关名称。本例中为子select语句分配的名称为RCF
此文档下载收益归作者所有