SQL inner join, join, left join, right join, full outer join
基本信息
创建两个表a1
, a2
。
两个表的重要差别是:
a1
中有5,'wu'
,a2
中没有。a2
中有4,'li'
,而a1中没有。
创建表和插入数据的代码如下:
-- 创建a1表
create table a1(
userid integer PRIMARY KEY,
username varchar(20)
);
-- 创建a2表
create table a2(
userid integer primary key,
username varchar(20)
);
insert into a1 values(1,'he');
insert into a1 values(2,'xiao');
insert into a1 values(3,'zhang');
insert into a1 values(5,'wu');
insert into a2 values(3,'zhang');
insert into a2 values(2,'xiao');
insert into a2 values(1,'he');
insert into a2 values(4,'li');
left join, right join
left join
是左外联,完整的写法是left outer join
。 这种连接,会把左表的一切保留,用右侧去匹配,匹配不了的为null
。如:
select a1.userid, a2.userid from a1 left join a2 on a1.userid=a2.userid;
得到的结果是:
注意到最后一行,左表a1
的5
被保留,而右表a2
没有与之对应的,因此为空。
右连接也一样,只不过把右表中的保留,左表去匹配,对不上的为null。
select a1.userid, a2.userid from a1 right join a2 on a1.userid=a2.userid;
full outer join
全外连接是把左右两边匹配,并且两边都保留,匹配不上就是null。
select a1.userid, a2.userid from a1 full outer join a2 on a1.userid=a2.userid;
得到的结果是:
注意后两行,都被保留了。这是与接下来inner join
最大的不同,inner join
会把这些匹配不上的都去掉。
inner join
注意如果不写任何left, rigth, full, inner
, 只写一个join
, 那么等同于Inner join
. 即: join 全等于 inner join
。 另外得到笛卡尔集再用where筛选,也可以获取到和inner join 一样的效果。详看最后一节。
inner join
会把左右匹配不上的都去掉,只保留那些匹配得上的。
select a1.userid, a2.userid from a1 inner join a2 on a1.userid=a2.userid;
笛卡尔集
以下代码,由于没有匹配和相等的列,因此会把所有可能的序列都列出来。
select a1.userid, a2.userid from a1,a2;
如果添加上where
的条件筛选,就跟 inner join
等同。
select a1.userid, a2.userid from a1,a2 where a1.userid=a2.userid;