sql之left join、right join、inner join full join,union,union all的区别
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
full join 返回两张表中的行 left join+right join
UNION在进行表链接后会筛选掉重复的记录
UNION ALL操作只是简单的将两个结果合并后就返回
create table test(
sid number primary key not null,
sname varchar2(200),
scode varchar2(200)
);
commit;
create table test_bak(
sid number primary key not null,
sname varchar2(200),
scode varchar2(200)
);
commit;
BEGIN
FOR I IN 1 .. 4 LOOP
INSERT INTO test VALUES (I,'jason','1000'+i);
END LOOP;
END;
BEGIN
FOR I IN 3 .. 5 LOOP
INSERT INTO test_bak VALUES (I,'jason','1000'+i);
END LOOP;
END;
select * from test;
sid sname scode
11jason1001
22jason1002
33jason1003
44jason1004
select * from test_bak;
sid sname scode
13jason1003
24jason1004
35jason1005
select * from test union select * from test_bak;--UNION在进行表链接后会筛选掉重复的记录
sid sname scode
11jason1001
22jason1002
33jason1003
44jason1004
55jason1005
select * from test union all select * from test_bak;--UNION ALL操作只是简单的将两个结果合并后就返回
sid sname scode
11jason1001
22jason1002
33jason1003
44jason1004
53jason1003
64jason1004
75jason1005
select test.*,test_bak.* from test inner join test_bak on test.sid = test_bak.sid ;--只返回两个表中联结字段相等的行
13jason10033jason1003
24jason10044jason1004
select test.*,test_bak.* from test left join test_bak on test.sid = test_bak.sid ;--返回包括左表中的所有记录和右表中联结字段相等的记录
11jason1001null null null
22jason1002null null null
33jason10033jason1003
44jason10044jason1004
select test.*,test_bak.* from test right join test_bak on test.sid = test_bak.sid ;--返回包括右表中的所有记录和左表中联结字段相等的记录
13jason10033jason1003
24jason10044jason1004
3null null null 5jason1005
select test.*,test_bak.* from test full join test_bak on test.sid = test_bak.sid ;--返回左右两表中的所有记录,相同的记录会同行显示
11jason1001null null null
22jason1002null null null
33jason10033jason1003
44jason10044jason1004
5null null null 5jason1005