mysql表连接

it2022-05-05  130

mysql 连接

1. 普通表连接2.left join 连接3.right join

1. 普通表连接

select * from t1 ,t2 where t1.id = t2.id;

我们写的SQL会被优化器优化,MySQL会按照小结果集驱动大结果集的方式进行表联结,表联结即对2个表做笛卡尔积,所以联结的顺序是t1(3)-t2(3)-t3(4),括号中为个数。如果表t表的个数为5,则联结的顺序为t2(3)-t3(4)-t1(5),注意括号里的数字不是表的数量,是结果集的数量 但是如果继续加上条件,会怎么样呢?

select * from t1 ,t2 where t1.id = t2.id where t1.id=1; 先进行条件过滤 t1只有一条数据 则查找的顺序 先t1-t2

2.left join 连接

没有where的条件下

select * from t1 left join t2 on t1.id = t2.id and t2.name = 'zhangsan';

根据left join的定义 t1左右基表 首先被查出来 然后和t2进行笛卡尔积 在此过程中 on后面的 对t2表字段的过滤条件是有用的,但是如果对t1加上过滤条件呢?

select * from t1 left join t2 on t1.id = t2.id and t2.name = 'zhangsan' and t1.name ='xiaoli';

此时t1的条件无用 ,因为没有where条件 基表的数据只能多不能少 如果t1.id 匹配到t2多条数据 此时查出来的数据就会变多 但是如果没有匹配到t2的数据 数据也不会变少 t2表字段都是null

有where条件

select * from t1 left join t2 on t1.id = t2.id and t2.name = 'zhangsan' where t1.name ='xiaoli';

查询顺序为 因为条件只有t1 先查t1数据 加上t1.name ='xiaoli’ 过滤条件 之后 与t2进行表连接 在连接过程中 t2的过滤条件生效

select * from t1 left join t2 on t1.id = t2.id where t2.name ='xiaoli';

查询顺序为 先查t2 此时不会以基表为准 以为where条件有过滤 所以先执行有过滤条件的表 再进行连接 如果都有where条件 以基表为准 具体查看执行计划

3.right join

select * from t1 right join t2 on t1.id = t2.id and t2.id = 1;

首先t2是基表 但是在连接的时候t2有个查询条件 如果剩下 按照基表的定义自由一条数据 很明显不符合基表数据只能多不能少的定义,所以查询条件失效 那么查询条件完全失效了吗? 相比

select * from t1 right join t2 on t1.id = t2.id ;

这种是真的的进行笛卡尔积 但是上面加条件的 只会对加上的条件进行笛卡尔积 其他id不等于1的 即不符合条件的数据 如果匹配到了t1的多条数据 则只会取一条 匹配不到数据也会存在null 猜测是一种着中的方案 加上where条件 参见left join的情况


最新回复(0)