mysql中left的含义,[数据库学习]mysql中left jino使用详解_java基础知识总结

用到的数据库表:

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里是完全不同的意思,切记!!!

注:以上文章由网友KkcYdtMp分享,仅用学习使用,不代表本站的观点,如有侵犯你的版权或违法信息,请联系站长删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值