多表查询可以分为
什么是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和不包含的行组成新的行加入到新表中