多表联查时,有些数据没有对应另一个表的数据,即对应为空。

內连接:仅选出两张表中互相匹配的记录,有对应为空的则筛选出去,这些数据就不会被搜索出来。内连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来。

语法:select 字段 from 表1 inner join 表2 on 条件;

select * from 表1,表2where 条件    from后面直接写两个表名,这样写等价于内连接 如果不写 where 条件,相当于笛卡尔积,即输出表1所有数据对应表2所有数据的结果。

外连接:包括左连接、右连接等。

        左连接:会保留一部分对应为空的数据,语法为select 字段 from 表1 left join 表2 on 条件,只返回左表(即表1)中不符合连接条件单符合查询条件的数据行,即所有表1的数据。

        右连接:和左连接相反,会保留一部分对应为空的数据,语法为select 字段 from 表1 right join 表2 on 条件,只返回右表(即表2)中不符合连接条件单符合查询条件的数据行,即所有表2的数据。

WHERE条件放在ON后面查询的结果是不一样的。

ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。
WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:
ON只进行连接操作,WHERE只过滤中间表的记录。

此段转自:深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接 - New.Young - 博客园

eg:

学生表

班级表

 学生表的classid和班级表的id对应,关系为多对一  

内连接:

select * from student inner join classes on student.classid=classes.id

结果:

左连接(推荐): 

select * from student left join classes on student.classid=classes.id

结果:

可见,左表的数据是全的 

右连接:

select * from student right join classes on student.classid=classes.id

结果:

可见右表的数据是全的

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐