Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 332|回复: 0

[数据库学习]mysql中left jino使用详解

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-31 00:00:46 | 显示全部楼层 |阅读模式
    用到的数据库表:
    mysql> select * from tt;
    +------+------+
    | id      | name |
    +--------+--------+
    |    1    | a      |
    |    2    | b      |
    |    3    | c      |
    +--------+--------+
                                                                                        
    mysql> select * from tt1;
    +--------+------+
    | id      | name |
    +--------+--------+
    |    1    | a      |
    |    2    | b      |
    |    3    | c      |
    +--------+------+
      
      
      操作一:
    select * from tt left join tt1 on tt.id=tt1.id   --提取id相等的 id   name   id   name
    --------------------------
    1   a          1   a
    2   b          2   b
    3   c          3   c
    操作二:
    select * from tt  left join tt1  on tt.id=tt1.id where tt.id=1
       --用的是where,可以看出用where 和 and 的区别了:) id   name   id   name
    --------------------------
    1   a     1     a 操作三:
    select * from tt  left join tt1 on tt.id=tt1.id and tt.id=1  
      --用的是and,且是主表tt.id=1 id   name   id   name
    --------------------------
    1   a         1      a   
    2   b        NULL NULL
    3   c        NULL NULL 操作四:这个返回跟上面一样的结果
    select * from tt  left join tt1 on tt.id=tt1.id and tt1.id=1
       --用的是and,且是从表tt1.id=1 id   name   id   name
    --------------------------
    1   a    1   a   
    2   b    NULL NULL
    3   c    NULL NULL 操作五:
    select * from tt  left join tt1 on tt.id=1      --关键是去掉了id相等这个条件 id   name   id   name
    --------------------------
    1   a       1     a
    1   a       2     b
    1   a       3     c
    2   b       NULL NULL
    3   c       NULL NULL 很多人不了解,其实left join 嘛, 无非是左边表为基础, 扫描右边表匹配的记录 先是左边表的第1条记录
    1    a   
    按条件 tt.id=1, 来扫描右边表的记录
    对于右边表的每条记录, 显然 tt.id=1 这个条件都是成立的, 所以第1条记录匹配后的结果是: 1      a       1        a
    1      a       2        b
    1      a       3        c ---------------------------------------------
    然后再扫描第2条记录
    2     b
    对于条件 tt.id=1, 在表中没有与之匹配的记录, 所以右边表为NULL
    因此第2条记录匹配的结果为
    2      b       NULL        NULL ----------------------------------------------
    第3条记录与第2条记录一样, 匹配的结果是
    3      c       NULL        NULL ---------------------------------------
    因此最终结果是5条记录
    1      a       1        a
    1      a       2        b
    1      a       3        c
    2      b       null     null
    3      c       null     null
    操作六:
    select * from tt  left join tt1 on tt1.id=1   --是从表tt1.id=1 id   name   id   name
    --------------------------
    1   a    1   a
    2   b    1   a
    3   c    1   a --解释:上面的结果是这样取的,先取主表1   a,再扫描从表tt1,正好
    其第一条数据id=1,满足条件,所以输出:
    1   a    1   a
    然后再是从表tt1第二条数据 2 b,id!=1,不输出,同理3   c也不满足条件,
    再主表 2  b,联立从表第一条数据1  a,满足条件,输出,
    以后依次类推...............
    --最主要的就是在连接里的 and 和 where 是有本质区别。
    1.
      select * from a left join b on a.id=b.id where a.id=1
    2.
      select * from a left join b on a.id=b.id and a.id=1 where里的条件是对连接后的结果集进行筛选,而on里的条件是关联时进行比较用的 --再看一下更加详细的解释:
    1、首先列出笛卡尔乘积
    1 a 1 a
    1 a 2 b
    1 a 3 c
    2 b 1 a
    2 b 2 b
    2 b 3 c
    3 c 1 a
    3 c 2 b
    3 c 3 c 2、对每个左边的纪录,看有没有符合on条件的,如果有,保留符合条件的,去掉不符合条件的,如果没有,
        保留左边和右边是null的一条纪录
    1 a 1 a
    1 a 2 b
    1 a 3 c      --左边1的都符合都保留
    2 b null null  --左边2的都不符合,变成一条右边null的纪录
    3 c null null   --左边3的都不符合,变成一条右边null的纪录
    3、再去掉where条件不符合的,就是结果(这里的例子没有where条件,所以结果不变,大家自己可以加条件测试下)
    1 a 1 a
    1 a 2 b
    1 a 3 c
    2 b null null
    3 c null null 对于left join的on条件:
    用左边的记录去匹配右边的每条记录,匹配条件就是on里的条件,若右边有满足条件的记录,则取出来,
    若没有匹配的记录,则给个null值,对于其后的where条件,
    是对整个left join后产生的结果集进行筛选,所以条件放在on里和where里是完全不同的意思,切记!!!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 19:45 , Processed in 0.364054 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表