网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

SQL语句join解析

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:以下是网学会员为您推荐的SQL语句join解析,希望本篇文章对您学习有所帮助。


    1.内联结、外联结、左联结、右联结的含义及区别:
    在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,可以来信咨询:陈朋奕chenpengyi#gmail),国内关于MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的外联结的(“+”号)弄得糊涂了。
    在SQL标准中规划的(Join)联结大致分为下面四种:
    1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
    2.外联结:分为外左联结和外右联结。
    左联结A、B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录。
    右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:
    SelectA.nameB.nameFromALeftJoinBOnA.id=B.id
    和SelectA.nameB.nameFromBRightJoinAonB.id=A.id执行后的结果是一样的。
    3.全联结:将两个表中存在联结关系的字段的所有记录取出形成记录集的联结(这个不需要记忆,只要是查询中提到了的表的字段都会取出,无论是否符合联结条件,因此意义不大)。
    4.无联结:不用解释了吧,就是没有使用联结功能呗,也有自联结的说法。
    这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实大家回忆高等教育出版社出版的《数据库系统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。
    2.MySQL联结(Join)的语法
    MySQL支持Select和某些Update和Delete情况下的Join语法,具体语法上的细节有:
    table_references:
    table_reference[,table_reference]…
    table_reference:
    table_factor
    |join_table
    table_factor:
    tbl_name[[AS]alias]
    [{USE|IGNORE|FORCE}INDEX(key_list)]
    |(table_references)
    |{OJtable_referenceLEFTOUTERJOINtable_reference
    ONconditional_expr}
    join_table:
    table_reference[INNER|CROSS]JOINtable_factor[join_condition]
    |table_referenceSTRAIGHT_JOINtable_factor
    |table_referenceSTRAIGHT_JOINtable_factorONcondition
    |table_referenceLEFT[OUTER]JOINtable_referencejoin_condition
    |table_referenceNATURAL[LEFT[OUTER]]JOINtable_factor
    |table_referenceRIGHT[OUTER]JOINtable_refere
    ncejoin_condition
    |table_referenceNATURAL[RIGHT[OUTER]]JOINtable_factor
    join_condition:
    ONconditional_expr|USING(column_list)
    上面的用法摘自权威资料,不过大家看了是否有点晕呢?呵呵,应该问题主要还在于table_reference是什么,table_factor又是什么?这里的table_reference其实就是表的引用的意思,因为在MySQL看来,联结就是一种对表的引用,因此把需要联结的表定义为table_reference,同时在SQLStandard中也是如此看待的。而table_factor则是MySQL对这个引用的功能上的增强和扩充,使得引用的表可以是括号内的一系列表,如下面例子中的JOIN后面括号:
    SELECT*FROMt1LEFTJOIN(t2,t3,t4)ON(t2.a=t1.aANDt3.b=t1.bANDt4.c=t1.c)
    这个语句的执行结果和下面语句其实是一样的:
    SELECT*FROMt1LEFTJOIN(t2CROSSJOINt3CROSSJOINt4)
    ON(t2.a=t1.aANDt3.b=t1.bANDt4.c=t1.c)
    这两个例子不仅让我们了解了MySQL中table_factor和table_reference含义,同时能理解一点CROSSJOIN的用法,我要补充的是在MySQL现有版本中CROSSJOIN的作用和INNERJOIN是一样的(虽然在SQLStandard中是不一样的,然而在MySQL中他们的区别仅仅是INNERJOIN需要附加ON参数的语句,而CROSSJOIN不需要)。
    既然说到了ON语句,那就解释一下吧,ON语句其实和WHERE语句功能大致相当,只是这里的ON语句是专门针对联结表的,ON语句后面的条件的要求和书写方式和WHERE语句的要求是一样的,大家基本上可以把ON当作WHERE用。
    大家也许也看到了OJtable_referenceLEFTOUTERJOINtable_reference这个句子,这不是MySQL的标准写法,只是为了和ODBC的SQL语法兼容而设定的,我很少用,Java的人更是不会用,所以也不多解释了。
    那下面就具体讲讲简单的JOIN的用法了。首先我们假设有2个表A和B,他们的表结构和字段分别为:
    表A:
    ID
    Name
    1
    Tim
    2
    Jimmy
    3
    John
    4
    Tom
    表B:
    ID
    Hobby
    1
    Football
    2
    Basketball
    2
    Tennis
    4
    Soccer
    1.内联结:
    SelectA.NameB.HobbyfromA,BwhereA.id=B.id,这是隐式的内联结,查询的结果是:
    Name
    Hobby
    Tim
    Football
    Jimmy
    Basketball
    Jimmy
    Tennis
    Tom
    Soccer
    它的作用和SelectA.NamefromAINNERJOINBONA.id=B.id是一样的。这里的INNERJOIN换成CROSSJOIN也是可以的。
    2.外左联结
    SelectA.NamefromALeftJOINBONA.id=B.id,典型的外左联结,这样查询得到的结果将会是保留所有A表中联结字段的记录,若无与其相对应的B表中的字段记录则留空,结果如下:
    Name
    Hobby
    Tim
    Football
    Jimmy
    Basketball,Tennis
    John
    Tom
    Soccer
    所以从上面结果看出,因为A表中的John记录的ID没有在B表中有对应ID,因此为空,但Name栏仍有John记录。
    3.外右联结
    如果把上面查询改成外右联结:
    SelectA.NamefromARightJOINBONA.id=B.id,则结果将会是:
    Name
    Hobby
    Tim
    Football
    Jimmy
    Basketball
    Jimmy
    Tennis
    Tom
    Soccer
    这样的结果都是我们可以从外左联结的结果中猜到的了。
    说到这里大家是否对联结查询了解多了?这个原本看来高深的概念一下子就理解了,恍然大悟了吧(呵呵,开玩笑了)?最后给大家讲讲MySQL联结查询中的某些参数的作用:
    1.USING(column_list):其作用是为了方便书写联结的多对应关系,大部分情况下USING语句可以用ON语句来代替,如下面例子:
    aLEFTJOINbUSING(c1,c2,c3),其作用相当于下面语句
    aLEFTJOINbONa.c1=b.c1ANDa.c2=b.c2ANDa.c3=b.c3
    只是用ON来代替会书写比较麻烦而已。
    2.NATURAL[LEFT]JOIN:这个句子的作用相当于INNERJOIN,或者是在USING子句中包含了联结的表中所有字段的LeftJOIN(左联结)。
    3.STRAIGHT_JOIN:由于默认情况下MySQL在进行表的联结的时候会先读入左表,当使用了这个参数后MySQL将会先读入右表,这是个MySQL的内置优化参数,大家应该在特定情况下使用,譬如已经确认右表中的记录数量少,在筛选后能大大提高查询速度。
    最后要说的就是,在MySQL5.0以后,运算顺序得到了重视,所以对多表的联结查询可能会错误以子联结查询的方式进行。譬如你需要进行多表联结,因此你输入了下面的联结查询:
    SELECTt1.id,t2.id,t3.id
    FROMt1,t2
    LEFTJOINt3ON(t3.id=t1.id)
    WHEREt1.id=t2.id;
    但是MySQL并不是这样执行的,其后台的真正执行方式是下面的语句:
    SELECTt1.id,t2.id,t3.id
    FROMt1,(t2LEFTJOINt3ON(t3.id=t1.id))
    WHEREt1.id=t2.id;
    这并不是我们想要的效果,所以我们需要这样输入:
    SELECTt1.id,t2.id,t3.id
    FROM(t1,t2)
    LEFTJOINt3ON(t3.id=t1.id)
    WHEREt1.id=t2.id;
    在这里括号是相当重要的,因此以后在写这样的查询的时候我们不要忘记了多写几个括号,至少这样能避免很多错误(因为这样的错误是很难被开发人员发现的)。
    
  • 下一篇资讯: SQL语句
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师