SQL连接操作(一)

2014-11-24 08:40:55 ? 作者: ? 浏览: 2

利用连接操作,可以根据表与表之间的逻辑联系从两个或多个表中查询数据。

早期的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语句是:

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: