SQL中的连接操作
本篇内容主要讲解“SQL中的连接操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL中的连接操作”吧!
利用连接操作,可以根据表与表之间的逻辑联系从两个或多个表中查询数据。
早期的SQL版本,实现连接方法是在from子句中给出连接操作的表名,在where子句中
给出连接条件。
例如,从学生、课程和成绩表中,产生课程的成绩单。from子句列出连接运算的
3个表,where子句给出连接条件。在where子句的条件表达式中包含了连接条件和选择
条件。
例1 从学生、课程和成绩表中,产生数据库课程的成绩单。SQL语句是:
select 姓名,课程名,分数
from学生S,课程C,成绩G
where S.学号=G.学号AND G.课程号=C.课程号AND C.课程名称='数据库'
·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.课程名称='数据库'
· 这种方法不仅简化连接条件的表达方法,更重要是提高查询效率。
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可省略。
自然连接是等值连接的特例。
·设关系R和S进行连接操作,其连接条件为P。如果P是R与S中连接属性的
等值比较,称为等值连接。
·若R与S进行等值连接,且R与S的连接属性名相同,称为自然连接。
·自然连接的实现方法是在内连接的基础上,用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中的连接操作”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341