zoukankan      html  css  js  c++  java
  • 图解 SQL 各种连接查询之间的区别

    转载自:http://blog.csdn.net/xuanjiewu/article/details/50636465

     假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:让我们看看不同JOIN的不同。

     

    1.  INNER JOIN

    select *
    from tablea  a join tableb b on a.name = b.name;

     

                    inner join 查询的是交集中的数据

    其中join的是(inner join)的缩写

     2. FULL [OUTER] JOIN 

    (1)

    SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 

    Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

    可以使用IFNULL判断。

    注意:这个在获取到数据进行展示的时候,要注意NULL的判断。

    注:

    mysql 5.5并不支持full join

     但是可以使用union all 来变相实现,并不是很方便

     

     使用一个左连接一个右连接,然后加上一个union的效果,就与fulljoin的效果一样了

    (2) 同时使用ISNULL 的判断,可以取得A和B两者没有交集的数据集。

    SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
    WHERE TableA.id IS null OR TableB.id IS null

    总结:这个很好用,可以用来对生产或者测试上的数据进行补数据的操作。mysql可以使用以上方法仿full join

     

    3. LEFT [OUTER] JOIN

    (1)  SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

    注意:这个可能很常用,但是注意B中匹配到了才有值,没有匹配到会变成NULL。相当于以table A为主表,table B为附表,A表中所有数据全都查询出来,B表中与A表有相对应数据就显示,

    没有就制空

    (2) LEFT JOIN 结合where IS NULL ,可以取得只有在A中的数据集。

    SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

    4. RIGHT [OUTER] JOIN

    RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。

    5. UNION 与 UNION ALL

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
    注意,a。 UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。

        b。每条 SELECT 语句中的列的顺序必须相同。

            c。UNION 只选取记录,每一行的数据都是不一样的而UNION ALL会列出所有记录,重复的也会列出来

     

    (1) 

    select name
    from tablea
    union
    select name
    from tableb;

    (3) 注意:

    SELECT * FROM TableA UNION SELECT * FROM TableB

     由于 id 1 Pirate   与 id 2 Pirate 并不相同,不合并

     

    还需要注意的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

    select *
    from tablea cross join tableb;
    
    select *
    from tablea,tableb;

    这两个SQL是一样的, 这个笛卡尔乘积会产生 4 x 4 = 16 条记录,

     一般来说,我们很少用到这个语法。但是我们得小心,如果是使用嵌套的select语句,再加上系统对SQL都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

    这里我们看出 

    SELECT    选择的是从‘结果集1’中取得某几列。
    
    FROM      是从 哪些 ‘数据源’中获取数据,而这些数据源是可以通过各种JOIN进行挑选的。
    
    WHERE   再加上where 从 select出的‘结果集2’ 中限制某些数据
    
    LIMIT   进而限制挑选,
    
    GROUP   可以重新挑选组合集合。
    ORDER BY进行结果的排序等。

    说到底,SQL是对集合的获取。

  • 相关阅读:
    Tensorflow源码解析2 -- 前后端连接的桥梁
    Tensorflow源码解析1 -- 内核架构和源码结构
    Python保存json文件并格式化
    如何在没有https环境下使用webrtc
    github提交代码不用输入账号密码的解决方案
    使用nodeJs在本地搭建最简单的服务
    ubuntu16.04 安装 nginx 服务器
    git pull和git pull --rebase的使用
    Linux 下各个目录的作用及内容
    阿里云服务器(Ubuntu16.04 64位)远程连接
  • 原文地址:https://www.cnblogs.com/huanghuanghui/p/9546514.html
Copyright © 2011-2022 走看看