5—单元5 数据查询与维护(4)

2019-08-30 18:07

④ 通过班级编码表TB03与学生档案表XA01、系部编码表TB06的内连接,学生档案表XA01与性别编码表GC01的内连接,用系部名称TB0602、班级名称TB0302、系部编码TB0601、性别GC0102作为分组字段,查询各系各班男女生人数。查询结果按系部编码TB0601升序排序。

Use Xsgl

Select TB0602 As '系部名称',TB0302 As '班级名称',GC0102 As '性别', Count(*) As '学生人数' From XA01

Join TB03 On TB0301=XA0114 Join TB06 On TB0309=TB0601 Join GC01 On XA0106=GC0101 Group By TB0602,TB0302,TB0601,GC0102 Order By TB0601

用查询分析器执行语句后的结果如图5-6(d)所示,此图能显示系部名称、班级名称、性别与男女生人数。

⑤ 查询各班男生人数 Use Xsgl

Select TB0602 As '系部名称',TB0302 As '班级名称',

GC0102 As '性别',Count(XA0101) As '学生人数'

From XA01

Join TB03 On TB0301=XA0114 Join TB06 On TB0309=TB0601 Join GC01 On XA0106=GC0101

Group By TB0602,TB0302,TB0601,GC0102 Having GC0102='男' Order By TB0601

- 151 -

(a) 班级编码为分组字段 (c) 系编码、系名与班级名称为分组字段 (b) 班级名称为分组字段 (d) 系编码、系名、班级名称与性别为分组字段 图5-6 分组查询示例

【例5-21】 对学生成绩表XA05进行分组查询。

(1)查询计算机系(系部编码为'30')各班各门课程考核分数的平均成绩。 Use Xsgl

Select TB0302 As '班级名称',TB0103 As '课程名称', Cast (Avg(Cast(XA0509 as float)) as Int) As '平均成绩' From XA05

Join TB03 On XA0502=TB0301 Join TB01 On XA0506=TB0101 Where TB0309='30' And

XA0509 Between '00' And '99' Group By TB0302,TB0103

- 152 -

Order By TB0302,TB0103

说明:由于学生成绩表XA05的成绩字段XA0509为字符型,记录内容有分数“00”~“99”,等级“优秀”、“良好”、“中等”、“及格”、“不及格”、“旷考”等信息。因此,用Avg()函数只能统计分数“00”~“99”类型的成绩,所以在查询条件中增加范围查询:

XA0509 Between '00' And '99'

此外,还必须用Cast函数将字符型字段XA0509转换为实型,即: Cast(XA0509 as float)

求平均值后再用Cast函数将实型转换为整型,即: Cast (Avg(Cast(XA0509 as float)) as int)

也可用Round函数取整:Round(Avg(Cast(XA0509 as float),0) 语句执行后结果如图5-7所示。

图5-7 学生平均成绩分组查询

(2)查询计算机系(系部编码为'30')各班各门课程的学生选修人数、平均分、最高分、最低分。

Use Xsgl

Select TB0302 As '班级名称',TB0103 As '课程名称',Count(XA0501) As '学生人数',

Cast (Avg(Cast(XA0509 as float)) as int) As '平均成绩', Cast (Max(Cast(XA0509 as float)) as int) As '最高分', Cast (Min(Cast(XA0509 as float)) as int) As '最低分' From XA05

Join TB03 On XA0502=TB0301 Join TB01 On XA0506=TB0101 Where TB0309='30' And

XA0509 Between '00' And '99' Group By TB0302,TB0103 Order By TB0302,TB0103 语句执行后结果如图5-8所示。

- 153 -

图5-8 学生人数、平均成绩、最高分、最低分分组统计查询

5.1.5 嵌套子查询

与C++程序设计中循环嵌套、函数嵌套类似,Select语句也能进行嵌套查询,即在Select语句中嵌套Select语句,分为嵌套子查询和相关子查询两种,本节介绍嵌套子查询。嵌套子查询的一般语句格式为:

Select <列名表> From <数据表>

Where <表达式> <运算符> (Select 子查询) 说明:

(1)允许多重嵌套子查询,即在Select 子查询中允许嵌套子查询。嵌套查询由里向外。即先进行最内层子查询,并将查询结果作为其上一级子查询的查询条件,依次类推,最终显示最外层查询结果。

(2)Select子查询不能使用Order By子句,Order By子句只能对最终查询结果排序。 (3)<运算符>有五类,即:关系运算符(>、 <、 =、 >=、<=、!=或<>)、In、Exists、Any、All。现分五类运算符介绍嵌套子查询的使用方法。

1.关系运算符子查询

在使用嵌套子查询时,必须了解嵌套子查询的查询方式与使用条件。

(1)查询方式。父查询字段表达式与子查询结果用关系运算符进行比较,将满足条件的记录添加到父查询结果记录集中。

(2)使用条件。子查询必须返回单字段单值结果。

【例5-22】 查询与学号为“100022101”的同学同班的学生学号与姓名。 该查询可分两步进行:

第一步:用Select 子查询查找出学号为“100022101”同学的班级编码。 Select XA0114 From XA01 Where XA0102='100022101' 语句执行返回单字段单值结果是,班级编码XA0114为:“1000221”

- 154 -

第二步:在父查询Select语句的Where子句中,用XA0114与子查询得到的班级编码(“1000221”)进行等值比较。

Select XA0102,XA0104 From XA01 Where XA0114='1000221'

执行该语句后,可得到满足要求的学生信息。将上述两步合并成一条嵌套子查询语句。 Use Xsgl

Select XA0102,XA0104 From XA01

Where XA0114=(Select XA0114

From XA01

Where XA0102='100022101')

执行该语句后,同样可得到满足要求的学生信息。读者可思考如下问题。 (1)如何显示学生学号、姓名、班级编码与班级名称。

由于学生学号、姓名、班级编码与班级名称分别属于学生档案表XA01与班级编码表TB03,所以必须用内连接与嵌套子查询才能显示学生学号、姓名、班级编码与班级名称。内连接查询语句为:

Use Xsgl

Select TB0301 As '班级编码',TB0302 As '班级名称',

XA0102 As '学号',XA0104 As '姓名'

From XA01

Join TB03 On XA0114=TB0301 Where XA0114=(Select XA0114

From XA01

Where XA0102='100022101')

查询结果如图5-9所示。

(2)如何用自连接查询同班同学的信息。

在From子句中使用两个学生档案表XA01,分别用别名A与B表示。在Where子句中通过A.XA0114=B.XA0114可形成两张学生档案表的自连接,若在B表中加学号查询条件:B.XA0102='100022101',则可查询到同班同学的信息。语句如下。

Select TB0301 As '班级编码',TB0302 As '班级名称',

A.XA0102 As '学号',A.XA0104 As '姓名'

- 155 -


5—单元5 数据查询与维护(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:苏教版小学语文五年级阅读能力测试卷 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: