数据库的内连接和外连接有什么区别? SQL内连接与外连接的区别
\u6570\u636e\u5e93\u7684\u5185\u8fde\u63a5\u548c\u5916\u8fde\u63a5\u6709\u4ec0\u4e48\u533a\u522b?SQL\u5185\u8fde\u63a5\u4e0e\u5916\u8fde\u63a5\u7684\u5171\u67093\u70b9\u4e0d\u540c\uff1a
1\u3001\u4e24\u8005\u7684\u5206\u7c7b\u4e0d\u540c\uff1a\u5185\u8fde\u63a5\u5206\u4e3a\u76f8\u7b49\u8fde\u63a5\u548c\u81ea\u7136\u8fde\u63a5\u4e24\u79cd\u8fde\u63a5\u65b9\u5f0f\uff1b\u800c\u5916\u8fde\u63a5\u5206\u4e3a\u5de6\u5916\u8fde\u63a5\u3001\u53f3\u5916\u8fde\u63a5\u548c\u5168\u5916\u8fde\u63a5\u4e09\u79cd\u8fde\u63a5\u65b9\u5f0f\uff08\u5de6\u5916\u8fde\u63a5\u5373LEFT OUTER JOIN\uff1b\u53f3\u5916\u8fde\u63a5\u5373RIGHT OUTER JOIN\uff09\u3002
2\u3001\u4e24\u8005\u6240\u8fde\u63a5\u7684\u5bf9\u8c61\u8868\u4e0d\u540c\uff1a\u5185\u8fde\u63a5\u8fdb\u884c\u8fde\u63a5\u7684\u4e24\u4e2a\u8868\u662f\u5bf9\u5e94\u7684\u76f8\u5339\u914d\u7684\u5b57\u6bb5\u5b8c\u5168\u76f8\u540c\u7684\u3002\u5de6\u5916\u8fde\u63a5\u4e2d\u8fdb\u884c\u8fde\u63a5\u7684\u4e24\u4e2a\u8868\u4f1a\u8fd4\u56de\u5de6\u8fb9\u8868\u4e2d\u7684\u6240\u6709\u7684\u884c\u548c\u53f3\u8fb9\u8868\u4e2d\u4e0e\u4e4b\u76f8\u5339\u914d\u7684\u5217\u503c\uff0c\u6ca1\u6709\u76f8\u5339\u914d\u7684\u7528\u7a7a\u503c\u4ee3\u66ff\u3002\u53f3\u5916\u8fde\u63a5\u4e2d\u8fdb\u884c\u8fde\u63a5\u7684\u4e24\u4e2a\u8868\u4f1a\u8fd4\u56de\u53f3\u8fb9\u8868\u4e2d\u7684\u6240\u6709\u7684\u884c\u548c\u5de6\u8fb9\u8868\u4e2d\u4e0e\u4e4b\u76f8\u5339\u914d\u7684\u5217\u503c\uff0c\u6ca1\u6709\u76f8\u5339\u914d\u7684\u7528\u7a7a\u503c\u4ee3\u66ff\u3002
3\u3001\u4e24\u8005\u7684\u4f5c\u7528\u8303\u56f4\u4e0d\u540c\uff1a\u5185\u8fde\u63a5\u7684\u8fde\u63a5\u53d1\u751f\u5728\u4e00\u5f20\u57fa\u8868\u5185\uff0c\u800c\u5916\u8fde\u63a5\u7684\u8fde\u63a5\u53d1\u751f\u5728\u4e24\u5f20\u8868\u4e4b\u95f4\u3002
\u6ce8\uff1a\u5185\u8fde\u63a5\uff08\u5178\u578b\u7684\u8fde\u63a5\u8fd0\u7b97\uff0c\u4f7f\u7528\u50cf = \u6216 \u4e4b\u7c7b\u7684\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff09\u3002\u5305\u62ec\u76f8\u7b49\u8fde\u63a5\u548c\u81ea\u7136\u8fde\u63a5\u3002\u5185\u8fde\u63a5\u4f7f\u7528\u6bd4\u8f83\u8fd0\u7b97\u7b26\u6839\u636e\u6bcf\u4e2a\u8868\u5171\u6709\u7684\u5217\u7684\u503c\u5339\u914d\u4e24\u4e2a\u8868\u4e2d\u7684\u884c\u3002\u4f8b\u5982\uff0c\u68c0\u7d22 students\u548ccourses\u8868\u4e2d\u5b66\u751f\u6807\u8bc6\u53f7\u76f8\u540c\u7684\u6240\u6709\u884c\u3002
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
全外连接:左外连接 union 右外连接。
示例:
数据库版本:Oracle
表TESTA,TESTB,TESTC,各有A, B两列。
A.内连接
内连接,即最常见的等值连接,例:
SELECT *
FROM TESTA,TESTB
WHERE TESTA.A=TESTB.A
结果:
B.外连接
外连接分为左外连接,右外连接和全外连接。
1. 左外连接 left outer join 或者 left join
左外连接就是在等值连接的基础上加上主表中的未匹配数据,例:
SELECT *
FROM TESTA
LEFT OUTER JOIN TESTB
ON TESTA.A=TESTB.A
结果:
三个表做左外链接:
SELECT *
FROM TESTA
LEFT OUTER JOIN TESTB
ON TESTA.A=TESTB.A
LEFT OUTER JOIN TESTC
ON TESTA.A=TESTC.A
结果:
2. 右外连接 right outer join 或者 right join
右外连接是在等值连接的基础上加上被连接表的不匹配数据
SELECT *
FROM TESTA
RIGHT OUTER JOIN TESTB
ON TESTA.A=TESTB.A
3.全外连接 full outer join 或者 full join
全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上。
SELECT *
FROM TESTA
FULL OUTER JOIN TESTB
ON TESTA.A=TESTB.A
结果:
SQL内连接与外连接的共有3点不同:
1、两者的分类不同:内连接分为相等连接和自然连接两种连接方式;而外连接分为左外连接、右外连接和全外连接三种连接方式(左外连接即LEFT OUTER JOIN;右外连接即RIGHT OUTER JOIN)。
2、两者所连接的对象表不同:内连接进行连接的两个表是对应的相匹配的字段完全相同的。左外连接中进行连接的两个表会返回左边表中的所有的行和右边表中与之相匹配的列值,没有相匹配的用空值代替。右外连接中进行连接的两个表会返回右边表中的所有的行和左边表中与之相匹配的列值,没有相匹配的用空值代替。
3、两者的作用范围不同:内连接的连接发生在一张基表内,而外连接的连接发生在两张表之间。
注:内连接(典型的连接运算,使用像 = 或 <> 之类的比较运算符)。包括相等连接和自然连接。内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
1、内连接
内连接,即最常见的等值连接,例:
SELECT * FROM TESTA,TESTBWHERE TESTA.A=TESTB.A结果:
2、外连接
外连接分为左外连接,右外连接和全外连接。
左外连接 left outer join 或者 left join
左外连接就是在等值连接的基础上加上主表中的未匹配数据,例:
SELECT *FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A结果:
扩展资料:
全外连接 full outer join 或者 full join
全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上。
SELECT * FROM TESTA FULL OUTER JOIN TESTBON TESTA.A=TESTB.A结果:
参考资料:百度百科内连接
简单来讲,随便来个例子:
A表 B表
id name id name
1 a 1 b
2 b 3 c
4 c
内连接就是左表和右表相同的数据:
select * from A inner join B on A.id=B.id
id name id name
1 a 1 b
外连接分为:左外连接、右外连接、全外连接
左外连接就是以左表为准,去匹配右表,左表有多少条数据,结果就是多少条数据
select * from A left join B on A.id=B.id
id name id name
1 a 1 b
2 b null null
4 c null null
右外连接就是与左外连接反之,以右表为准,去匹配左表,右表有多少条数据,结果就是多少条数据
select * from A right join B on A.id=B.id
id name id name
1 a 1 b
null null 3 c
全外连接数据条数不一定,相当与是左外连接 和右外连接 的综合
select * from A full join B on A.id=B.id
id name id name
1 a 1 b
2 b null null
null null 3 c
4 c null null
希望你能明白!!!
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
绛旓細1銆佽繛鎺ョ粨鏋滀笉鍚 鍐呰繛鎺ョ殑杩炴帴缁撴灉浠呭寘鍚鍚堣繛鎺ユ潯浠剁殑琛锛屽弬涓庤繛鎺ョ殑涓や釜琛ㄩ兘蹇呴』绗﹀悎杩炴帴鏉′欢锛涜屽杩炴帴鐨勮繛鎺ョ粨鏋滀笉浠呭寘鍚簡绗﹀悎杩炴帴鏉′欢鐨勮锛屽悓鏃惰繕鍖呮嫭涓嶇鍚堣嚜韬潯浠剁殑琛岋紝鍏朵腑杩樺寘鎷乏澶栬繛鎺ャ佸彸澶栬繛鎺ヤ互鍙婂叏澶栬繛鎺ャ2銆娉ㄦ剰浜嬮」涓嶅悓 鍐呰繛鎺ラ渶瑕佹敞鎰忓尯鍒嗗湪宓屽鏌ヨ鏃朵娇鐢ㄧ殑any浠ュ強all鐨勫尯鍒紱澶...
绛旓細鍐呰繛鎺ワ細鎸囪繛鎺ョ粨鏋滀粎鍖呭惈绗﹀悎杩炴帴鏉′欢鐨勮锛屽弬涓庤繛鎺ョ殑涓や釜琛ㄩ兘搴旇绗﹀悎杩炴帴鏉′欢銆傚杩炴帴锛氳繛鎺ョ粨鏋滀笉浠呭寘鍚鍚堣繛鎺ユ潯浠剁殑琛屽悓鏃朵篃鍖呭惈鑷韩涓嶇鍚堟潯浠剁殑琛屻傚寘鎷宸﹀杩炴帴銆佸彸澶栬繛鎺鍜屽叏澶栬繛鎺ャ1銆佸唴杩炴帴 鍐呰繛鎺ワ紝鍗虫渶甯歌鐨勭瓑鍊艰繛鎺ワ紝渚:SELECT * FROM TESTA,TESTBWHERE TESTA.A=TESTB.A缁撴灉:2銆...
绛旓細鍐呰繛鎺ワ細鎸囪繛鎺ョ粨鏋滀粎鍖呭惈绗﹀悎杩炴帴鏉′欢鐨勮锛屽弬涓庤繛鎺ョ殑涓や釜琛ㄩ兘搴旇绗﹀悎杩炴帴鏉′欢銆傚杩炴帴锛氳繛鎺ョ粨鏋滀笉浠呭寘鍚鍚堣繛鎺ユ潯浠剁殑琛屽悓鏃朵篃鍖呭惈鑷韩涓嶇鍚堟潯浠剁殑琛屻傚寘鎷宸﹀杩炴帴銆佸彸澶栬繛鎺鍜屽叏澶栬繛鎺ャ傚乏澶栬繛鎺ワ細宸﹁竟琛ㄦ暟鎹鍏ㄩ儴淇濈暀锛屽彸杈硅〃淇濈暀绗﹀悎杩炴帴鏉′欢鐨勮銆傚彸澶栬繛鎺ワ細鍙宠竟琛ㄦ暟鎹鍏ㄩ儴淇濈暀锛屽乏杈硅〃淇濈暀...
绛旓細杩炴帴缁撴灉涓嶅悓鍐呰繛鎺ョ殑杩炴帴缁撴灉浠呭寘鍚鍚堣繛鎺ユ潯浠剁殑琛锛屽弬涓庤繛鎺ョ殑涓や釜琛ㄩ兘蹇呴』绗﹀悎杩炴帴鏉′欢锛涜屽杩炴帴鐨勮繛鎺ョ粨鏋滀笉浠呭寘鍚簡绗﹀悎杩炴帴鏉′欢鐨勮锛屽悓鏃惰繕鍖呮嫭涓嶇鍚堣嚜韬潯浠剁殑琛岋紝鍏朵腑杩樺寘鎷宸﹀杩炴帴銆佸彸澶栬繛鎺浠ュ強鍏ㄥ杩炴帴銆傚杩炴帴鍜屽唴杩炴帴鐨勫尯鍒槸姣旇緝澶氱殑锛岄鍏堥渶瑕佷簡瑙g殑鏄紝澶栬繛鎺ヤ笉浠呭彲浠ヨ繑鍥炵鍚堣繛鎺ュ拰...
绛旓細MySQL鏁版嵁搴鍐呰繛鎺鍜屽杩炴帴鐨勫尯鍒 鍐呰繛鎺ワ細innerjoin selecta.*,b.*fromaINNERJOINbONa.id=b.id 鍙緭鍑哄尮閰嶇殑鏁版嵁锛屽嵆a,b琛╥d鐩稿悓鐨勬暟鎹 澶栬仈鎺ャ傚乏鍚戝鑱旀帴銆佸彸鍚戝鑱旀帴 1锛塋EFTJOIN鎴朙EFTOUTERJOIN selecta.*,b.*fromaLEFTJOINbONa.id=b.id 宸﹀悜澶栬仈鎺ョ殑缁撴灉闆嗗寘鎷琇EFTOUTER瀛愬彞涓寚瀹氱殑宸﹁〃...
绛旓細1銆佷袱鑰呯殑鍒嗙被涓嶅悓锛氬唴杩炴帴鍒嗕负鐩哥瓑杩炴帴鍜岃嚜鐒惰繛鎺ヤ袱绉嶈繛鎺ユ柟寮忥紱鑰屽杩炴帴鍒嗕负宸﹀杩炴帴銆佸彸澶栬繛鎺鍜屽叏澶栬繛鎺ヤ笁绉嶈繛鎺ユ柟寮忥紙宸﹀杩炴帴鍗矻EFTOUTERJOIN锛涘彸澶栬繛鎺ュ嵆RIGHTOUTERJOIN锛夈2銆佸唴杩炴帴鍜屽杩炴帴鐨勫尯鍒槸锛氬唴杩炴帴锛氭寚杩炴帴缁撴灉浠呭寘鍚鍚堣繛鎺ユ潯浠剁殑琛岋紝鍙備笌杩炴帴鐨勪袱涓〃閮藉簲璇ョ鍚堣繛鎺ユ潯浠躲傚杩炴帴锛...
绛旓細宸﹁繛鎺ュ拰鍐呰繛鎺ョ殑鍖哄埆鏄細棣栧厛闇瑕佷簡瑙g殑鏄紝澶栬繛鎺ヤ笉浠呭彲浠ヨ繑鍥炵鍚堣繛鎺ュ拰鏌ヨ鏉′欢鐨勬暟鎹锛岃屼笖杩樺彲浠ヨ繑鍥炰笉绗﹀悎鏉′欢鐨勪竴浜涜銆傝屽唴杩炴帴鍙兘杩斿洖杩炴帴琛ㄤ腑绗﹀悎杩炴帴鏉′欢鍜屾煡璇㈡潯浠剁殑鏁版嵁琛岋紝鏄笉鍙互杩斿洖涓嶇鍚堟潯浠剁殑涓浜涙暟鎹銆傚杩炴帴涓昏鍒嗕负涓夌被锛鍒嗗埆鏄乏澶栬繛鎺ャ佸彸澶栬繛鎺ュ拰鍏ㄥ杩炴帴锛岃屽唴杩炴帴鍙湁...
绛旓細涓嶇鏄鍐呰繛鎺杩樻槸澶栬繛鎺ラ兘鍙樉绀虹鍚堟潯浠剁殑鏁版嵁锛屽尯鍒槸闆嗗悎绌洪棿涓嶅悓銆傚唴杩炴帴锛氬湪涓や釜琛ㄧ殑鏁版嵁鐨勭瑳鍗″皵闆嗗悎涓樉绀虹鍚堟潯浠剁殑璁板綍銆係QL--JOIN涔嬪畬鍏ㄧ敤娉曞鑱旀帴銆傚鑱旀帴鍙互鏄乏鍚戝鑱旀帴銆佸彸鍚戝鑱旀帴鎴栧畬鏁村閮ㄨ仈鎺ャ傚湪FROM瀛愬彞涓寚瀹氬鑱旀帴鏃讹紝鍙互鐢变笅鍒楀嚑缁勫叧閿瓧涓殑涓缁勬寚瀹氾細LEFTJOIN鎴朙EFTOUTERJOIN...
绛旓細鏁版嵁搴 鍐呰繛鎺 澶栬繛鎺 鍖哄埆 锛堜竴锛夊唴杩炴帴 鍐呰繛鎺ユ煡璇㈡搷浣滃垪鍑轰笌杩炴帴鏉′欢鍖归厤鐨勬暟鎹锛屽畠浣跨敤姣旇緝杩愮畻绗︽瘮杈冭杩炴帴鍒楃殑 鍒楀笺傚唴杩炴帴鍒嗕笁绉嶏細1銆佺瓑鍊艰繛鎺ワ細鍦ㄨ繛鎺ユ潯浠朵腑浣跨敤绛変簬鍙(=)杩愮畻绗︽瘮杈冭杩炴帴鍒楃殑鍒楀硷紝鍏舵煡璇㈢粨 鏋滀腑鍒楀嚭琚繛鎺ヨ〃涓殑鎵鏈夊垪锛屽寘鎷叾涓殑閲嶅鍒椼備緥锛屼笅闈娇鐢ㄧ瓑鍊艰繛鎺ュ垪鍑...
绛旓細1銆佸唴杩炴帴锛氶渶瑕佸尯鍒嗗湪宓屽鏌ヨ涓娇鐢ㄧ殑any涓巃ll鐨勫尯鍒紝any鐩稿綋浜庨昏緫杩愮畻鈥渱|鈥濊宎ll鍒欑浉褰撲簬閫昏緫杩愮畻鈥&&鈥2銆佸杩炴帴锛氬乏琛ㄥ拰鍙宠〃閮戒笉鍋氶檺鍒讹紝鎵鏈夌殑璁板綍閮芥樉绀猴紝涓よ〃涓嶈冻鐨勫湴鏂圭敤null 濉厖銆 鍏ㄥ杩炴帴涓嶆敮鎸侊紙+锛夎繖绉嶅啓娉曘傚弬鑰冭祫鏂欐潵婧愶細鐧惧害鐧剧-澶栬繛鎺 鍙傝冭祫鏂欐潵婧愶細鐧惧害鐧剧-鍐呰繛鎺 ...