SQL Sever 查询语句

上节的查询都是针对一个表进行的。若一个查询涉及两个以上的表时,则称为连接查询。连接查询包括:

1、等值连接查询

2、自然连接查询

3、非等值连接查询

4、自身连接查询

5、外连接查询

6、复合条件查询

首先先看一下我数据库中的表

                              

(图一)学生选课情况                                                        (图二)学生

 

下面我们开始

1、  等值与非等值连接查询

现在我要查询学生表和学生选课情况

select student.*,sc.*
from student,sc wherestudent.studentId=sc.Sno;

结果如图:

 

*这里select子句和where子句中的属性名前都加上了表名前缀,是为了避免混淆。如果属性名在参加连接的各表中是惟一的,则可以省略前缀。

 

查询顺序为:首先在studen.studentId中设立指针,指针从上到下移动。指针每移动一次,在SC表中扫描一遍,寻找符合student.studentId=sc.Sno的元组拼接到一起。

 

下面我们改变一下顺序:

select sc.*,student.*
from student,sc wherestudent.studentId=sc.Sno;

结果如图:

 

可以看到这里是在sc.sno中设立指针,指针从上到下移动。指针每移动一次,在student表中扫描一遍,寻找符合student.studentId=sc.Sno的元组拼接到一起。

 

顺便一说,如果在sc表Sno中建立索引的话,就不用每次全表扫描sc表了,而是根据sno值通过索引找到SC组。所以一般用索引查询sc满足条件的元组一般会比全表扫描快。

 

非等值连接查询就是把上面的等号改成其他符号。当然where语句中并不是只能说等值或是非等值,可以用and把条件连接起来组成符合条件。

例如:select sc.*,student.*
from student,sc
where student.studentId=sc.Sno and sc.Grade>60;(找寻及格的人)

结果如图:


我们看到Sno与studentId重复了,想要去掉studentId的话很简答,在select中进行选择即可。

select student.*,sc.Cno,sc.Grade
from student,sc
where student.studentId=sc.Sno and sc.Grade>60;

结果如图:

2、自身连接

自身连接的重点在于给一个表起两个名,我们先来看一下表:

 

执行

select c1.cno,c2.cpno from Course c1,coursec2 where c1.cpno=c2.cno;

查询每一门课的间接先修课(先修课的先修课)

结果如图:

我们可以看到没有“先修课的先修课”的课程并没有输出。那么我们如果想让没有结果的也输出该怎么办呢?接下来我们讲外连接。

 

3、  外连接

在通常的连接操作中,只有满足连接条件的元组才会输出。但有时我们想查看那些结果为NULL的元组,这时就需要外连接了。

select student.*,sc.Cno,sc.Grade
from student left outerjoin sc on
(student.studentId=sc.Sno );

输入<aTableName>leftouter join <otherTableName> on(condition);查看允许左表外连接后的连接表;

结果如图:

我们可以看到,没有选课的同学也出现在表中了。

同理还有右连接right outer join和全连接full outer join。中间的outer可以不要,如left join、full join。

 

4、多表连接

多表连接十分简单,就是之前的两个表可以变成多个表。

select student.studentId,student.studentName,course.Cname,sc.Grade
from student,course,SC
where student.studentId=sc.Sno and sc.Cno=course.cno;

这个很容易看懂,上面那个选择属性(也就是列),中间从哪个表选出,下面约束条件。

结果如图:

展开阅读全文

没有更多推荐了,返回首页