在有些场景下需要我们对两个表里的结果进行查询,这个时候就需要连接查询了。连接查询其实就是对两个表记录做笛卡尔乘积。如果不指定连接条件的话,则会对每行都做笛卡尔乘积,这样最后返回的结果树就会是两个表记录数的乘积;如果指定则,则仅对符合列条件的行进行笛卡尔乘积,并返回结果。在这里可以指定两个列相等,也可以自定两个列其他逻辑关系,而且也可以指定多个列通过or或者and进行连接。

 

mysql中主要可以使用如下几种join语法

1:join、inner join、cross join;语法select * from A inner join B on A.id = B.A_ID,返回匹配的行

2:left join;语法 select * from A left join B on A.id = B.A_ID,即使右表中没有匹配,也返回左表的所有的行,右表没匹配的都为null;

3:right join ;语法select * from A right join B on A.id = B.A_ID,即使左表中没有匹配,也返回右表所有的行,左表没匹配的都为null。

对于join语法有以下几点需要注意。

1:在mysql中,cross join可以由join或者inner join实现,这和mysql的实现是有关系的。对于cross join操作,是仅作笛卡尔积而没有过滤条件,就是说没有on关键字;对于join与inner join是有on关键字的。当使用join或者inner join而不使用on关键字,那么其作用就和cross join的作用一样了。

2:在mysql中没有out join,其实left join相当于left out join,同样对于right join也是类似。

3:对于mysql中join语法与两个表使用逗号隔开是一样的,也就是说select * from A join B = select * from A, B

4:当不是返回所有列的时候,必须指定某个表的某一列。select name from A join B on A.id = B.id则会报语法错误,必须对name前加上表格限定。

 

具体使用,现在有两个表person与comment表格:

mysql join 走的inner join 吗 mysql inner join where_连接查询

mysql join 走的inner join 吗 mysql inner join where_连接查询_02

 

 

 

 

 

 

场景1,inner join

mysql join 走的inner join 吗 mysql inner join where_连接查询_03

可以看出,它只返回了相应的匹配的行,对没有匹配的行它没有把值返回。这里是针对了两个表的某一列进行连接,如果不指定列则会返回六条记录

场景2:left join

mysql join 走的inner join 吗 mysql inner join where_返回结果_04

可以看出我们是利用comment left join person的,按照前文说的left join的 时候是按照左表来返回结果,而不管右表是否存在相应的匹配内容。通过开始的查询看到comment

含有三条记录,对于comment表中id=3的记录,在person表中没有对应的person,但是它还是返回了,只是返回的结果都为null。

场景3:right join

mysql join 走的inner join 吗 mysql inner join where_返回结果_05

现在采用了right join,则查询结果是按照右表返回的。在右表person表中只有两条记录,所以只返回了两条记录。对于comment表中有而person表中没有的记录则直接忽略。