交叉连接
交叉连接(cross join)如下所示:
select * from t1 cross join t2;
OR
select * from t1,t2;
t1 表中的每一行记录都与 t2 表中的任一行记录相关联,反之亦然。这个结果与“笛卡尔乘积”一样。
内连接
内连接(inner join)的查询结果是两张表中同时满足某个条件的组合,若不添加查询条件,那么内连接的查询结果和交叉连接的查询结果是相同的。
select * from t1 inner join t2 on t1.id = t2.id;
OR
select * from t1 join t2 on t1.id = t2.id;
OR
select * from t1 inner join t2 where t1.id = t2.id;
OR
select * from t1,t2 where t1.id = t2.id;
使用 on 或 where 指明查询条件,相当于两张表符合某个条件的交集。
若给交叉连接添加查询条件,得出的结果和内连接是相同的,但在通用 SQL 标准中,这二者是不同的。
内连接可分为等值连接和不等连接,前例展示的是等值连接,不等连接的形式如下:
select * from t1 inner join t2 on t1.id > t2.id;
查询出的结果比“等值连接”更多一些。
内连接还有一种自连接,它连接的表是它自身,如下所示:
select * from t1 t11 inner join t1 t12 on t11.id = t12._id;
OR
select * from t1 t11, t1 t12 where t11.id = t12._id;
通过指定不同的字段,把一张表作为两张表来查询。
外连接
外连接分为左外连接(left outer join)和右外连接(right outer join)。左外连接查询出的数据在同等条件下比内连接更多一些。
select * from t1 t11 left outer join t1 t12 on t11.id = t12._id;
OR
select * from t1 t11 left join t1 t12 on t11.id = t12._id;
左外连接不仅会查询出两个表中同时符合条件的记录组合,还会将 “left outer join” 左侧的表中不符合条件的记录展示出来。由于左侧表中的这部分记录不符合连接条件,因此这部分记录使用空记录进行连接。
扫描二维码关注公众号,回复: 110126 查看本文章即在左外连接中左侧表中的所有记录都会被查询出来,符合条件的记录会与右侧表中符合条件的记录相互连接组合,不符合条件的记录则与右侧表中的空记录连接。
与左外连接类似,右外连接则是将右侧表中的所有记录都展示出来,符合条件的记录会与左侧表中符合条件的记录相互连接组合,不符合条件的记录则与左侧表中的空记录连接。
select * from t1 t11 right outer join t1 t12 on t11.id = t12._id;
OR
select * from t1 t11 right join t1 t12 on t11.id = t12._id;
使用外连接查询出数据后,还可使用 where 子句对查询出的结果进行过滤,如下所示:
select * from t1 t11 right join t1 t12 on t11.id = t12._id where t11.id is not null;
过滤掉 t11.id 为 null 的记录。
联合查询
联合查询(union)是把多个查询语句的查询结果集中在一起展示。
select * from t1 union select * from t2;
t2 表中的数据会接在 t1 表后显示,因此两个 select 语句查询出的字段数量必须相同。
若两个表中有重复的数据,那么会被合并为一条记录。
使用 union all 进行查询时,重复的记录全部都会被展示出来。
全连接
在全连接(full join)中,只要某个表匹配条件,就会返回记录,并使用 null 作为缺失匹配的结果。MySQL 并直接不支持 “full join” 关键字,但可通过 “left join”、“union” 以及 “right join” 的组合来实现 “full join”。
select * from t1 t11 left join t1 t12 on t11.id = t12._id;
union
select * from t1 t11 right join t1 t12 on t11.id = t12._id;
查询出的数据包含 t1 和 t2 表中匹配条件的任一行。
对于查询出的数据,也可使用 where 子句进一步的过滤。