Mysql 内连接、左连接会出现笛卡尔积

有两张表,user表和job表,表数据如下

这里写图片描述

这里写图片描述

交叉连接

SELECT
     *
FROM
     `user` CROSS JOIN job;  

这种等同于(交叉查询等于不加on的内连接)

SELECT
    *
FROM
    `user` , job;

  sql执行结果:

这里写图片描述

  结论:交叉连接,会产生笛卡尔积。

内连接

内连接唯一字段

SELECT
    *
FROM
    `user` u JOIN job j ON u.JOB_ID=j.ID;

这里写图片描述

  结论:假如,内连接查询,on条件是A表或者B表的唯一字段,则结果集是两表的交集,不是笛卡尔积。

内连接非唯一字段

  如果A表有m条记录,m1条符合on条件,B表有n条记录,有n1条符合on条件,则结果集是m1*n1

SELECT
    *
FROM
    `user` u JOIN job j ON u.valid=j.valid;

这里写图片描述

  结论:假如,on条件是表中非唯一字段,则结果集是两表匹配到的结果集的笛卡尔积(局部笛卡尔积) 。

外连接

左连接

左连接唯一字段

  假如A表有m条记录,B表有n条记录,则结果集是m条
  
SELECT
*
FROM
user u LEFT JOIN job j ON u.JOB_ID=j.id;

这里写图片描述

结论:on条件是唯一字段,则结果集是左表记录的数量。

左连接非唯一字段

  如果A表有m条记录,m1条符合on条件,B表有n条记录,有n1条符合on条件,则结果集是 (m-m1) + m1*n1

SELECT
    *
FROM
    `user` u LEFT JOIN job j ON u.VALID=j.VALID;

这里写图片描述

结论:左连接非唯一字段,是局部笛卡尔积。

右连接

  同左连接,这里就不赘述了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值