第4章 数据查询
4.1查询概述 查询是Access数据库的7种对象之一,它能够把一个或多个表中的数据抽取出来,供用户查看、更改和分析,还可以作为窗体、报表或数据访问页的记录源。利用查询可以提高处理数据的效率。Access提供了选择查询、交叉表查询、参数查询、操作查询和SQL查询等多种类型的查询,查询的实质就是使用SQL命令进行查询。
4.1.1 查询的作用 Access查询可以对数据库中一个或多个表的数据进行浏览、筛选、排序、检索和统计等操作。我们可以把查询看做一个“表”,只不过是以表或查询作为数据来源的一个临时表,称为动态数据集。也就是说,查询的数据集实际上并不存在,它是在运行查询时动态生成的。
查询主要有以下用途: (1)以一个、多个表或查询为数据源,根据用户的选择生成动态的数据集。 (2)对数据进行统计、排序、计算和汇总。 (3)设置查询参数,形成交互式的查询。 (4)使用交叉表查询,进行分组汇总。 (5)使用操作查询,对数据表进行追加、更新、删除等操作。 (6)查询作为其它查询、窗体、报表或数据访问页的记录源。
4.1.2查询的类型 查询的类型主要有: 选择查询 交叉表查询 参数查询 操作查询 SQL查询
4.1.3创建查询的方法 1.使用查询向导. 2.使用查询设计视图 3.使用SQL查询语句
4.1.4查询的5种视图 设计视图 SQL视图 数据表视图 数据透视表视图 数据透视图视图。
4.2创建选择查询 4.2.1 使用查询向导创建选择查询 【例4.1】创建一个名为“教师基本情况”的查询,显示“教师编号”、“姓名”、“工作时间”、“职称”。 【例4.2】创建一个名为“学生成绩统计”的查询,显示学生的“学号”、“总成绩”和“平均成绩”。 【分析】此查询为基于单表的查询,但需要在向导中使用“汇总”。
4.2.2使用设计视图创建选择查询 【例4.3】创建一个名为“教师授课信息”的查询,查询每位教师所授课程的课程名,显示“教师编号”、“姓名”和“课程名”。 【分析】 “教师信息表”、“课程表” 表之间没有直接的联系,需要借助第3张表“授课信息表”将两者联系起来。
4.2.3查询条件中的运算符、函数和表达式 + - * / 算术运算符 运算符 适用的数据类型 说明 数字类型、文本型、备注型 加法或合并文本串 - 数字类型、日期/时间型 减法 * 数字类型 乘法 / 除法
关系运算符及含义 关系运算符 说明 = 等于 <> 不等于 < 小于 <= 小于等于 > 大于 >= 大于等于
逻辑运算符 逻辑运算符 说明 Not 当Not连接的表达式为真时,整个表达式为假,否则为真 And Or 当Or连接的表达式有一个为真时,整个表达式为真,否则为假
字符串连接运算符 运算符 说明 举例 & 连接2个字符串表达式 “123” & “123”=“123123” + 计算和,也可连接字符串 “abc”+“123”=“abc123” 123+456=579 “123”+123=246
【提示】 (1)在运算符“&”两侧必须各加一个空格,否则如果变量与字符&紧挨在一起,将作为类型定义符处理。“&”运算符可以将非字符串类型的数据转换为字符串后进行连接。 (2)使用“+”运算符时,当两边操作数都为字符串时,进行字符串的组合;当两边均为数值时,进行算术加法运算;当一个为字符串,另一个为数值型时,则先将数字字符转换为数值,然后进行算术加法运算;当一个为数值型,另一个为非数值的字符串,则出错,例:执行“abc”+123时,程序出错。
特殊运算符及含义 特殊运算符 说 明 In 用于指定一个字段值的列表,列表中的任意一个值都可与查询的字段相匹配 Between 说 明 In 用于指定一个字段值的列表,列表中的任意一个值都可与查询的字段相匹配 Between 用于指定一个字段值的范围,指定的范围之间用And连接 Like 用于指定查找文本字段的字符模式。在所定义的字符模式中,用“?”表示该位置可匹配任何一个字符;用“*”表示该位置可匹配零或多个字符;用“#”表示该位置可匹配一个数字;用方括号描述一个范围,用于表示可匹配的字符范围 Is Null 用于指定一个字段为空 Is Not Null 用于指定一个字段为非空
字段 表达式 显示 姓名 Like "王*" 姓名以“王”开头 Like "*伟" 姓名以“伟”结尾 客户名称 Like "[A-D]*" 所在城市 Like "*AN*" 所在城市包含字符串“AN”,将常量 字符串包含在一对双引号或单引号中 Like "SUPE?" 客户名称有5个字母长,且其中前4个字母是“SUPE”而最后的字母为未知的 时间 电话 #2006-1-1# Like "1#3" 将日期包含在一对#中 可以找到103、113、123 等,通配任何单个数字字符
数值函数说明 函 数 说 明 Abs(数值表达式) 返回数值表达式值的绝对值 Int(数值表达式) 返回数值表达式值的整数部分 函 数 说 明 Abs(数值表达式) 返回数值表达式值的绝对值 Int(数值表达式) 返回数值表达式值的整数部分 Sqr (数值表达式) 返回数值表达式值的平方根 Sgn(数值表达式) 返回数值表达式值的符号值
函 数 说 明 Space(数值表达式) 返回由数值表达式的值确定的空格个数组成的空字符串 String(数值表达式,字符表达式) 函 数 说 明 Space(数值表达式) 返回由数值表达式的值确定的空格个数组成的空字符串 String(数值表达式,字符表达式) 返回一个由字符表达式的第1个字符重复组成的指定长度为数值表达式值的字符串 如String$(6, "a")="aaaaaa" String$(5, "abcde")="aaaaa" Left(字符表达式, 数值表达式) 返回一个值,该值是从字符表达式左侧第1个字符开始,截取的若干个字符 如Left( "abcdefg",4)= "abcd" Left( "abcdefg",0)= "" Right(字符表达式, 数值表达式) 返回一个值,该值是从字符表达式右侧第1个字符开始,截取的若干个字符 如Right $( "abcdefg",4)= "defg" Right $( "abcdefg",0)= "" Len(字符表达式) 返回字符表达式的字符个数,当字符表达式为Null时,返回Null值,如Len("ABCDEFGHIJK")=11 Ltrim(字符表达式) 返回去掉字符表达式前导空格的字符串 如Ltrim$( " abcdefg")= "abcdefg" Rtrim(字符表达式) 返回去掉字符表达式尾部空格的字符串 如Rtrim$( "abcdefg ")= "abcdefg" Trim(字符表达式) 返回去掉字符表达式前导和尾部空格的字符串 如Trim$( " abcdefg ")= "abcdefg" Mid(字符表达式, 数值表达式1[, 数值表达式2]) 返回一个值,该值是从字符表达式最左端某个字符开始,截取到某个字符为止的若干个字符 如Mid ( "abcdefg",2,3)= "bcd" Mid ( "abcdefg",2)= "bcdefg"
函 数 说 明 Day(date) 返回给定日期1~31的值。表示给定日期是一个月中的哪一天 Month(date) 返回给定日期1~12的值。表示给定日期是一年中的哪个月 Year(date) 返回给定日期100~9999的值。表示给定日期是哪一年 Weekday(date) 返回给定日期1~7的值。表示给定日期是一周中的哪一天 Hour(date) 返回给定小时0~23的值。表示给定时间是一天中的哪个钟点 Date() 返回当前系统日期
函 数 说 明 Sum (字符表达式) 返回字符表达式中值的总和。字符表达式可以是一个字段名,也可以是一个含字段名的表达式,但所含字段应该是数字数据类型的字段 Avg(字符表达式) 返回字符表达式中值的平均值。字符表达式可以是一个字段名,也可以是一个含字段名的表达式,但所含字段应该是数字数据类型的字段 Count(字符表达式) 返回字符表达式中值的个数,即统计记录个数。字符表达式可以是一个字段名,也可以是一个含字段名的表达式,但所含字段应该是数字数据类型的字段 Max(字符表达式) 返回字符表达式中值中的最大值。字符表达式可以是一个字段名,也可以是一个含字段名的表达式,但所含字段应该是数字数据类型的字段 Min(字符表达式) 返回字符表达式中值中的最小值。字符表达式可以是一个字段名,也可以是一个含字段名的表达式,但所含字段应该是数字数据类型的字段
使用文本值作为条件示例 字段名 条 件 功 能 职称 "教授" 查询职称为教授的记录 "教授" or "副教授" 条 件 功 能 职称 "教授" 查询职称为教授的记录 "教授" or "副教授" 查询职称为教授或副教授的记录 课程名称 Like "计算机*" 查询课程名称以“计算机”开头的记录 姓名 In("李元","王朋") 或 "李元"Or"王朋" 查询姓名为李元或王朋的记录 Not "李元" 查询姓名为不是李元的记录 Not "王*" 查询不姓王的记录 Left([姓名],1)= "王" 查询姓王的记录 Len([姓名])<=2 查询姓名为两个字或少于两个字的记录 简历 Right ([简历],2)= "顺义" 查询简历最后两个字为顺义的记录 学生编号 Mid([学生编号],3,2)= "03" 查询学生编号第3个和第4个字符为03的记录
4.表达式 直接输入表达式
使用表达式生成器
4.2.4创建带条件的查询 【例4.4】创建一个名为“1989年参加工作的男教师”的查询,显示“教师编号”、“姓名”、“性别”和“工作时间”。 【提示】 (1)设计查询时使用的所有标点符号均应为英文状态下的标点符号。 (2)工作时间是表中的字段名,设置条件时一定要在其两侧加[ ],否则Access将其视为字符串。
【例4.5】查找“电气”班名字为2个字姓“陈”的学生的信息,显示“学号”、“姓名”、“性别”和“班级”,将查询保存为“陈某学生信息” 【分析】根据题意,需要在查询设计视图的的“姓名”和“班级”的“条件”行中分别使用通配符,才能得到满足条件的查询。
4.2.5 在查询中进行计算 【例4.6】创建一个名为“每门课程成绩统计”的查询,统计每门课程的最高分、最低分、总分和平均分。 【例4.7】创建一个名为“1989年参加工作的教师人数”的查询,统计1989年参加工作的教师人数。
2.自定义计算字段 【例4.8】创建一个名为“学生年龄信息”的查询,显示“学生信息表”的“学号”、“姓名”、“性别”、“年龄”。 【提示】日期函数Date、Now后一定要加() 【例4.8】创建一个名为“学生年龄信息”的查询,显示“学生信息表”的“学号”、“姓名”、“性别”、“年龄”。
【例4. 9】利用查询在“教师信息表”中添加字段“纳税金额”(纳税金额=(工资-2000) 【例4.9】利用查询在“教师信息表”中添加字段“纳税金额”(纳税金额=(工资-2000)*5%)。显示“教师编号”,“姓名”、“职称”、“工资”和“纳税金额”,将查询保存为“教师纳税金额”。 【分析】%不是运算符,Access不能识别%,因此输入百分数时需要转换为对应的小数。
4.2.6 查询的有序输出 【例4.10】创建一个名为“教师信息排序”的查询,显示“教师信息表”中的“姓名”、“职称”、“工资”和“教师编号”,要求按“工资”的升序和“教师编号”的降序显示“教师编号”的第1位为4的教师信息
【例4.11】题目要求同例4.10,但显示的字段的顺序为“教师编号”、“姓名”、“职称”、“工资”,还是按“工资”的升序和“教师编号”的降序显示。
4.3创建参数查询 单参数查询 【例4.12】创建一个名为“某月出生的学生成绩”的查询,显示某学生所选课程的成绩。显示“学号”、“姓名”、“出生月份”、“课程号”、“课程名”和“成绩”。
【例4.13】查询平均成绩高于输入的平均成绩的学生信息。显示“学号”、“姓名”、“平均成绩”,将查询结果保存为“高于平均成绩参数查询”。 这里的“格式”一定要选择“固定”,否则设置的“小数位数”不起作用。
【例4.14】创建一个按姓氏查找学生信息的参数查询。显示“学号”、“姓名”、“性别”、“班级”,将查询结果保存为“按姓氏查找学生”。
4.3.2多参数查询 【例4.15】查询某班某门课的平均成绩。显示“班级”、“课程号”、“课程名”和“平均成绩”,将查询结果保存为“某班某门课平均成绩”。
【例4.16】创建按某段出生日期查找学生信息的参数查询。显示“学号”、“姓名”、“出生日期”、“班级”,将查询结果保存为“按出生日期段查找”。
4.4创建交叉表查询 交叉表查询用于对数据汇总和其它计算,并对这些数据进行分组,一组在数据表的左侧作为行标题,另一组在数据表的上部作为列标题,在行和列交叉处显示某个字段的各种计算值,使数据的显示更加直观、易读。
【例4.18】创建一个交叉表查询,统计每个班的男女生人数 .
【提示】 交叉表中的“行标题”可以有一个或多个,“列标题”和“值”只能有一个。 【例4.19】创建一个交叉表查询,统计每班的男女生人数并计算每个班的总人数。
【例4.20】统计每个班的每门课的平均成绩。
4.5创建操作查询 操作查询是在选择查询的基础上创建的,通过操作查询可以对原有数据源中的数据进行更新、追加、删除等操作,还可以在选择查询的基础上创建新的数据表。 操作查询查询包括生成表查询、追加查询、删除查询、更新查询。
4.5.1 创建生成表查询 生成表查询就是利用一个或多个表中的全部或部分数据创建新表。利用生成表查询创建新表时,新表中的字段从生成表查询的源表中继承字段名称、数据类型以及字段大小属性,但不继承其它的字段属性以及表的主键。
【例4.21】将成绩在90分以上的学生信息存储到一个新表中,新表的名称为“90分以上”。将查询保存为“90分以上查询”。
4.5.2创建追加查询 追加查询可将一个或多个表中的一组记录追加到一个或多个表的末尾。 【例4.22】创建一个追加查询将成绩在80~90分之间的学生成绩添加到已创建的“90分以上”表中。 【提示】使用追加查询时,在追加查询与被追加记录的表中,只有匹配的字段才能被追加。一般追加查询的源表与目标表的结构应该相同。
4.5.3创建删除查询 如果需要一次删除一批数据,使用删除查询比在表中删除记录的方法更加方便。删除查询可以从一个表中删除记录,也可以从多个相互关联的表中删除记录。若要从多个表中删除相关记录,必须已经建立了相关表之间的关系,并在“编辑关系”对话框中分别选择“实施参照完整性”和“级联删除相关记录”复选框。使用删除查询,将删除整条记录,而不只是记录中所选择的字段。
【例4.23】将“学生成绩表”中成绩低于60分的记录删除。
4.5.4创建更新查询 如果有大量的数据需要进行修改,利用手工编辑手段要困难的多,效率很低,准确性也很差。因此通常使用更新查询对大批量的数据进行修改。
【例4.24】将“课程表”中所有课程的学分增加2学分。 “更新到”栏中的表达式中引用的字段名 必须放在一对方括号中, 否则Access查询会将其理解成是一个字符串常量。
【例4.25】将所有1988年到1992年之间参加工作的教师的职称改为副教授。
4.6 SQL查询 4.6.1 SQL语言概述 SQL是Structure Query Language的英文简写,意思是结构化查询语言。SQL是在数据库系统中应用广泛的数据库查询语言,它包含了数据定义、查询、操纵和控制4种功能。SQL语言的功能强大,使用方便灵活,语言简单易学。
常用的SQL查询语句包括Select、Insert、Update、Delete、Create、Drop等。其中最常使用的是Select语句,它是SQL语言的核心语句,Select语句的基本结构是Select…From…Where。
Select语句的语法格式如下: Select [谓词] <字段列表>|<目标表达式>|<函数> [As 别名] From 表名 [Where 条件…] [Group By 字段名] [Having 分组的条件] [Order By 字段名 [Asc|Desc]];
进入SQL视图方法如下: (1)在数据库窗口中,单击“查询”对象。 (2)双击“在设计视图中创建查询”选项,关闭弹出的“显示表”对话框。 (3)单击工具栏中SQL视图按钮,在弹出的编辑框中输入SQL语句。 此外,用户还可以通过打开某个已经创建的查询的设计视图,选择视图按钮右边的向下的箭头,然后选择“SQL视图”选项,在“SQL视图”中编辑、查看SQL语句或对SQL语句进行简单的修改。
4.6.2 创建SQL查询 【例4.26】显示“学生信息表”中的所有“班级名称”。 【提示】Distinct必须紧挨着Select,放在Select后面的目标字段的前面。 此查询需要使用Distinct消除重复的记录。
【例4.27】查询1990年出生的女学生信息,显示“学号”、“姓名”、“性别”、“出生日期”和“班级”。 Select 学号, 姓名, 性别, 出生日期, 班级 From 学生信息表 Where 性别="女" And Year(出生日期)=1990;
【例4.28】创建一个查询,按“性别”的升序和“职称”的降序显示“教师编号”、“姓名”、“性别”和“职称”。 Select教师编号,姓名, 性别, 职称 From 教师信息表 Order By 性别, 职称 Desc; 【提示】Order By子句必须是SQL-Select命令中的最后一个子句。
【例4.29】显示学生的学号、姓名、班级和年龄。 Select 学号,姓名,班级,Year(Date())-Year(出生日期) As 年龄 From 学生信息表;
【例4.30】查询课程号为101的成绩从高到低排序的前3名学生的“学号”、“课程号”和“成绩”。 【分析】Top谓词用于输出排列在前面的若干条记录。要查找前3名学生的学生成绩需要按成绩的降序排列,排序后使用Top 3显示前3名学生。 Select Top 3 学号,课程号 ,成绩 From 学生成绩表 Where 课程号="101" Order By 成绩 Desc
【例4.31】查找选修101和301课程的学生的“学号”、“课程号”和“成绩” 【分析】此查询需要使用特殊运算符In,检查一个属性值是否属于一组值。 Select 学号,课程号,成绩 From 学生成绩表 Where 课程号 In("101","301"); 【提示】“课程号In("101","301")”指课程号等于“101”或者“301”。
【例4.32】查找学号的前4位为“0975”的学生的基本情况。 Select * From 学生信息表 Where 学号 Like "0975*“ 【提示】还可以将Where子句改写为:Where Left(学号,4)="0975"。
2.使用聚合函数 聚合函数也叫做合计函数,在SQL语句中使用聚合函数可以实现数据统计等功能。 【例4.33】统计各门课程的平均分、最高分和最低分。 【分析】根据题意需要按课程号对记录分组,相同课程放在一组,在同一组中使用聚合函数进行计算。
Select 课程号,Avg(成绩) As 平均分,Max(成绩) As 最高分,Min(成绩) As 最低分 From 学生成绩表 Group By 课程号;
【提示】如果使用了分组子句,则查询列表中的每个字段要么是分组依据的字段(Group By后边的字段),要么是聚合函数。如果将上述语句改写为: Select学号,课程号, Avg(成绩) As 平均分,Max(成绩) As 最高分,Min(成绩) As 最低分 From 学生成绩表 Group By 课程号;
查询结果出错。原因是 ①Select子句中的“学号”字段不是Group By子句的字段。 ②平均分、最高分、最低分只有一个,而“学号”的个数可以有多个,数量不匹配,因此不能得到正确的查询结果。
【例4.34】统计各班的男同学的人数。 Select 班级 ,Count(班级) As 男同学人数 From 学生信息表 Where 性别="男" Group By 班级
【提示】 如果将上面的Select子句改写为: Select Count(班级) As 男同学人数 则运行时无语法错误,但显示结果不完整,没有班级字段,看不出男同学人数是哪个班的。
【例4.35】设计一个查询,显示最低分大于等于90,且最高分小于等于100的学生“学号”。 【分析】此题需要按学生的“学号”进行分组,但不是所有的学号都参加分组,只有当同一学号中的成绩在90和100之间时,才符合分组的条件,因此在查询中需要使用Having子句对分组后的结果作进一步的约束。
Select 学号 From 学生成绩表 Group By 学号 Having Min(成绩>=90 )And Max(成绩<=100)
【提示】 (1)Where子句与Having子句的区别:Where子句的作用对象是表,而Having子句的作用对象是Group By子句所产生的组。 (2)Where子句中不能有聚合函数,如下写法是错误的: Select 学号 From 学生成绩表 Where Min(成绩>=90 ) And Max(成绩<=100) Group By 学号 (3)Having子句用来限制分组的条件,是可选的,如果有Having子句则必须放在Group By子句的后面。
3.基于多个数据源的查询 对于连接的多个表通常存在公共字段,为了区别是哪个表中的列,在连接条件中通过表名前缀指定连接列。
【例4.36】显示学生的学号、姓名、课程号和成绩。 Select 学生信息表.学号,姓名,课程号,成绩 From 学生信息表,学生成绩表 Where 学生信息表.学号=学生成绩表.学号
【例4.37】显示学生的学号、姓名、课程名和成绩。 【分析】由于数据表的名字多次出现,为了简化输入,允许在查询中使用表的别名,以缩写表名,即可以在From子句中为表定义一个临时别名,然后在查询中引用。设学生信息表的别名为St,学生成绩表的别名为Sg,课程表的别名为Sc。一旦给表起了别名,则SQL查询中所有用到表的地方都需要用别名代替。
Select St.学号,姓名,课程名,成绩 From 学生信息表 St,学生成绩表 Sg ,课程表 Sc Where St.学号=Sg.学号 And Sg.课程号=Sc.课程号
【例4.38】查询“09土木1”班学生所学课程的成绩,显示学生的学号、姓名、班级、课程号和成绩。 Select St.学号, 姓名, 班级, 课程号, 成绩 From 学生信息表 St,学生成绩表 Sg Where St.学号 = Sg.学号 And St.班级="09土木1"
4.6.3 创建数据定义查询 这种类型的查询用于创建、删除、更改表或创建数据库中的索引。
1.Create Table 语句 Create Table 语句用于创建表,语法格式如下: Create Table 表名 (列名1 数据类型1 [Not Null] [,列名2 数据类型2 [Not Null]]……[Primary Key (字段名)]) 其中Primary Key 用于设置主键。 【说明】一个表可以有一列或多列,定义列时需要说明列名、数据类型,并指出列值是否允许为空(Null)。
【例4.39】使用Create Table语句创建表结构如图所示的“学生情况”表。
选择“查询”|“SQL特定查询”|“数据定义”命令,出现“数据定义查询”对话框,在对话框中输入SQL语句 CREATE TABLE 学生情况 (学号 integer primary key, 姓名 char(10), 性别 char(1),出生日期 date, 家庭住址 text(40),联系电话 text(15), 备注 memo);
Alter Table语句 修改表结构用Alter Table语句,可以修改用Create Table语句创建好的表结构。 Alter Table 表名 Add 新字段名 字段类型[(字段长度)] [Not Null]|[ Drop 字段名] 其中,Add表示增加字段,Drop表示删除字段。
【例4.40】在“学生情况”表中增加“邮政编码”字段。 Alter Table 学生情况 Add 邮政编码 Char(6);
【例4.41】将“学生情况”表中“邮政编码”字段删除。 Alter Table 学生情况 Drop 邮政编码;
Drop语句 Drop语句用于从数据库中删除已存在的表,语法格式如下: Drop Table 表名
【例4.42】删除“学生情况”表。 Drop Table 学生情况 【提示】Delete与Drop的区别:Delete 是删除表里的一条记录,表还存在;Drop是删除表或表中的字段,如果是删除表则同时删除表的结构和记录
4.6.4 SQL数据操纵功能 1.插入数据(Insert ) Insert命令用于向表中添加新纪录,然后给新记录字段赋值。语句格式如下: Insert Into <表名>[(<列名1>[,<列名2>,…])] Values ([<常量1>[,<常量2>,…]) 其中,Into子句指出将要添加新记录的表名,Values子句指出输入到新纪录的指定字段中的数据值,如果省略前面的字段名列表,那么按照表结构中定义的顺序依次指定每个字段中的值。添加新纪录后,该记录中所包含的数据就是Values子句中所包含的数据。
【例4.43】向“学生信息表”中插入一个学生记录“”09750211“,”胡美丽“,”女“,”1989-12-26“, ”团员“,”09电气2“”。
(2)更新数据(UPDATE) Update命令用于更新表中的纪录。语句格式如下: Update <表名> Set <列名>=<表达式>[,<列名>=<表达式>] [,……] [Where <条件>] 其中,Update子句指出进行记录修改的表的名称。Set子句指出将被更新的列及它们的新值。如果省略Where子句,则该列的每一行均用同一个值进行更新。
【例4.44】用SQL语句实现将“学生信息表”表中“胡美丽”同学的班级改为“09土木1” Update 学生信息表 Set 班级="09土木1" Where 姓名="胡美丽“
【例4.45】用SQL语句实现将学号为“09220101”的学生的“101”课程成绩增加10分。 Update 学生成绩表 Set 成绩 = 成绩+10 Where 课程号="101"And 学号="09220101"
(3)删除数据(DELETE) Delete命令用于删除表中的纪录。语句格式如下: Delete From <表名> [Where <条件>] 其中,From子句用于指定将要将记录加删除标志的表的名称。Where子句指定删除记录的条件。
【例4.46】用SQL语句实现:删除“学生信息表”中所有“09土木1”班的学生的记录。 Delete * From 学生信息表 Where 班级="09土木1"
4.6.5使用子查询 子查询也叫嵌套查询,这种类型的查询是一个查询块嵌套在另外一个查询的Where子句中,即一个查询的结果是另一个查询的条件。嵌套查询由里向外执行,先处理内层查询,再处理外层查询。设计子查询可以在查询设计网格的“字段”行输入语句来定义新字段,或在“条件”行来定义字段的条件。在以下方面可以使用子查询: (1)测试子查询的某些结果是否存在(使用Exists或Not Exists谓词)。 (2)在主查询中查找任何等于、大于或小于由子查询返回的值(使用Any,In或All谓词)。 (3)在子查询中创建子查询(嵌套子查询)。
【例4.47】查询所有工资高于平均工资教师的信息。显示“教师编号”、“姓名”、“工资”、“平均工资”,将查询结果保存为“高于平均工资”。
【分析】如果输入Select 教师编号,姓名,工资 From 教师信息表 Where 工资>Avg(工资) 执行后Access提示“Where 子句(工资)>Avg(工资))中不能有合计函数”的错误,这是因为在不适当的地方使用了合计函数(没有为Avg函数提供数据来源)。解决的办法是先使用子查询求出平均工资。
【说明】 (1)其中“Select Avg(工资) From 教师信息表”首先被执行(称内嵌套),计算出平均工资,结果将暂存;然后执行“Select 教师编号,姓名,工资From 教师信息表Where 工资>暂存的平均工资”,这层称为外嵌套。 (2)内嵌套是一个完整的、独立的查询,不要遗漏内嵌套的记录源。
查询结果中“平均工资”的小数点位数比较多。可以使用Round进行限制。Round函数的格式为:Round(X,n),其中X为输出的值,n是需保留的小数位数。如果将平均工资保留两位小数,改进后的SQL查询为: Select 教师编号,姓名,工资,Round((Select Avg(工资) From 教师信息表 ) ,2)As 平均工资 From 教师信息表 Where 工资>(Select Avg(工资) From 教师信息表)
【例4.48】查找同时选修了课程号为“101”和“301”的学生的学号。将查询结果保存为“选修2门课学生学号”。 【分析】因为同一条记录中不可能同时出现两个课程号,所以不能使用课程号="101" And 课程号="301"。解决的办法是使用子查询。
Select 学号 From 学生成绩表 Where 课程号="101" And 学号 In (Select 学号 From 学生成绩表Where 课程号="301")