zoukankan      html  css  js  c++  java
  • left join 条件区别

    t1:

    num | name
    -----+------
    1      | a
    2      | b
    3      | c

    t2:

    num | value
    -----+-------
    1    | xxx
    3    | yyy
    5    | zzz

    1. SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';

    2. SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num WHERE t2.value = 'xxx';

    这两种写法结果是会不一样的:

    1. SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx'; =>

    num | name | num | value
    -----+------+-----+-------
    1 | a | 1   | xxx
    2 | b |    |
    3 | c |      |

    2. SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num WHERE t2.value = 'xxx';

    num | name | num | value
    -----+------+-----+-------
    1    |       a | 1     | xxx

    解释:(这是因为在ON子句连接之处理,而WHERE子句在连接之处理。)

    我们先看第二种:2. SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num WHERE t2.value = 'xxx';

    这个可以分两步:

    1)SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num => 假设生成了一个新的虚拟表:t12

    num | name | num | value
    -----+------+-----+-------
    1    | a       | 1     | xxx
    2      | b       |      |
    3      | c       | 3     | yyy

    2) SELECT * FROM t12 WHERE t12.value = 'xxx';

    num | name | num | value
    -----+------+-----+-------
    1    |       a | 1     | xxx

    再看第一种:1. SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';

    这里已经明确规定从t2表选择的数据中value要等于'xxx'的, 这是t2只有一条符合,所以这返回一条,其余的用NULL不全到LEFT JOIN 的t1表

    num | name | num | value
    -----+------+-----+-------
    1 | a | 1   | xxx
    2 | b |    |
    3 | c |      |

  • 相关阅读:
    CentOS下Redis 2.2.14安装配置详解(转载)
    centos 6.3 64位安装php5.5及配置tengine
    linux下安装php扩展redis缓存
    linux安装ruby ruby-devel rubygems bundler
    composer的create-project安装php框架laravel for mac教程
    Homebrew安装php5及composer for mac教程
    KeepAlive详解
    方便mac os 10.9系统中phpstorm配置php运行环境
    Android使用adb工具及root权限完成手机抓包
    linux服务器监控流量sh脚本
  • 原文地址:https://www.cnblogs.com/damonhuang/p/4613122.html
Copyright © 2011-2022 走看看