论文部分内容阅读
摘要:数据库检索是数据库应用的一个主要部分,数据检索的正确和高效,对于提高数据库应用的质量和效率具有重要意义。本文通过对数据库检索中常用的SQL SERVER典型语句进行分析和探讨,提出需要注意的问题和相应的解决方法,从而为数据库的设计使用者提供有益的参考。
关键词:数据库;数据检索;SQL SERVER语句
中图分类号:TP311 文献标识码:A 文章编号:1001-828X(2012)11-0-01
随着计算机技术在越来越多的领域中广泛应用,数据库的应用也随之越来越多。在数据库应用中扮演着举足轻重角色的是数据库检索技术,正确使用检索数据的语句,提高检索数据的效率成为数据库设计的主要问题。下面就基于SQL SERVER数据库结合高校学生管理数据库阐述几种典型语句的使用方法。
一、高效学生数据库简介
高校学生数据库是数据库应用的一个典型实例,主要实现学生基本信息、课程和成绩的管理。该库中典型数据表结构及其之间关系如图1所示。
为了方便描述检索数据库的方法,数据表作了简化,表中字段的英文表达略去,直接用中文书写。
二、分组语句的应用
SQL SERVER数据库使用 group by 子句进行分组,其作用是把一个数据集合按照指定的字段条件分成若干个小的数据集合,然后对每个小的数据集合进行数据统计。分组语句可以将一个或多个字段或表达式的值作为分组条件,结果集中每一组数据统计的结果占有一行。例如,要统计每个学生考试的总分,语句可以书写为select学号,SUM(分数)总分 from 成绩 group by 学号。分组的条件是根据学号这一个字段,因此每个学生在结果集中占有一行。
若語句写为select学号,SUM(分数) 总分 from 成绩 group by 学号,课程编号,分组的条件是根据学号、课程编号这两个字段,那么分组的结果就是三个组里面再分别根据课程编号进一步分组,由于同一个学生不能重复学习同一门课程,那么每个学生选修了几门课程就又划分了几个组,因此这时成绩表中记录数就是最后的分组数。
三、多表联接语句的应用
在很多情况下,需要查询的数据来自SQL SERVER数据库中的多张表,这时需要对这多张数据库做联接。一般来说多表联接需要经过两个步骤,首先,分析各表之间的外键关系,即找出各表中的外键字段以及该字段作为主键的表;然后,分析需要对这些表进行何种类型的联接(内联接或者外联接);最后,书写SQL语句完成数据的检索。
例如查询学生库中所有学生的姓名、课程名称和分数,其中,姓名在学生信息表中,课程名称在课程表中,分数在成绩表中。如图1所示,在成绩表中有两个外键,分别是学号字段和课程编号字段。学号在学生信息表中是主键,课程编号在课程表中是主键,因此成绩表和学生信息表可以联接,成绩表和课程表可以联接,经过成绩表这个桥梁表实现了这三表的联接。同时,分析该问题可以看出,需要检索的是已经有分数的学生,没有分数的学生排除在外,因而三表间做内联接即可完成。由此回答该问题的SQL语句可以书写为select 姓名, 课程名称, 分数 from 学生 t1 inner join 成绩 t2 on t1.学号=t2. 学号 inner join 课程 t3 on t2.课程编号=t3. 课程编号。
四、子查询语句的应用
有时候数据库检索的任务比较复杂,难以使用一个简单的查询完成,这时就需要把复杂的查询分解成一系列的逻辑步骤,这些逻辑步骤构成了子查询。子查询的定义是嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或另一个子查询中的 SELECT 语句。子查询的使用主要有以下三种形式。
1.子查询用作派生表,即子查询语句紧跟在from关键字的后面。例如SELECT max(T.人数) from ( SELECT count(*) as 人数, 学院编号 from 学生 group by 学院编号) AST。这个例子的子查询是统计每个系部各有多少个学生,把查询得到的结果集作为派生表提供给外层查询语句使用,进而统计出各系部最多的学生数。
2.子查询用作表达式,即子查询语句放在select和from之间作数据统计。例如SELECT 学号, 分数-(SELECT AVG(分数) FROM 成绩 WHERE 课程编号=‘01’) AS 分差 FROM 成绩 WHERE 课程编号=‘01’。该语句的子查询用以统计01号课程的平均分,统计得到的分数提供给外层查询语句使用,进而计算出01号课程每位学生的分数与平均的差值,通过结果集可以快速的看出每个分数是高于平均分、低于平均分还是等于平均分。需要注意的是,这种情况下的子查询检索出的结果应当是一个单值。
3.子查询用作条件,即子查询语句出现在where子句中,这种形式也是子查询用的最多的情形。例如SELECT 学号 FROM 成绩 WHERE WHERE 课程编号 = ‘01’ and 分数 = (SELECT max(分数) FROM 成绩 WHERE 课程编号 = ‘01’) 。由于where子句中不能直接使用聚合函数,因此该语句的子查询首先统计出01号课程的最高分,然后提供给外层的查询语句使用,这样进而检索出01号课程考最高分的学生的学号。子查询做条件时需要注意的是,如果子查询返回值是单值可以使用比较运算符做条件运算,如果是多值那么就应使用集合运算符in或exists关键字。
综上所述,检索数据库是十分常见数据库应用,理解并合理使用检索数据库的语句可以大大提高数据库检索的正确率和效率。本文试图抛砖引玉,从而为数据库设计人员开发数据库应用提供一些思路。
参考文献:
[1]俞立梅,吕树红.SQL Server数据库应用技能教程[M].北京:北京大学出版社,2009.
[2]张凌杰,张会娟.数据库基础与应用[M].北京:电子工业出版社,2011.
[3]孔勇奇.大型数据库及其应用[M].北京:北京大学出版社,2011.
作者简介:徐 枫(1973-),男,安徽安庆人,讲师,工作单位:浙江省杭州市浙江商业职业技术学院。
关键词:数据库;数据检索;SQL SERVER语句
中图分类号:TP311 文献标识码:A 文章编号:1001-828X(2012)11-0-01
随着计算机技术在越来越多的领域中广泛应用,数据库的应用也随之越来越多。在数据库应用中扮演着举足轻重角色的是数据库检索技术,正确使用检索数据的语句,提高检索数据的效率成为数据库设计的主要问题。下面就基于SQL SERVER数据库结合高校学生管理数据库阐述几种典型语句的使用方法。
一、高效学生数据库简介
高校学生数据库是数据库应用的一个典型实例,主要实现学生基本信息、课程和成绩的管理。该库中典型数据表结构及其之间关系如图1所示。
为了方便描述检索数据库的方法,数据表作了简化,表中字段的英文表达略去,直接用中文书写。
二、分组语句的应用
SQL SERVER数据库使用 group by 子句进行分组,其作用是把一个数据集合按照指定的字段条件分成若干个小的数据集合,然后对每个小的数据集合进行数据统计。分组语句可以将一个或多个字段或表达式的值作为分组条件,结果集中每一组数据统计的结果占有一行。例如,要统计每个学生考试的总分,语句可以书写为select学号,SUM(分数)总分 from 成绩 group by 学号。分组的条件是根据学号这一个字段,因此每个学生在结果集中占有一行。
若語句写为select学号,SUM(分数) 总分 from 成绩 group by 学号,课程编号,分组的条件是根据学号、课程编号这两个字段,那么分组的结果就是三个组里面再分别根据课程编号进一步分组,由于同一个学生不能重复学习同一门课程,那么每个学生选修了几门课程就又划分了几个组,因此这时成绩表中记录数就是最后的分组数。
三、多表联接语句的应用
在很多情况下,需要查询的数据来自SQL SERVER数据库中的多张表,这时需要对这多张数据库做联接。一般来说多表联接需要经过两个步骤,首先,分析各表之间的外键关系,即找出各表中的外键字段以及该字段作为主键的表;然后,分析需要对这些表进行何种类型的联接(内联接或者外联接);最后,书写SQL语句完成数据的检索。
例如查询学生库中所有学生的姓名、课程名称和分数,其中,姓名在学生信息表中,课程名称在课程表中,分数在成绩表中。如图1所示,在成绩表中有两个外键,分别是学号字段和课程编号字段。学号在学生信息表中是主键,课程编号在课程表中是主键,因此成绩表和学生信息表可以联接,成绩表和课程表可以联接,经过成绩表这个桥梁表实现了这三表的联接。同时,分析该问题可以看出,需要检索的是已经有分数的学生,没有分数的学生排除在外,因而三表间做内联接即可完成。由此回答该问题的SQL语句可以书写为select 姓名, 课程名称, 分数 from 学生 t1 inner join 成绩 t2 on t1.学号=t2. 学号 inner join 课程 t3 on t2.课程编号=t3. 课程编号。
四、子查询语句的应用
有时候数据库检索的任务比较复杂,难以使用一个简单的查询完成,这时就需要把复杂的查询分解成一系列的逻辑步骤,这些逻辑步骤构成了子查询。子查询的定义是嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或另一个子查询中的 SELECT 语句。子查询的使用主要有以下三种形式。
1.子查询用作派生表,即子查询语句紧跟在from关键字的后面。例如SELECT max(T.人数) from ( SELECT count(*) as 人数, 学院编号 from 学生 group by 学院编号) AST。这个例子的子查询是统计每个系部各有多少个学生,把查询得到的结果集作为派生表提供给外层查询语句使用,进而统计出各系部最多的学生数。
2.子查询用作表达式,即子查询语句放在select和from之间作数据统计。例如SELECT 学号, 分数-(SELECT AVG(分数) FROM 成绩 WHERE 课程编号=‘01’) AS 分差 FROM 成绩 WHERE 课程编号=‘01’。该语句的子查询用以统计01号课程的平均分,统计得到的分数提供给外层查询语句使用,进而计算出01号课程每位学生的分数与平均的差值,通过结果集可以快速的看出每个分数是高于平均分、低于平均分还是等于平均分。需要注意的是,这种情况下的子查询检索出的结果应当是一个单值。
3.子查询用作条件,即子查询语句出现在where子句中,这种形式也是子查询用的最多的情形。例如SELECT 学号 FROM 成绩 WHERE WHERE 课程编号 = ‘01’ and 分数 = (SELECT max(分数) FROM 成绩 WHERE 课程编号 = ‘01’) 。由于where子句中不能直接使用聚合函数,因此该语句的子查询首先统计出01号课程的最高分,然后提供给外层的查询语句使用,这样进而检索出01号课程考最高分的学生的学号。子查询做条件时需要注意的是,如果子查询返回值是单值可以使用比较运算符做条件运算,如果是多值那么就应使用集合运算符in或exists关键字。
综上所述,检索数据库是十分常见数据库应用,理解并合理使用检索数据库的语句可以大大提高数据库检索的正确率和效率。本文试图抛砖引玉,从而为数据库设计人员开发数据库应用提供一些思路。
参考文献:
[1]俞立梅,吕树红.SQL Server数据库应用技能教程[M].北京:北京大学出版社,2009.
[2]张凌杰,张会娟.数据库基础与应用[M].北京:电子工业出版社,2011.
[3]孔勇奇.大型数据库及其应用[M].北京:北京大学出版社,2011.
作者简介:徐 枫(1973-),男,安徽安庆人,讲师,工作单位:浙江省杭州市浙江商业职业技术学院。