1、多表查询的分类:
(1)内连接:join,inner join
(2)外连接:left join,left outer join,right join,right outer join,union
(3)交叉连接:cross join
2、实例:
两张表a,b:
表a:
表b:
(1)内连接查询,查询公共部分
SELECT
a.*, b.*
FROM
a
JOIN b ON a.id = b.id
查询结果:
(2)外连接查询,分为很多种情况:
A、left join和left outer join:
SELECT
a.*, b.*
FROM
a
LEFT JOIN b ON a.id = b.id
查询a表的全部数据,其中b表中和a表id重叠的部分被查询到,b表中没有的部分以Null填充
B、right join和right outer join:
SELECT
a.*, b.*
FROM
a
RIGHT JOIN b ON a.id = b.id
两种查询方式类似,这个是查询b表的全部内容,a表没有的部分用Null填充
另外有一种情况是查询a表或b表的属于自己独有的数据,这时候只要加上where a.id is null 或者where b.id is null 如:
SELECT
a.*, b.*
FROM
a
RIGHT JOIN b ON a.id = b.id
WHERE
a.id IS NULL
C、union
查询全部数据,可以避免笛卡尔积现象,如
SELECT
a.*, b.*
FROM
a,b
会造成笛卡尔积现象
使用union可以避免这种现象:
SELECT
a.*, b.*
FROM
a
LEFT JOIN b ON a.id = b.id
UNION
SELECT
a.*, b.*
FROM
a
RIGHT JOIN b ON a.id = b.id
如果想查询两张表公共部分之外的内容可以使用where来实现,如:
SELECT
a.*, b.*
FROM
a
LEFT JOIN b ON a.id = b.id
WHERE
b.id IS NULL
UNION
SELECT
a.*, b.*
FROM
a
RIGHT JOIN b ON a.id = b.id
WHERE
a.id IS NULL
(3)交叉连接cross join ,查询笛卡尔积,如:
SELECT
a.*, b.*
FROM
a
CROSS JOIN b
使用cross join时也可以使用on进行条件限制,和使用where的效果一样