多表关联查询常用的有内连接inner join 、外连接 out join,交叉连接 cross join通常无现实意义,不常用。为了更好的理解多表连接查询,可以借助集合的概念做一个类比就能很好的理解多表连接结果集。
首先看内连接 inner join :
select * from a inner join b on a.id =b.id 结果是a和b关于id的交集。
经常用的 sql语句 select * from a,b where a.id =b.id 也是内连接语句。
内连接可以分为等值连接、不等连接、自然连接、自连接等类型
等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,查询结果把两个表中重复的列去除。
自连接:把一张物理表分为逻辑的两张表进行连接 select * from a inner join a(b) on a.id = b.cid
外连接:在内连接的基础上,还包含左表、右表、左表和右表中所有不符合条件的数据行。
外连接分为左(外)连接 left outer join、右(外)连接right outer join和全(外)连接 full(outer) join 。
左连接结果集:左边的表A的全部信息和A,B两张表的交集,左边A表的全部包含A表中在B表中没有对应关系的信息,右表没有对应记录的字段都为空。
右连接结果集:右边的表B的全部信息和A,B两张表的交集,右边B表的全部包含B表中在A表中没有对应关系的信息,左表没有对应记录的字段都为空。
全连接结果集:返回左表和右表中的所有行;当某行在另一个表中没有匹配行时,则另一个表的对应列为空值;如果表之间有匹配行,则结果集行包含两个表的数据值;全连接与 左连接 union 右连接 结果集一致。
交叉连接:又叫笛卡尔连接,得到的结果是两张表的笛卡尔积,也就是用A表中的每条数据都去匹配B表中的所有数据。不加条件的内连接就是笛卡尔连接。
多表连接查询的执行顺序:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
特别注意:使用连接查询时,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中,同一个条件放在on 后面和where后面结果集是不同的。
想要学习更多,请扫描下方二维码,移步知识星球,查看各种连接使用的场合: