mysql-joins具体用法说明
JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻。
假设我们有两个表,Table_A和Table_B。这两个表中的数据如下所示:
TABLE_A | TABLE_B PKValue |PKValue -------------- |-------------- 1FOX |1TROT 2COP |2CAR 3TAXI |3CAB 6WASHINGTON |6MONUMENT 7DELL |7PC 5ARIZONA |8MICROSOFT 4LINCOLN |9APPLE 10LUCENT |11SCOTCH
Join语法:
join_table: table_referenceJOINtable_factor[join_condition] //内连接 |table_reference{LEFT|RIGHT|FULL}[OUTER]JOINtable_referencejoin_condition //外连接 |table_referenceLEFTSEMIJOINtable_referencejoin_condition //左半连接 |table_referenceCROSSJOINtable_reference[join_condition](asofHive0.10) table_reference: table_factor //表 |join_table //join语句 table_factor: tbl_name[alias] //表名[别名] |table_subqueryalias //子查寻[别名] |(table_references) //带空号的table_reference join_condition: ONexpression //on开头的条件语句
1、InnerJOIN:(内连接)
这是最简单、最容易理解的连接,也是最常见的连接。此查询将返回左表(表A)中具有右表(表B)中匹配记录的所有记录。此连接写成如下:
SELECTFROMTable_AA INNERJOINTable_BB ONA.Key=B.Key
--InnerJOIN SELECTA.PKASA_PK,A.ValueASA_Value, B.ValueASB_Value,B.PKASB_PK FROMTable_AA INNERJOINTable_BB ONA.PK=B.PK A_PKA_ValueB_ValueB_PK ---------------------------- 1FOXTROT1 2COPCAR2 3TAXICAB3 6WASHINGTONMONUMENT6 7DELLPC7 (5row(s)affected)
2、LeftJOIN:(左连接)
此查询将返回左表(表A)中的所有记录,而不管这些记录是否与右表(表B)中的任何记录匹配。它还将从正确的表中返回任何匹配的记录。此连接写成如下:
SELECTFROMTable_AA LEFTJOINTable_BB ONA.Key=B.Key
--LeftJOIN SELECTA.PKASA_PK,A.ValueASA_Value, B.ValueASB_Value,B.PKASB_PK FROMTable_AA LEFTJOINTable_BB ONA.PK=B.PK A_PKA_ValueB_ValueB_PK ---------------------------- 1FOXTROT1 2COPCAR2 3TAXICAB3 4LINCOLNNULLNULL 5ARIZONANULLNULL 6WASHINGTONMONUMENT6 7DELLPC7 10LUCENTNULLNULL (8row(s)affected)
3、LeftExcludingJOIN:(左连接排除内连接结果)
此查询将返回左表(表A)中与右表(表B)中的任何记录都不匹配的所有记录。此连接写成如下:
SELECTFROMTable_AA LEFTJOINTable_BB ONA.Key=B.Key WHEREB.KeyISNULL
--LeftExcludingJOIN SELECTA.PKASA_PK,A.ValueASA_Value, B.ValueASB_Value,B.PKASB_PK FROMTable_AA LEFTJOINTable_BB ONA.PK=B.PK WHEREB.PKISNULL A_PKA_ValueB_ValueB_PK ---------------------------- 4LINCOLNNULLNULL 5ARIZONANULLNULL 10LUCENTNULLNULL (3row(s)affected)
4、RightJOIN:(右连接)
此查询将返回右表(表B)中的所有记录,而不管这些记录中是否有任何记录与左表(表A)中的记录相匹配。它还将返回左表中的任何匹配记录。此连接写成如下:
SELECTFROMTable_AA RIGHTJOINTable_BB ONA.Key=B.Key
--RightJOIN SELECTA.PKASA_PK,A.ValueASA_Value, B.ValueASB_Value,B.PKASB_PK FROMTable_AA RIGHTJOINTable_BB ONA.PK=B.PK A_PKA_ValueB_ValueB_PK ---------------------------- 1FOXTROT1 2COPCAR2 3TAXICAB3 6WASHINGTONMONUMENT6 7DELLPC7 NULLNULLMICROSOFT8 NULLNULLAPPLE9 NULLNULLSCOTCH11 (8row(s)affected)
5、RightExcludingJOIN:(右连接排除内连接结果)
此查询将返回右表(表B)中与左表(表A)中的任何记录都不匹配的所有记录。此连接写成如下:
SELECTFROMTable_AA RIGHTJOINTable_BB ONA.Key=B.Key WHEREA.KeyISNULL
--RightExcludingJOIN SELECTA.PKASA_PK,A.ValueASA_Value, B.ValueASB_Value,B.PKASB_PK FROMTable_AA RIGHTJOINTable_BB ONA.PK=B.PK WHEREA.PKISNULL A_PKA_ValueB_ValueB_PK ---------------------------- NULLNULLMICROSOFT8 NULLNULLAPPLE9 NULLNULLSCOTCH11 (3row(s)affected)
6、OuterJOIN:(外连接)
此联接也可以称为完全外联接或完全联接。此查询将返回两个表中的所有记录,连接左表(表A)中与右表(表B)中的记录相匹配的记录。此连接写成如下:
SELECTFROMTable_AA FULLOUTERJOINTable_BB ONA.Key=B.Key
--OuterJOIN SELECTA.PKASA_PK,A.ValueASA_Value, B.ValueASB_Value,B.PKASB_PK FROMTable_AA FULLOUTERJOINTable_BB ONA.PK=B.PK A_PKA_ValueB_ValueB_PK ---------------------------- 1FOXTROT1 2COPCAR2 3TAXICAB3 6WASHINGTONMONUMENT6 7DELLPC7 NULLNULLMICROSOFT8 NULLNULLAPPLE9 NULLNULLSCOTCH11 5ARIZONANULLNULL 4LINCOLNNULLNULL 10LUCENTNULLNULL (11row(s)affected)
7、OuterExcludingJOIN:(外连接排除内连接结果)
此查询将返回左表(表A)中的所有记录和右表(表B)中不匹配的所有记录。我还不需要使用这种类型的联接,但所有其他类型的联接我都相当频繁地使用。此连接写成如下:
SELECTFROMTable_AA FULLOUTERJOINTable_BB ONA.Key=B.Key WHEREA.KeyISNULLORB.KeyISNULL
--OuterExcludingJOIN SELECTA.PKASA_PK,A.ValueASA_Value, B.ValueASB_Value,B.PKASB_PK FROMTable_AA FULLOUTERJOINTable_BB ONA.PK=B.PK WHEREA.PKISNULL ORB.PKISNULL A_PKA_ValueB_ValueB_PK ---------------------------- NULLNULLMICROSOFT8 NULLNULLAPPLE9 NULLNULLSCOTCH11 5ARIZONANULLNULL 4LINCOLNNULLNULL 10LUCENTNULLNULL (6row(s)affected)
注意,在外部联接上,首先返回内部连接记录,然后返回右连接记录,最后返回左连接记录(至少,我的MicrosoftSQLServer就是这样做的;当然,这不需要使用任何ORDERBY语句)。您可以访问维基百科文章以获得更多信息(但是,条目不是图形化的)。我还创建了一个备忘单,您可以在需要时打印出来。如果您右键单击下面的图像并选择“将目标保存为.”,您将下载完整大小的图像。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。