zoukankan      html  css  js  c++  java
  • SQL JOIN--初级篇

    写在前面的话:

    以下是最简单的join原理,为后面的大数据分布式join做概念复习和知识铺垫:

    有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

      • JOIN: 如果表中有至少一个匹配,则返回行
      • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
      • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
      • FULL JOIN: 只要其中一个表中存在匹配,就返回行

    转载一个简单的例子说明: 

    a表
    name sex
    张三 男
    李四 女

    b表
    name age
    李四 30
    王五 23

    1全外连接
    select a.name,a.sex,b.name,b.age
    from a full outer join b on a.name=b.name
    结果如下,
    name sex name age
    张三 男 NULL NULL
    李四 女 李四 30
    NULL NULL 王五 23
    关联字段name,左表有而右表没有的,如张三,b.name,b.age都为NULL,加上左右两边都有的就是左连接的结果;而右表有而左表表没有的,如王五,a.name,a.sex都为NULL,加上左右两边都有的就是右连接的结果;左右两边都有的如,李四,这就是内连接。相见如下
    2左
    select a.name,a.sex,b.name,b.age
    from a left outer join b on a.name=b.name
    结果如下
    name sex name age
    张三 男 NULL NULL
    李四 女 李四 30
    2右
    select a.name,a.sex,b.name,b.age
    from a right outer join b on a.name=b.name
    结果如下
    name sex name age
    李四 女 李四 30
    NULL NULL 王五 23
    3内联
    select a.name,a.sex,b.name,b.age
    from a inner join b on a.name=b.name
    结果如下
    name sex name age
    李四 女 李四 30
    4交叉
    select a.name,a.sex,b.name,b.age
    from a cross join b on a.name=b.name
    结果如下
    name sex name age
    张三 男 李四 30
    李四 女 王五 23
    张三 男 王五 23李四 女 李四 30

    总结:
    INNER JOIN 内连接 -- 只显示两表都存在的记录 记录数<=任一表
    LEFT JOIN 左连接 -- 显示左表所有存在的记录 记录数=左表
    RIGHT JOIN 右连接 -- 显示右表所有存在的记录 记录数=右表
    FULL JOIN 外连接 -- 显示两表中,某个表有存在的记录 记录数>=任一表
    CROSS JOIN 交叉连接 -- 对左表的每条记录,都对应右表的每条记录 记录数=左表*右表
    这里有一个值得探讨的地方:
    貌似cross join没有什么实际意义,两个表的笛卡尔积过分冗余,join出来的结果也没什么作用。
    但是,上网找到这么个说法,有些道理

    例如:

    有一个员工表,一个工资类型表(计时工资,计件工资,待工工资,加班补贴)

    则员工表 cross join 工资类型表 再左连接工资表的结果

    就可以很直观的查看每个员工各类型的工资有多少了

    我的看法是,以上如果设计的好,员工表和工资表直接左连接,依然可以拿到每个员工的所有信息,只不过某些类型的工资员工没有工资项则不予显示了,这个问题有待进一步探讨!~~
  • 相关阅读:
    hdu 1873 看病要排队
    母函数详解
    【RDMA】无损网络和PFC(基于优先级的流量控制)
    图解Linux网络包接收过程
    结对编程 <==> 断背山?
    CMPP和SMPP协议比较
    Berkerly DB、SQL Server的性能比较
    使用Berkeley DB遇到问题了
    重新学习C语言
    超长短信的处理办法
  • 原文地址:https://www.cnblogs.com/chengyeliang/p/3936989.html
Copyright © 2011-2022 走看看