杨浩宇
(昆明工业职业技术学院,云南 昆明 650302)
数据查询作为数据库操作的重点,也一直是学习者的学习重点,多表查询则是其中不可回避的重点与难点。本文以一个学生数据库(Student)为例讨论几种实现多表查询的方式。
Studen中有三张表:stuinfo(学生信息表),用于存放学生基本信息;course(课程信息表),用于存放课程信息;score(成绩表)用于存放学生各课程的考试成绩,具体结构如下:
表1 学生信息表结构
表2 课程信息表结构
表3 成绩表结构
对于这三张表的多表查询主要集中在成绩的统计和查询上。
例如,查询学生每门课程的成绩,包括学号、姓名、课程名称和成绩信息,用SQL语句完成如下:
select d1.stuid,d1.name,d2.cid,d2.cname,d3.score
from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid
或者,查询每位学生所学课程的平均分,包括学号、姓名和平均分:
select d2.stuid,d2.name,AVG(d1.score)
from score d1,stuinfo d2
where d1.stuid=d2.stuid
group by d2.stuid,d2.name order byAVG(d1.score)desc
再如,统计各门课程的最高分、最低分和平均分:
select d2.cid,d2.cname,AVG(d1.score),MAX(d1.score),MIN(d1.score)
from score d1,course d2
where d1.cid=d2.cid
在SQL Server8中除了用SQL语句完成这类问题,也可以用其它的数据库对象完成。以学生所学课程成绩查询为例,用如下语句建立一个叫做score1的视图,然后查看score1的数据来查看到位学生的各门课程成绩,而且,还可以再通过SQL语句对score1行和列进行选择统计数据。
create view score1
as
select d1.stuid,d1.name,d2.cid,d2.cname,d3.score
from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid
例如,查询每位学生学过的所有课程的平均分,对视图score1操作的SQL语句:
Select stuid,name,avg(score)from score1 group by stuid,name
图1 视图统计学生各科平均分
查询各门课程的最高分、最低分和平均分,通过对Score1视图的操作来完成SQL语句如下:select cid,cname,max(score),min(score),avg(score)from score1 group by cid,cname
可见,对比之前对多表查询的语句,视图查询简洁很多。
图2 视图查询结果
视图作为数据库中的一种对象,是一个虚拟表,视图一旦被建立,作用与表相同,但它并不保存任何数据,它的数据来自定义视图的查询所引用的表。视图可以使用户将焦点集中于感兴趣的数据,不必要的数据可以不出现在视图中,这也增加了数据的安全性;其次,视图可以减化操作,特别是对于对多表查询不熟悉的用户;第三,可以根据用户的需求定制数据,同时保持数据表的简洁性,又不会占用很多的存储空间,并且,在视图中同样可以对数据进行增删改的操作。
除了视图,还可以用存储过程来完成对成绩的查询。创建名为p1的存储过程如下:
create procedure p1 as
select d1.stuid,d1.name,d2.cname,d3.score from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid
需要查看成绩的时候调用p1存储过程:exec p1就可以查看所有学生的各门课程成绩,如果需要针对某学生或某课程进行查询,则需要创建带参数的存储过程。
Create procedure p2(char(10))as
select d1.stuid,d1.name,d2.cname,d3.score from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid and d1.stuid=@sid
p2存储过程可以通过学号查询学生成绩调用语句:exec p2“2015020202”
从上面三种实现多表数据查询的方法来看,SQL语句查询交互性强,查询灵活,但对于了解不多的用户来说,多表复杂查询会有一定的困难。视图的优点是可以防止未经许可的用户访问敏感数据;降低数据库的复杂度;结果更容易理解,获得数据更容易,应用程序的维护更加方便,但需要数据库设计者对数据操作有足够的了解和预见,否则可能会限制系统功能;存储过程的优势是可以包含逻辑控制语句和数据操作语句速度,模块化和封装能够加快系统运行,减少网络流量,但它的灵活性不如前两种方式。
[1]王永乐,徐书欣.S QLServer 2008数据库管理及应用[M].北京:清华大学出版社,2011.
[2]王勇.用关系数据库标准语言S QL实现数据查询(多表查询)的应用研究[J].计算机光盘软件与应用,2014(19):66-67.