21.表连接
表连接就像连接两张数据表的连线,线的两端是分别在两张表的特定字段上的。首先创建所需要的数据表,插入数据:
create table T_Author ( FId varchar(20), --作者Id FName varchar(100), --姓名 FAge int, --年龄 FEmail varchar(20)--邮箱 ); create table T_Book ( FId varchar(20), --图书编号 FName varchar(100), --图书名称 FPageCount int, --页数 FAuthorId varchar(20) --作者Id ); insert into T_Author(FId,FName,FAge,FEmail) values('1','lily',20,'lily@cownew.com'); insert into T_Author(FId,FName,FAge,FEmail) values('2','kingchou',23,'kingchou@cownew.com'); insert into T_Author(FId,FName,FAge,FEmail) values('3','stef',28,'stef@cownew.com'); insert into T_Author(FId,FName,FAge,FEmail) values('55','sisi',28,'sisi@cownew.com'); insert into T_Author(FId,FName,FAge,FEmail) values(null,'papa',28,'papa@cownew.com'); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('1','About Java',300,'1'); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('2','Inside Ruby',330,'2'); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('3','Inside Curses',200,'3'); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('4','Python In Action',450,'1'); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('5','WPF Anywhere',250,'2'); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('6','C# KickStart',280,'3'); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('7','Compling',800,null); insert into T_Book(FId,FName,FPageCount,FAuthorId) values('8','Faster VB.Net',300,'100');
1.内连接
内连接将两张或多张表进行横向的拼接,将满足on指定条件的数据进行保留,内连接是默认的连接方式:
select T_Author.FName as 作者姓名,T_Book.FName as 图书名称,T_Book.FPageCount as 图书页数,T_Author.FId as 关联字段 from T_Author inner join T_Book on T_Author.FId=T_Book.FAuthorId
在执行内连接的时候,类似于对T_Book表进行遍历,当遍历的I条记录的时候,根据on指定的条件去T_Author表中去查询符合条件的记录。如遍历到第6条记录C# KickStart这时FAuthorId为3,然后去T_Author表中查找FId为3的记录,存在的话就将二者横向连接成为一条记录。最后一条记录的FAuthorId=100,根据T_Author.FId = T_Book.FAuthorId不能在T_Author表中获取匹配项,那么将舍弃这个记录。另外Null值不进行这种连接。
2.不等值连接
等值连接是在这种连接的ON子句的条件包含一个等号运算。等值连接是最常用的连接,因为它指定的连接条件是一个表中的一个字段必须等于另一个表中的一个字段。不等值连接是在连接的条件中可以使用小于(<)、大于(>)、不等于(<>)等运算符,而且还可以使用Like、Between And等运算符,甚至还可以使用函数。此外on之后还可以通过and来为连接设置多个条件。
3.交叉连接
交叉连接将涉及到的所有表中的所有记录都包含在结果集中。可以采用两种方式来定义交叉连接,分别是隐式的和显式的。
隐式:
select T_Author.FName as 作者姓名,T_Book.FName as 图书名称,T_Book.FPageCount as 图书页数,T_Author.FId as 关联字段 from T_Author,T_Book
显式:
select T_Author.FName as 作者姓名,T_Book.FName as 图书名称,T_Book.FPageCount as 图书页数,T_Author.FId as 关联字段 from T_Author cross join T_Book
4.自连接
参与连接的表完全可以是同一样表,也就是表与其自身相连接,这样连接就被称为自连接。自连接并不是独立于交叉连接、内连接、外连接等这些连接方式之外的另外一种连接方式,而只是这些连接方式的一种特例,也就是交叉连接、内连接、外连接等连接方式中只要参与连接的表是同一张表,那么它们就可以被称为自连接。其主要用途就是检索一张表内部的匹配情况。
5.外部连接
外部连接用于保留空值和不匹配的值,这样可以指定某个表中的记录总是放到结果集中。根据哪个表中的记录总是放到结果集中,外部连接分为三种类型:右外部连接(right outer join=right join)、左外部连接(left outer join=left join)和全外部连接(full outer join=full join)。
右外连接:右外部连接中不管是否成功匹配连接条件都会返回右表中的所有记录。
select T_Author.FName as 作者姓名, T_Book.FName as 图书名称,T_Book.FPageCount as 图书页 from T_Book right outer join T_Author on T_Book.FAuthorId=T_Author.FId
左外连接:左表中所有的记录都会被放到结果集中,无论是否在右表中存在匹配记录。
select T_Author.FName as 作者姓名, T_Book.FName as 图书名称,T_Book.FPageCount as 图书页 from T_Book left outer join T_Author on T_Book.FAuthorId=T_Author.FId
全外部连接:全外部连接是左外部连接和右外部连接的合集,因为即使在右表中不存在匹配连接条件的数据,左表中的所有记录也将被放到结果集中,同样即使在左表中不存在匹配连接条件的数据,右表中的所有记录也将被放到结果集中。
select T_Author.FName as 作者姓名, T_Book.FName as 图书名称,T_Book.FPageCount as 图书页 from T_Author full outer join T_Book on T_Book.FAuthorId=T_Author.FId