内连接
内连接也叫连接,是最早的一种连接,最早被称为普通连接或自然连接。内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
内连接的语法:
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所示。
图2 右外连接
通俗的讲:
A left join B 的连接的记录数与A表的记录数同
A right join B 的连接的记录数与B表的记录数同
A left join B 等价B right join A
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所示。