前面的几章节,我们介绍了mysql数据库的单表查询语句,一般情况下,我们只需要单表查询就足够了。但是,mysql数据库是关系型数据库,很多时候,一个单元数据信息可能会存放在不同的数据表中,如:wordpress的数据库,文章主体信息存放在wp_posts表中,文章自定义字段存放在wp_postmeta表中。这时,要想查询文章全部信息时,就需要多表查询。本章将介绍多表查询之连接查询。连接查询有以下几种。
案例1:boy表和girl表;杨过与小龙女一对,陈冠希与张柏芝一对,他们的id号相同。通过连接查询来把2个表关联起来。
1:内连接查询:inner join ... on
用inner join连接2个表,on是查询条件,2个表中符合条件的都显示出来。如下:
select * from boy inner join girl on boy.id=girl.id;
查询2个表中id相等的数据。查询结果如下:
2:左连接查询:left join ... on
左连接查询2个表,左边的表全部显示,右边的表只显示符合条件的数据。
select * from boy left join girl on boy.id=girl.id;
查询结果如下图,左边表不符合条件的“吊丝”也显示出来了,右边表不符合条件的被排除掉:
3:右连接查询:right join ... on
右连接,右边的表的数据全部显示,左边的表只显示符合条件的。
select * from boy right join girl on boy.id=girl.id;
查询结果如下图,
4:合并连接:union 或 union all
合并连接要求:select获取2个表的列(字段)数必须相同。字段名不需要相同。
union与union all的区别:
union会合并2个表中字段值完全相同的行,合并是相当耗时的,所以,一般使用union all。union all不会合并值完全相同的行。
案例:把下面的a表和b表合并,并且把id相同的num相加
查询语句如下:
select id,sum(num) from (select * from a union all select * from b) as gk group by id;
查询结果如下:
从上图中,我们可以看到,a表和b表中id相同的数据合并了,并把num值相加。