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;

得到的结果是:

注意到最后一行,左表a15被保留,而右表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;

猜你喜欢

转载自www.cnblogs.com/heenhui2016/p/11625188.html