sql-多表查询

一:外连接

1.左外连接(left join)

select * from A left join B on A.id=B.a_id            结果如下

 很明显,A表的所有数据都显示出来了,而与A表id相同的不同记录就是这次联表的行数

而A表中并没有id为5的记录,所以B表的a_id=5的记录不会显示

反而A表中id为4的记录(B表没有对应),被联表查出来了,因为B表没有对应,所以B表的字段显示为NULL

总结:(left join以两表的id和a_id为准)

①两者都有时,从A表相同的第一条开始算,B表有多少与这条一样的就都加入联表的条数

②只有A表的id有这个值,则联表中插入一条,B表的记录全为NULL的记录

③只有B表的a_id有这个值,则联表不会有这个记录

④左联表中,左边的表一定全都显示,右边的不一定

⑤实际中,我们可以这样操作

select A.id,A.name,B.a_score from A left join B on A.id=B.a_id

 

2.右外连接(righ join)

这个则反过来,右表是左连接的左表的意思

3.完全外连接(full join)

此时,左右表都会显示在联表中,左表的记录右表没有则显示NULL,右表的记录左表没有也显示NUll

select * from A full join B on A.id=B.a_id

当然,mysql是不支持full join或者full outer join的 我们可以用left right union来完成

SELECT * from A LEFT JOIN B ON A.id=B.a_id
UNION
SELECT * from A RIGHT JOIN B ON A.id=B.a_id

 二:内连接

inner join  只会返回条件相同的行

SELECT * FROM A INNER JOIN B on A.id=B.a_id

这个就和 select * from A,B where A.id=B.a_id  一样了

cross join(交叉连接)

select * from A cross join B

结果太长就不显示了,A的行数乘以B的行数就是了

当然加上 on A.id=B.a_id  就变成inner join 的结果了

三:UNOIN

这个操作符可以合并两个或多个 SELECT 语句的结果集。

当然前提这两个语句的列数量相同,类型相同

猜你喜欢

转载自www.cnblogs.com/xiaobo520/p/10454301.html