多表查询可以分为

什么是join

join具有连接的作用,即当两个以上的表有关系时,需要用join来连接这些相关的表,来处理或分析数据。

join的作用:连接

这里有两张表,使用join将两个表连接,不会改变原来的表


rili join ret 会生成一个新表


select *from rili join ret; from先查找rili表,让后join 把 ret 添加上来 rili表+ret表

join后的列名是两个表列名加起来的,可能会出现相同的列名,如id和name

rili的每一行数据与ret中的所有数据不断拼接

然后再用rili的第二行去和ret中的每一行数据拼接,以此类推

表rili共3行,表ret共2行,所以2*3=6行

如果不想产生表1中的每一行都与表2中的所有数据不断拼接

则需要在join 后加入 on

即join rili on 条件

on的用法:添加约束

select * from ret join rili on rili.id=ret.id;

当只有join时,其后面的on可以用where替换

select * from ret join stu where stu.id=ret.id;


一般join 都是与on连用的

即:join on

外连接

左外连接(left join)

left join 必须有on

left join 会检查左边表的数据是否都包含在新生成的表中

若是:则和join一样

若不是:则用NULL和不包含的行组成新的行加入到新的表中


select * from rili left join ret on rili.id=ret.id;

select *from ret left join ret on rili.id =ret.id;

left join 左右两边的表是不能交换的,交换过后,意思会变

但join左右两边的表可以交换,意思不变

右外连接(right join)

right join 也必须有on

right join会检查右边表的数据是否都包含在新生的表中

若是:则和join没有区别

若不是:则用NULL和不包含的行组成新的行加入到新表中


select * from ret join rili on ret.id=rili.id;

select *from  rili join ret on ret.id=rili.id;

总结:

简单来说:就是看左表的行数是否与右边的行数相等,两边数据是否一样多,如果缺少则用NULL来补足

如果是左外连接则左表为主表,右表为副表

如果是右外连接则右表为主表,左表为副表

根据主表来决定副表的多少,副表与主表一样多

可以根据以下来快速分析

A right join B:是以B为基准

B left join A:也是以B为基准的

join:将两个表按照条件连接起来

left join:以左表为基准,看左表的数据是否都包含在新生成的表中,

若是:则和join一样

若不是:则用NULL和不包含的行组成新的行加入到新表中;

right join:以右表为基准,看右边表的数据是否都包含在新生成的表中

若是:则和join一样

若不是:则用NULL和不包含的行组成新的行加入到新表中