表与表的连接总体分为三类:
内连接:inner join
外连接:left join 、right join、full join、
交叉连接:cross join
下面将一一介绍
先建表a 和b
create table a (col int,coll int)
insert into a values(1,10)
insert into a values(2,20)
insert into a values(3,30)
insert into a values(4,40)
insert into a values(5,50)
go
create table b (col int,coll int)
insert into b values(1,10)
insert into b values(6,20)
insert into b values(7,30)
insert into b values(8,40)
insert into b values(2,50)
首先介绍内连接 inner join
select * from a inner join b on a.col=b.col
他返回了两个表中符合关联条件的结果
接下来是外连接 left outer join / right outer join / full outer join
在实际应用中可以直接写left join 可以省掉outer。
select * from a left outer join b on a.col=b.col
他返回了左边的所有行,如果右边有匹配的值就显示,没有匹配的值就以null值返回
select * from a right outer join b on a.col=b.col
和左连接相返,以右表为主,返回右表的所有行,如果左表有匹配值就返回,没有匹配值以null值返回
select * from a full outer join b on a.col=b.col
返回两个表的所有结果,没匹配的以null返回,相当于left join的结果加上right join的结果
--exec sp_dbcmptlevel dbname,80 设置数据库的兼容级别
select * from a,b where a.col*=b.col
这是左连接的简化写法。
select * from a,b where a.col=*b.col
右连接的简化写化。
在sql2000中支持,要在2005 或2008中使用请先设置数据库的兼容级别
接下来是交叉连接 cross join
select * from a cross join b
在不加where条件的情况下,返回两表的笛卡尔乘积a表5行,b表5行,返回25行
where a.col=b.col
加了where 条件后,和inner join的结果一样,满足条件的才会返回。和inner join的区别是,内连接必须有关联条件,而交叉连接可以不要条件。
select * from a,b where a.col=b.col
这是cross join的简化写法。
另外,表和本身也可以连接使用,叫做自连接。
select * from a where coll=coll
返回coll值一样的结果,如果coll某行的值在整个表中只有一条记录,则不返回。