• 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;
    

  • 相关阅读:
    vue开发chrome扩展,数据通过storage对象获取
    Vue手动集成less预编译器
    Google Translate寻找之旅
    Javascript Range对象的学习
    Javascript Promises学习
    SublimeText 建立构建Node js系统
    We're sorry but demo3 doesn't work properly without JavaScript enabled. Please enable it to continue.
    npm安装包出现UNMET DEPENDENCY报错
    (转载)命令行说明中格式 尖括号 中括号的含义
    Linux重启网卡服务Failed to start LSB: Bring up/down networking.
  • 原文地址:https://www.cnblogs.com/heenhui2016/p/11625188.html
Copyright © 2020-2023  润新知