文章收藏了关于mysql left join,right join各种查询语句,下面有需要的同学可以参考一下下。
在sql标准中规划的(join)联结大致分为下面四种:
1. 内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
2. 外联结:分为外左联结和外右联结。
左联结a、b表的意思就是将表a中的全部记录和表b中联结的字段与表a的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表a的全部记录。
右联结a、b表的结果和左联结b、a的结果是一样的,也就是说:
代码如下 复制代码
select a.name b.name from a left join b on a.id=b.id
和select a.name b.name from b right join a on b.id=a.id
执行后的结果是一样的。
3.全联结:将两个表中存在联结关系的字段的所有记录取出形成记录集的联结(这个不需要记忆,只要是查询中提到了的表的字段都会取出,无论是否符合联结条件,因此意义不大)。
4.无联结:不用解释了吧,就是没有使用联结功能呗,也有自联结的说法。
这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用a左联结b则a中所有记录都会保留在结果中,此时b中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实大家回忆高等教育出版社出版的《系统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。
mysql支持select和某些update和delete情况下的join语法,具体语法上的细节有:
代码如下 复制代码
table_references:
table_reference [, table_reference] …
table_reference:
table_factor
| join_table
table_factor:
tbl_name [[as] alias]
[{use|ignore|force} index (key_list)]
| ( table_references )
| { oj table_reference left outer join table_reference
on conditional_expr }
join_table:
table_reference [inner | cross] join table_factor [join_condition]
| table_reference straight_join table_factor
| table_reference straight_join table_factor on condition
| table_reference left [outer] join table_reference join_condition
| table_reference natural [left [outer]] join table_factor
| table_reference right [outer] join table_reference join_condition
| table_reference natural [right [outer]] join table_factor
join_condition:
on conditional_expr | using (column_list)
上面的用法摘自权威资料,不过大家看了是否有点晕呢?呵呵,应该问题主要还在于table_reference是什么,table_factor又是什么?这里的table_reference其实就是表的引用的意思,因为在mysql看来,联结就是一种对表的引用,因此把需要联结的表定义为table_reference,同时在sql standard中也是如此看待的。而table_factor则是mysql对这个引用的功能上的增强和扩充,使得引用的表可以是括号内的一系列表,如下面例子中的join后面括号:
代码如下 复制代码
select * from t1 left join (t2, t3, t4) on (t2.a=t1.a and t3.b=t1.b and t4.c=t1.c)
这个语句的执行结果和下面语句其实是一样的:
代码如下 复制代码
select * from t1 left join (t2 cross join t3 cross join t4)
on (t2.a=t1.a and t3.b=t1.b and t4.c=t1.c)
这两个例子不仅让我们了解了mysql中table_factor和table_reference含义,同时能理解一点cross join的用法,我要补充的是在mysql现有版本中cross join的作用和inner join是一样的(虽然在sql standard中是不一样的,然而在mysql中他们的区别仅仅是inner join需要附加on参数的语句,而cross join不需要)。