极品分享

[Sql Server]sql内连接和外连接

 内连接

内连接也叫连接,是最早的一种连接,最早被称为普通连接或自然连接。内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

内连接的语法:

SELECT fieldlist

FROM table1 [INNER] join table2

ON table1.column=table2.column

一个表中的行和与另外一个表中的行匹配连接。表中的数据决定了如何对这些行进行组合。从每一个表中选取一行,根据这些列的值是否相同,组合方式分为一对一、多对一和多对多的关系。

1.一对一关系

当连接的两个表,两个连接列的值完全相同,则两个表连接相当于一对一的关系。

下面在“pubs”数据库中“titles”和“titleauthor”两个表中,根据相同列“title_id”进行内连接。在查询分析器中输入的SQL语句如下:

use pubs

select *

from titles

inner join titleauthor

on titles.title_id= titleauthor.title_id

实现的过程如图1所示。

图1 内连接时一对一的关系

说明:表“titles”和“titleauthor”都是SQL Server自带的数据库“pubs”的表。由于两个表中的title_id列都是具有惟一值的索引,所以两个表的内连接属于一对一的关系。

2.多对一关系

当连接的两个表,其中一个表要连接的列出现重复值,另外一个表的值是惟一的。这时连接的两个表之间的出现了多对一的关系。

下面“student”表中的“学号”具有惟一值,而“grade”成绩表中的“学号”有重复值。现在实现这两个表的内连接。在查询分析器中输入的SQL语句如下:

use student

select *

from grade

join student

on student.学号=grade.学号?

实现的过程如图2所示。

图2 内连接时多对一的关系

3.多对多关系

当连接的两个表,要连接的列都出现重复值,这时连接的两个表之间出现多对多的关系。

本例是SQL Server自带的数据库“pubs”,其中的两个表“titles”和“roysched”中的“royalty”列都有重复值,现在实现这两个表的内连接。在查询分析器中输入的SQL语句如下:

use pubs

select *

from titles

inner join roysched

on titles.royalty=roysched.royalty

实现的过程如图3所示。

图3 内连接时多对多的关系

 

外连接则扩充了内连接的功能,会把内连接中删除表源中的一些保留下来,由于保留下来的行不同,把外连接分为左外连接、右外连接和全外连接这3种连接。

1.左外连接

左外连接保留了第一个表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。

左外连接的语法:

use student

SELECT fieldlist

FROM table1 left join table2

ON table1.column=table2.column

下面把“student”表和“grade”表左外连接,第一个表“student”有不满足连接条件的行。在查询分析器中输入的SQL语句如下:

use student

select *

from student

left join grade

on student.学号=grade.学号

实现的过程如图1所示。

2.右外连接

右外连接保留了第二个表的所有行,但只包含第一个表与第二个表匹配的行。第一个表相应空行被入NULL值。

 

右外连接的语法:

use student

SELECT fieldlist

FROM table1 right join table2

ON table1.column=table2.column

下面把“grade”表和“course”表右外连接,第二个表“course”有不满足连接条件的行。在查询分析器中输入的SQL语句如下:

use student

select *

from grade

right join course

on course.课程代号=grade.课程代号

实现的过程如图2所示。

3.全外连接

全外连接会把两个表所有的行都显示在结果表中。

全外连接的语法:

use student

SELECT fieldlist

FROM table1 full join table2

ON table1.column=table2.column

把“grade”表和“course”表实现全连接,两个表都有不满足连接条件的行。在查询分析器中输入的SQL语句如下:

use student

select * from

grade full

join course

on course.课程代号=grade.课程代号

实现的过程如图3所示。

2013-04-24 0 /
其他
/
标签: 

评论回复

回到顶部