论文部分内容阅读
摘要:本文对SQL语言中的自身连接进行了详细的论述,讨论了自身连接存在的必要性,并通过实例对SQL中自身连接查询进行了深入的剖析。
关键词:SQL 自连接 连接查询
一、连接查询
在SQL中,如果一个查询同时涉及到两个以上的表,那么这种查询就称为连接查询。连接有多种形式,有等值连接、自然连接、非等值连接、外连接、复合条件连接和自身连接等。
大多数的连接,都是涉及到不同的表,以下面的SQL代码为例:
SELECT Student.SNumber, Student.SName, StuCour.*
FROM Student, StuCour
WHERE Student.SNumber=StuCour.SNumber;
在上面的SQL代码中,有两个表:学生信息表Student(SNumber, SName, SSex, SAge)和学生选课信息表StuCour(SNumber, CNumber, Grade),这两个表都有一个代表学生学号的叫做SNumber的属性。查询结果是将Student表和StuCour表中SNumber相同的学生的学号、姓名和选课信息显示出来。
这种连接查询,使用多个表格,并利用了不同表格中相应的列的逻辑关系,SQL代码简单、清楚、明了。但连接操作,并不只存在于多个表之中,有时,对单表进行查询操作时,也必须使用连接操作。
二、用SQL自连接查询处理列之间的关系
SQL自身连接,可以解决很多问题。下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系。SQL代码如下:
SELECT FIRST.CNumber, SECOND.PCNumber
FROM Course FIRST, Course SECOND
WHERE FIRST.PCNumber=SECOND.CNumber;
在这个代码中,只涉及到一个表,即课程信息表COURSE(CNumber, CName, PCNumber),其中CNumber是该课程的课程号,PCNumber是该课程的先修课课程号。在FROM子句中,为Course表起了两个不同的别名,即FIRST和SECOND,即为Course表创建了两个不同的实例。查询时,使用了条件语句WHERE,要求FIRST表中的先修课号PCNumber同SECOND表中的课程号CNumber相同,而查询所需要的结果,是FIRST表的课程号CNumber和SECOND表中的PCNumber,那么查询结果,就应该是FIRST表中的课程号CNumber和该课程号所对应的间接先修课课程号。
在这里例子中,连接的操作对象只有Num这一个列,通过相同的车次号,找出该列车联通的任意两个城市的信息。在这个例子中,原来表Route中的每一个元组,只能表示车号和该车的某一站点的信息,实际上,这是“1Vs1”的映射关系。如果要表示两个站点的联通关系,那么就应该把两个“1Vs1”关系合并,形成“1Vs多”的关系。我们利用自连接,很容易地解决了这个关系扩充的问题。
下面的这里例子,是对单一的列进行连接处理:
SELECT FIRST.Num, SECOND.Num, FIRST.Stop
FROM Route FIRST, Route SECOND
WHERE FRIST.Stop=SECOND.Stop;
上面的SQL代码,求出了路经相同城市的车次的信息。原表中的车次和车站是“1Vs1”关系,通过自连接后,得到了车次和车站的“多Vs1”关系。
总结
同其它连接相比,SQL自连接查询本身并没有什么特殊的。但是,在应用中,自连接查询因为其语法结构简单,而逻辑结构复杂,语义往往不是那么容易被人理解,因此,在使用时,经常令人觉得迷惑不解。但只要把自连接运用的得当,把单表看成是多表,牢固树立这一思维定式,我们会发现,自连接查询会为我们解决很多复杂的问题。
参考文献:
[1]何明. 从实践中学习ORACLE/SQL. 清华大学出版社.
[2]施伯乐,丁宝康. 数据库系统教程. 高等教育出版社.
[3]王海亮,张立民,王海凤,郑建茹.精通Oracle 10g SQL和PL/SQL. 中国水利水电出版社.
关键词:SQL 自连接 连接查询
一、连接查询
在SQL中,如果一个查询同时涉及到两个以上的表,那么这种查询就称为连接查询。连接有多种形式,有等值连接、自然连接、非等值连接、外连接、复合条件连接和自身连接等。
大多数的连接,都是涉及到不同的表,以下面的SQL代码为例:
SELECT Student.SNumber, Student.SName, StuCour.*
FROM Student, StuCour
WHERE Student.SNumber=StuCour.SNumber;
在上面的SQL代码中,有两个表:学生信息表Student(SNumber, SName, SSex, SAge)和学生选课信息表StuCour(SNumber, CNumber, Grade),这两个表都有一个代表学生学号的叫做SNumber的属性。查询结果是将Student表和StuCour表中SNumber相同的学生的学号、姓名和选课信息显示出来。
这种连接查询,使用多个表格,并利用了不同表格中相应的列的逻辑关系,SQL代码简单、清楚、明了。但连接操作,并不只存在于多个表之中,有时,对单表进行查询操作时,也必须使用连接操作。
二、用SQL自连接查询处理列之间的关系
SQL自身连接,可以解决很多问题。下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系。SQL代码如下:
SELECT FIRST.CNumber, SECOND.PCNumber
FROM Course FIRST, Course SECOND
WHERE FIRST.PCNumber=SECOND.CNumber;
在这个代码中,只涉及到一个表,即课程信息表COURSE(CNumber, CName, PCNumber),其中CNumber是该课程的课程号,PCNumber是该课程的先修课课程号。在FROM子句中,为Course表起了两个不同的别名,即FIRST和SECOND,即为Course表创建了两个不同的实例。查询时,使用了条件语句WHERE,要求FIRST表中的先修课号PCNumber同SECOND表中的课程号CNumber相同,而查询所需要的结果,是FIRST表的课程号CNumber和SECOND表中的PCNumber,那么查询结果,就应该是FIRST表中的课程号CNumber和该课程号所对应的间接先修课课程号。
在这里例子中,连接的操作对象只有Num这一个列,通过相同的车次号,找出该列车联通的任意两个城市的信息。在这个例子中,原来表Route中的每一个元组,只能表示车号和该车的某一站点的信息,实际上,这是“1Vs1”的映射关系。如果要表示两个站点的联通关系,那么就应该把两个“1Vs1”关系合并,形成“1Vs多”的关系。我们利用自连接,很容易地解决了这个关系扩充的问题。
下面的这里例子,是对单一的列进行连接处理:
SELECT FIRST.Num, SECOND.Num, FIRST.Stop
FROM Route FIRST, Route SECOND
WHERE FRIST.Stop=SECOND.Stop;
上面的SQL代码,求出了路经相同城市的车次的信息。原表中的车次和车站是“1Vs1”关系,通过自连接后,得到了车次和车站的“多Vs1”关系。
总结
同其它连接相比,SQL自连接查询本身并没有什么特殊的。但是,在应用中,自连接查询因为其语法结构简单,而逻辑结构复杂,语义往往不是那么容易被人理解,因此,在使用时,经常令人觉得迷惑不解。但只要把自连接运用的得当,把单表看成是多表,牢固树立这一思维定式,我们会发现,自连接查询会为我们解决很多复杂的问题。
参考文献:
[1]何明. 从实践中学习ORACLE/SQL. 清华大学出版社.
[2]施伯乐,丁宝康. 数据库系统教程. 高等教育出版社.
[3]王海亮,张立民,王海凤,郑建茹.精通Oracle 10g SQL和PL/SQL. 中国水利水电出版社.