共计 3655 个字符,预计需要花费 10 分钟才能阅读完成。
本篇内容主要讲解“SQL 中的连接操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“SQL 中的连接操作”吧!
利用连接操作,可以根据表与表之间的逻辑联系从两个或多个表中查询数据。
早期的 SQL 版本,实现连接方法是在 from 子句中给出连接操作的表名,在 where 子句中
给出连接条件。
例如,从学生、课程和成绩表中,产生课程的成绩单。from 子句列出连接运算的
3 个表,where 子句给出连接条件。在 where 子句的条件表达式中包含了连接条件和选择
条件。
例 1 从学生、课程和成绩表中,产生数据库课程的成绩单。SQL 语句是:
select 姓名,课程名,分数
from 学生 S,课程 C,成绩 G
where S. 学号 =G. 学号 AND G. 课程号 =C. 课程号 AND C. 课程名称 = 数据库
middot;SQL-92 提供更丰富的连接操作,包括:内连接、条件连接、自然连接、左外
连接、右外连接、全连接,同时增加了在 from 子句定义连接条件的方法。SQL-92 中 from
子句连接的语法格式:
from 表 1 连接类型 表 2 [on ( 连接条件)]
因此,上述产生学生数据库课程成绩单的 SQL 语句可以写成:
select 姓名,课程名,分数
from 学生 S join 成绩 G on (S. 学号 =G. 学号)
join 课程 C on (G. 课程号 =C. 课程号)
where C. 课程名称 = 数据库
middot; 这种方法不仅简化连接条件的表达方法,更重要是提高查询效率。
SQL 系统处理的逻辑顺序是:
1、from 子句中的连接条件
2、where 子句中的连接条件与选择条件
3、having 子句中的筛选条件
所以,在使用支持 SQL-92 标准的系统时,建议用 from 子句定义连接条件。
关系 R 和 S 进行连接操作,且连接条件为 P。若连接的结果中只保含 R 与 S 在 P 上相匹
配的元组,这种连接属于内连接(inner join)。用 from 子句表示内连接的方法:
from R [inner] join S [on ( 连接条件)] 其中,inner 可省略。
自然连接是等值连接的特例。
middot; 设关系 R 和 S 进行连接操作,其连接条件为 P。如果 P 是 R 与 S 中连接属性的
等值比较,称为等值连接。
middot; 若 R 与 S 进行等值连接,且 R 与 S 的连接属性名相同,称为自然连接。
middot; 自然连接的实现方法是在内连接的基础上,用 select 子句消除重复列。
有关系 R 和 S,R 与 S 的笛卡儿乘积称为交叉连接。交叉连接的实现方法:在 from 子
句中定义交叉连接类型:from R cross join S。
关系 R 与 S 进行连接操作,连接条件为 P。若连接操作的结果中除了 R 与 S 在 P 上内连
接结果之外,还包括左边关系 R 在内连接操作中不相匹配的元组,而其对应于 S 的属性赋予
空值,这种连接称为左外连接。左外连接的表示方法:from R left outer join S on
(连接条件)
关系 R 与 S 进行连接操作,连接条件为 P。若连接操作的结果中除了 R 与 S 在 P 上内连接
结果之外,还包括右边关系 S 在内连接操作中不相匹配的元组,而其对应于 R 的属性赋予空值
,这种连接称为右外连接。右外连接的表示方法:from R right outer join S on (连
接条件 )
全外连接是左外连接和右外连接的组合应用。全外连接的表示方法:from R full
outer join S on (连接条件)
自连接:连接操作可以利用别名的方法实现一个表自身的连接。实质上,这种自身连接方法与
两个表的连接操作完全相似。
一、内连接
关系 R 和 S 进行连接操作,且连接条件为 P。若连接操作的结果中只包含 R 与 S 在 P 上相匹
配的行,这种连接属于内连接(inner join)。用 from 子句表示内连接的子句:
from R [inner] join S [on ( 连接条件)]
其中,inner 可省略。假设有导师与研究生 2 个表。
例 1 查询研究生与其导师的情况。此查询涉及教师和研究生 2 个表,连接条件是:
研究生. 导师号 = 教师. 教工号。SQL 语句是:
select *from 研究生 A inner join 教师 B on A. 导师号 = B. 教工号
也可以写成等价的 SQL 语句:
select *
from 研究生 A,教师 B
where A. 导师号 = B. 教工号
说明:这是一个内连接的例子,查询结果中只包含满足连接条件的 4 行。
二、自然连接
设关系 R 和 S 进行连接操作,其连接条件为 P。如果 P 是 R 与 S 中连接属性的等值比较,
称为等值连接。若 R 与 S 进行等值连接,且 R 与 S 的连接属性名相同,称为自然连接。自然连
接是等值连接的特例。自然连接的实现方法是在内连接的基础上,用 select 子句消除重复
列。
假设有学生、课程和成绩 3 个表。例 1:根据学生、课程和成绩表的信息,输出 数
据库 课程的成绩单,包括姓名和分数。SQL 语句是:
select 姓名,分数
from 学生 A join 成绩 B on(A. 学号 =B. 学号)join 课程 C on(B. 课号 =C. 课号)
where C. 课程名 = 数据库
等价的 SQL 语句:
select 姓名,分数
from 学生 A,成绩 B,课程 C
where A. 学号 =B. 学号 AND B. 课号 = C. 课号 AND C. 课程名 = 数据库
这是一个自然连接的实例,查询结果中包含满足连接条件的 1 行,在查询结果中没有重复列。
三、交叉连接
设有关系 R 和 S,R 与 S 的笛卡儿乘积称为交叉连接。在 SQL 中,实现交叉连接的方法是在 from
子句中定义交叉连接类型:from R cross join S
例 1 学生与课程的笛卡儿乘积。
select *
from 学生 cross join 课程
等价的 SQL 语句:
select *
from 学生, 课程
四、左外连接
关系 R 与 S 进行连接操作,连接条件为 P。若连接操作的结果中除了 R 与 S 在 P 上内连接结果之外,
还包括左边关系 R 在内连接操作中不相匹配的元组,而其对应于 S 的属性赋予空值,这种连接
称为左外连接(left outer join)。
实现左外连接的 SQL 子句:from R left outer join S on (连接条件)
例 1:查询学生选课情况,包括没有选课的学生在内。SQL 语句是:
select A. 学号, A. 姓名, B. 课号, B. 分数
from 学生 A left outer join 成绩 B on(A. 学号 = B. 学号)
例 2:查询教师指导研究生的情况,包括不指导研究生的教师。SQL 语句是:
select *
from 教师 A left outer join 研究生 B on(A. 教工号 = B. 导师号)
这是两个左外连接的实例,查询结果中除了满足连接条件元组的之外,还包含左边关系不满足
连接条件的元组,而其对应的右边属性全部填充 NULL。
五、右外连接
关系 R 与 S 进行连接操作,连接条件为 P。若连接操作的结果中除了 R 与 S 在 P 上内连接结果之外,
还包括右边关系 S 在内连接操作中不相匹配的元组,而其对应于 R 的属性赋予空值,这种连接
称为右外连接(right outer join)。
实现右外连接的 SQL 子句:from R right outer join S on (连接条件)
例 1:查询所开课程的选修情况,包括没有任何学生选修的课程。SQL 语句是:
select *
from 成绩 A right outer join 课程 B on(A. 课号 =B. 课号)
例 2:查询所开课程和学生的学习状况(学号、课程名和分数),其中还包括没有任何学生选修
的课。SQL 语句是:
select 学号, 课程名, 分数
from 成绩 A right outer join 课程 B on(A. 课号 =B. 课号)
这是 2 个右外连接的实例,查询结果中除了满足连接条件元组之外,还包含右边关系不满足连接
条件的元组,而其对应的左边属性全部填充 NULL。
六、全外连接
全外连接(full outer join)是左外连接和右外连接的组合应用。实现全外连接的 SQL 子句:
from R full outer join S on (连接条件)
例 1:查询研究生和教师的情况,包括没有导师的研究生和没有指导研究生的教师。
SQL 语句是:
select *
from 研究生 A full outer join 教师 B on (A. 导师号 =B. 教工号)
这是全外连接的实例,查询结果中除了满足连接条件元组之外,还包含 2 个关系中不满足
连接条件的元组,并且这些元组对应的属性全部填充 NULL。
七、自连接
连接操作可以利用别名的方法实现一个表自身的连接。实质上,这种自身连接方法与两个表的
连接操作完全相似。假设有教学进度表,其中先修列是本门课程的先修课程。例如,先学习
数据结构 课程,再学习 数据库 课程。例 1:查询每一门课的先修课的先修课。例如,C5 的
先修课的先修课是 C6。用自连接实现查询,连接条件是:
from 教学进度 A join 教学进度 B on (A. 先修 =B. 课号)
select A. 课号,B. 先修
from 教学进度 A join 教学进度 B
on (A. 先修 =B. 课号)
到此,相信大家对“SQL 中的连接操作”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!