单元五 数据查询与维护
数据库管理系统DBMS具有数据定义、数据操纵、数据库维护、数据库管理四项功能。这四项功能也是数据库维护管理人员与设计人员的基本工作职责。前面的单元已经介绍了数据定义、数据库维护、数据库管理功能的具体实现。本单元将围绕学生管理系统数据库中的日常数据查询与维护工作,根据具体的数据操纵项目(项目使用的数据库参见附录A、附录B),讲述实现数据操纵功能的SQL语言。
5.1 数据查询语句(Select)
数据查询语句可完成对关系数据表的集合运算(并、交、差)、关系代数运算(投影、选择、连接),还可对数据表进行排序与统计汇总运算,如求某数据项的和、平均值、最大值、最小值等。因此,数据查询语句具有极强的查询与统计汇总功能,语句一般格式如下。
Select [All | Distinct] <目标表达式1>[,…,<目标表达式n>] From <表 | 视图名>[,<表 | 视图名>]… [Where <条件表达式>]
[Order By <表达式> [Asc | Desc]
[Group By <表达式列表> [Having <条件表达式>] ] 其中:
Select <目标表达式1>[,…,<目标表达式n>] 为投影运算; Where <条件表达式>为集合、选择与连接运算; Order By <表达式> [Asc | Desc] 为排序运算;
Group By <表达式列表> [Having <条件表达式>]为分组统计运算;
由上述语句格式看出,Select语句是SQL语言中最复杂的语句,同时也是最重要的语句。为此,将Select语句分为简单查询、连接查询、排序、分组统计、嵌套查询、相关子查询六节,采用由简单到复杂的方法来介绍。
5.1.1 简单查询
1.从数据表中选择列(投影运算)
实际上,从数据表中选择列就是关系代数中的投影运算,分为查询指定列、全部列与计算表达式列三种情况。
(1)查询指定列
语句格式:Select <列名1>,…,<列名n> From <表名>
- 136 -
【例5-1】在学生档案表tblStudent 中查询全体学生的学号与姓名。 Use Studentsys
Select Stud_Id , Stud_Name From tblStudent (2)查询全部列
语句格式:Select * From <表名>
【例5-2】在学生档案表tblStudent 中查询全体学生的所有字段信息。 Select * From tblStudent (3)计算表达式列
语句格式:Select <目标表达式1>,…,<目标表达式n> From <表名> 【例5-3】在学生档案表tblStudent 中查询全体学生的姓名及其年龄。 Select Stud_Name, Year(GetDate())-Year(Birth) From tblStudent
在目标表达式Year(Getdate())-Year(Birth)中,GetDate为系统当前日期,Birth为出生日期,用Year函数取出当前年份及出生年份,相减后得到学生的年龄。
目标表达式可采用别名表示方式,格式为:<列名> As <别名> 或 <列名> <别名> 在上例中采用别名方式的Select语句为:
Select Stud_Name As '姓名', Year(getdate())-Year(Birth) As '年龄' From tblStudent
或 Select Stud_Name 姓名, Year(getdate())-Year(Birth) 年龄
From tblStudent
说明:如果别名中没有空格符,则别名的单引号可以省略。 (4)消除取值重复的行
为了使投影运算后的列值不出现重复,可在列名前添加关键字
执行该语句后,将出现多个相同的系部编码。 在列名前增加关键字
执行该语句后,消除取值重复的行,各记录内容不同。 2.从表选择行(选择运算)
从数据表中选择行就是关系代数中的选择运算,选择运算是用Where条件子句实现行记录的选择。
语句格式:Select <列名> From <表名> Where <查询条件>
Where子句中常用的6种查询条件如表5-1所示,下面依次介绍这6种查询条件。
- 137 -
表5-1 常用查询条件
序号 1 2 3 4 5 6 查询条件 关系表达式 范围查询 集合查询 模糊查询 空值判断 逻辑表达式 运算符号 =、>、<、>=、<=、<>、!=、!<、!> Between、Not Between In、Not In Like、Not Like Is Null、Is Not Null And、Or、Not (1)关系表达式
关系表达式是将列名、常量等用关系运算符连接而成的式子。常用关系运算符有: =、>、<、>=、<=、<>、!=、!<、!>。后三种运算符分别表示不等于、不小于和不大于。 说明:对Char、Varchar、Text、Datetime和Smalldatetime类型常量要用单引号括起来。 【例5-5】在系部编码表tblDepart与学生成绩表tblScore中,编写满足下列条件的查询语句。
? 查询计算机系(系部编号为'30')的专业名称。 Select DptMj_Name From tblMajor Where Dpt_Id = '30' ? 查询考试不及格学生的学号。
Select Distinct Stud_Id From tblScore Where Score <60
这里使用了Distinct短语,当一个学生有多门课程不及格,他的学号也只出现一次。 (2)用Between运算符进行范围查询
查询条件为:<表达式> [Not] Between <下界> And <上界>
查询结果为数据表中满足表达式值在(或不在) <下界> 与 <上界>之间的记录。 【例5-6】在学生档案表tblStudent中,编写满足下列条件的查询语句。 ? 查询年龄在20至28岁之间的学生的学号、姓名和年龄。 Select Stud_Id ,Stud_Name , Year(GetDate())-Year(Birth) As Age From tblStudent
Where Year(GetDate())-Year(Birth) Between 20 And 28
? 查询年龄不在20至28岁之间的学生的学号、姓名和年龄。 Select Stud_Id ,Stud_Name , Year(GetDate())-Year(Birth) As Age From tblStudent
Where Year(GetDate())-Year(Birth) Not Between 20 And 28 (3)用In运算符指定集合查询 查询条件为:<表达式> [Not] In 集合
- 138 -
查询结果为数据表中满足表达式值在集合(或不在集合)中的记录。 【例5-7】在专业编码表tblMajor中,编写满足下列条件的查询语句。
? 查询机械系(编号为'10 ')、电气系(编号为'20')和计算机系(编号为'30 ')的专业
编号与名称。
Select DptMj_Id , DptMj_Name From tblMajor
Where UpperId In ('10 ','20 ','30 ')
? 查询不是机械系(编号为'10')、电气系(编号为'20'),也不是计算机系(编号为'30')
的专业编号与名称。 Select DptMj_Id , DptMj_Name From tblMajor
Where UpperId Not In ('10 ','20 ','30 ') (4)用Like运算符模糊查询
查询条件为:<表达式> Like ' [<通配符>]<字符串>[<通配符>]' 四种通配符所表示含义如表5-2所示。
表5-2 通配符
序号 1 2 3 4 通配符 % _(下划线) [ ] [^] 说明 代表任意多个字符 代表单个字符 代表指定范围内的单个字符 代表不在指定范围内的单个字符 【例5-8】在学生档案表tblStudent中,编写满足下列条件的查询语句。 ? 查询所有姓刘的学生的学号、姓名和性别。 Select Stud_Id , Stud_Name , Stud_Sex From tblStudent
Where Stud_Name Like '刘%'
? 查询姓名中第二个字为“阳”的学生的学号、姓名和性别。 Select Stud_Id , Stud_Name , Stud_Sex From tblStudent
Where Stud_Name Like '_阳%'
? 查询学号第一位不是1的学生的学号、姓名和性别。 Select Stud_Id , Stud_Name , Stud_Sex
- 139 -
From tblStudent
Where Stud_Id Like '[^1]%' 或 Select Stud_Id , Stud_Name , Stud_Sex From tblStudent
Where Stud_Id Not Like '1%' (5)空值(NULL)查询
空值查询条件为:<字段名> Is Null 非空查询条件为:<字段名> Is Not Null
【例5-9】在学生成绩表tblScore中,编写满足下列条件的查询语句。 ? 查询缺少成绩的学生的学号和相应的课程号。 Select Stud_Id , Course_Id From tblScore Where Score Is Null
注意:这里的“Is”不能用等号(“=”) 代替。 ? 查询所有有成绩的学生的学号和课程号。 Select Stud_Id , Course_Id From tblScore
Where Score Is Not Null (6)逻辑表达式
逻辑表达式是将列名、常量等用逻辑运算符连接而成的式子。常用逻辑运算符有: And(逻辑与)、Or(逻辑或)、Not(逻辑非)。 逻辑运算符优先级为Not最先,And其次,最后为Or。
【例5-10】在学生档案表tblStudent中,查询年龄在20至25岁之间的女生学号、姓名和年龄。
Select Stud_Id , Stud_Name , Year(GetDate())-Year(Birth) As Age From tblStudent
Where Year(GetDate())-Year(Birth) Between 20 And 25
And (Stud_Sex='女')
- 140 -