简介:这份《中财ACCESS数据库复习题》面向备考数据库原理与应用课程的学生,尤其适合正在准备期末或等级考试、需要系统梳理ACCESS核心考点的学习者。内容围绕数据库三级模式结构、关系模型完整性约束、并发控制、E-R模型转换、规范化以及SQL选择、投影、联接等操作展开,并配有教材第一章至第六章的选择题及详细答案解析,覆盖填空、选择等常见题型。资源包共1个docx文件,约23KB,以文字题目与答案为主,便于打印或电子化复习。已有67人学习下载。读者可借助其中的知识点归纳与真题解析,快速定位薄弱环节,掌握主键、视图、聚合函数等高频考点的解题思路,适合作为考前冲刺与查漏补缺的练习材料。
1. 中财ACCESS数据库复习题:一份能直接进ACCESS里跑通的题库
如果你正在准备中财的数据库及应用考试,或者带学生刷ACCESS的SQL题,这份《中财ACCESS数据库复习题.docx》大概率能省你不少时间。它不是那种只有答案没有解析的“裸题集”,而是把填空题、选择题、命令功能题、SQL建表与查询题、甚至第10章的VBA代码都收进来了,覆盖面从三级模式一路铺到DAO记录集操作。我翻完之后的判断是:它更像一份“考点地图”,你照着它过一遍,能快速定位自己哪块是空的。适合两类人:一是期末前需要集中刷题的学生,二是想用ACCESS练手SQL的初学者。但要注意,里面的SQL写法混了ACCESS特有语法和标准SQL,直接照搬到SQL Server或MySQL会翻车,后面我会把边界讲清楚。
2. 三级模式与关系模型:填空题背后的考点怎么串
2.1 三级模式不是背三个词就完事
复习题第一道填空题就是“外模式、________、内模式”,答案填概念模式。很多人背到这里就停了,但考试真正爱考的是三者之间的关系。外模式是用户视图,概念模式是全局逻辑结构,内模式是物理存储。ACCESS里你看到的“表”和“查询”其实偏外模式层面,而表之间的关系和约束才是概念模式。复习题里还有一道选择题问“数据库中的视图对应三级模式中的哪个”,答案是外模式。这两道题放在一起看,出题人的意图就很明显:让你分清“用户看到什么”和“数据库实际怎么组织”。
我一般会建议用一张对照表来记,比死背效率高:
| 三级模式 | 对应ACCESS对象 | 典型考题 |
|---|---|---|
| 外模式 | 查询、窗体、报表 | 视图属于哪层 |
| 概念模式 | 表结构、关系、约束 | 主键、外键定义 |
| 内模式 | 存储文件(.mdb/.accdb) | 文件扩展名 |
这张表不是官方教材里的,是我自己刷题时总结的,能帮你把抽象概念落到ACCESS的具体对象上。
2.2 关系模型的三个完整性和主键选择
复习题里反复出现实体完整性、参照完整性、用户自定义完整性。实体完整性靠主键保证,参照完整性靠外键保证,用户自定义完整性就是CHECK约束那一类。有一道选择题问“实体完整性用什么保证”,答案是主码。还有一道问“外码的作用是什么”,正确选项是“在所引用的列的已有值范围内限制外码列的取值范围”。这个表述有点绕,翻译成人话就是:外键的值必须能在被引用的表里找到对应的主键值,否则插入失败。
主键选择也是高频考点。复习题里有一道:“工资关系中有工资号、姓名、职务工资、津贴、公积金、所得税等字段,哪个可以作为主键?”答案是工资号。理由很简单:工资号能唯一标识一条记录,其他字段都可能重复。这里有个容易踩的坑:如果一张表里没有明显的唯一字段,就要考虑复合主键。复习题第31题就考了这个——购买情况表允许一个顾客在不同时间对同一产品购买多次,主键必须是(顾客号、产品号、购买时间)三个字段的组合。只选顾客号或只选顾客号+产品号都不够,因为时间维度被漏掉了。
2.3 E-R模型转关系模型的规则
复习题里有一道填空题:“将E-R模型转换成关系模型遵守的原则是:一个实体型转化成一个________”,答案是关系。这个规则看起来简单,但实际考试会考联系怎么处理。一对多联系通常把“一”方的主键放到“多”方作为外键;多对多联系必须单独建一张关系表;一对一联系可以把任一方的主键放到另一方作为外键。复习题第33题就考了:“实体A与实体B之间是一对多联系,为反映两个实体之间的关联关系,应______”,正确答案是“将外码放置在实体B中”——这里B是多的一方。
概念结构设计的三个步骤也在填空题里出现了:设计局部E-R图、综合成初步E-R图、E-R图优化。这三个步骤的顺序不能乱,优化是最后一步,目的是消除冗余和冲突。
3. SQL语句实战:从建表到查询,把复习题里的题跑一遍
3.1 建表语句与数据类型映射
复习题最后一部分要求用标准SQL建立学生表、课程表、修课表,并且把语句存到sql.txt里。ACCESS的SQL视图里可以直接跑这些语句,但数据类型写法要注意。ACCESS支持TEXT、INTEGER、DATE等类型,但长度写法是TEXT(10)而不是VARCHAR(10)。下面是我在ACCESS查询视图里实测能跑通的建表语句:
-- 学生表:学号为主键,姓名非空 CREATE TABLE student ( sno TEXT(10) PRIMARY KEY, sname TEXT(8) NOT NULL, ssex TEXT(1), sage INTEGER, sdept TEXT(20) ); -- 课程表:课程号为主键,课程名非空 CREATE TABLE course ( cno TEXT(6) PRIMARY KEY, cname TEXT(10) NOT NULL, credit INTEGER, semester INTEGER ); -- 修课表:学号+课程号复合主键 CREATE TABLE sc ( sno TEXT(10), cno TEXT(6), grade INTEGER, type TEXT(4), PRIMARY KEY (sno, cno) );逻辑说明:ACCESS的CREATE TABLE语句不支持VARCHAR,要用TEXT;主键可以写在字段后面,也可以用PRIMARY KEY(字段列表)单独声明。修课表的主键是复合主键,因为一个学生可以修多门课,一门课也可以被多个学生修,只有学号+课程号组合才能唯一标识一条修课记录。
参数说明:TEXT(10)表示最大10个字符,INTEGER是长整型,PRIMARY KEY声明主键。如果你在ACCESS里执行时报“语法错误”,先检查是不是用了VARCHAR或INT,换成TEXT和INTEGER基本能解决。
3.2 查询语句:从单表筛选到分组统计
复习题里的查询题覆盖了SELECT的典型用法。我挑几道有代表性的,把语句和考点拆开讲。
第一类:条件筛选。查询不是信息系、数学系的学生姓名、系和性别:
SELECT sname, sdept, ssex FROM student WHERE sdept NOT IN ('信息系', '数学系');这里用NOT IN比用<> AND <>更简洁,考试里两种写法都算对,但NOT IN可读性更好。
第二类:模糊查询。查询姓“张”的学生详细信息:
SELECT * FROM student WHERE sname LIKE '张*';注意ACCESS里模糊匹配用的是而不是%,这是ACCESS和标准SQL的一个大区别。复习题第21题也考了这一点:“如果想显示电话号码字段中6打头的所有记录,在条件行键入什么”,答案是Like "6"。如果你在ACCESS里写LIKE '张%',查不出结果,这是血泪经验。
第三类:分组统计。统计每个系的女生人数:
SELECT sdept, COUNT(*) AS 女生人数 FROM student WHERE ssex = '女' GROUP BY sdept;逻辑说明:WHERE在分组前过滤,只保留女生记录;GROUP BY按系分组;COUNT(*)统计每组记录数。如果还要筛选分组后的结果,比如只显示女生人数大于5的系,就要用HAVING:
SELECT sdept, COUNT(*) AS 女生人数 FROM student WHERE ssex = '女' GROUP BY sdept HAVING COUNT(*) > 5;复习题第14题考的就是这个结构。很多人会把HAVING写成WHERE,或者把聚合函数放在WHERE里,这两种写法在ACCESS里都会报错。
第四类:连接查询。查询职称是高级工程师的职工姓名、职称和所在部门:
SELECT 职工.姓名, 职工.职称, 部门.部门名称 FROM 职工 INNER JOIN 部门 ON 职工.部门号 = 部门.部门号 WHERE 职工.职称 = '高级工程师';逻辑说明:INNER JOIN把职工表和部门表按部门号关联起来,WHERE筛选职称。复习题里有一道类似的题,但答案写的是“职称<>‘高级工程师’”,那个是题目本身有误,正确逻辑应该是等于而不是不等于。你在刷题时如果发现答案和题意矛盾,以题意为准。
3.3 更新、删除与表结构修改
复习题里有一道操作题:将职称为“高级工程师”的所有职工的职务津贴增加200元。语句是:
UPDATE 职工 SET 职务津贴 = 职务津贴 + 200 WHERE 职称 = '高级工程师';参数说明:SET后面跟要修改的字段和新值,WHERE限定修改范围。如果不写WHERE,整张表的职务津贴都会加200,这是不可逆操作,执行前一定先SELECT确认范围。
删除记录用DELETE:
DELETE FROM 职工 WHERE YEAR(出生日期) < 1955;注意ACCESS里日期函数用YEAR(),标准SQL里可能是EXTRACT(YEAR FROM 出生日期),两者不通用。
修改表结构用ALTER TABLE:
-- 增加字段 ALTER TABLE 部门 ADD 单位所在地 TEXT(20); -- 删除字段 ALTER TABLE 部门 DROP 单位所在地;ACCESS的ALTER TABLE支持ADD和DROP,但不支持一次加多个字段,也不支持修改字段类型。如果你要改字段类型,只能在设计视图里手动改,这是ACCESS的限制。
4. 避坑与排查:刷ACCESS SQL题时最容易翻车的五个地方
4.1 通配符用错,查询结果为空
现象:写LIKE '张%'查姓张的学生,结果一条都没有。原因:ACCESS的SQL视图默认使用ANSI-89通配符,代表任意多个字符,?代表单个字符,%和_是标准SQL的通配符,在ACCESS里不生效。解决:把%换成,把_换成?。如果确实想用%和_,需要在ACCESS选项里开启ANSI-92兼容模式,但考试环境一般不会改这个设置,所以直接记ACCESS的写法更稳妥。
4.2 日期格式不对,条件筛选失效
现象:WHERE 签订日期 > #2005-1-1# 报错或查不出结果。原因:ACCESS的日期常量必须用#括起来,而且格式对区域设置敏感。有些机器上#2005-1-1#能识别,有些机器上必须写成#1/1/2005#。解决:统一用#月/日/年#格式,比如#1/1/2005#。复习题里用的是{^2005-1-1},那是Visual FoxPro的写法,在ACCESS里跑不通,别混用。
4.3 HAVING和WHERE混用,聚合条件写错位置
现象:SELECT 职员号 FROM 订单 GROUP BY 职员号 HAVING COUNT()>3 WHERE AVG(金额)>200 报错。原因:WHERE必须在GROUP BY之前,HAVING在GROUP BY之后。聚合函数不能出现在WHERE里。解决:把聚合条件全部放到HAVING里,写成HAVING COUNT()>3 AND AVG(金额)>200。复习题第14题的选项B就是正确写法,选项D把WHERE和HAVING的位置搞反了。
4.4 主键选错,插入重复记录
现象:向修课表插入两条学号相同但课程号不同的记录,第二条被拒绝。原因:主键只设了学号,没有把课程号加进去。解决:建表时用PRIMARY KEY(sno, cno)声明复合主键,或者在设计视图里同时选中两行再点主键按钮。复习题第31题考的就是这个点,购买情况表的主键必须是顾客号+产品号+购买时间的组合。
4.5 VBA代码里记录集未关闭,下次打开报错
现象:第10章的VBA代码运行几次后,再打开窗体提示“数据库已被占用”或“记录集已打开”。原因:cmd3_Click里虽然写了rst.Close和db.Close,但如果代码中途出错,Close不会执行。解决:在错误处理里加清理逻辑,或者用On Error GoTo Cleanup,在Cleanup标签里统一关闭记录集和数据库。我一般会在Form_Unload事件里也加一遍关闭操作,双保险。
5. 用DAO记录集把复习题变成可交互的窗体
复习题第10章给了一段完整的VBA代码,用DAO.Recordset操作“读者注册表”,实现了添加、查找、前后翻页、修改、删除。这段代码的价值在于:它把前面所有SQL知识点串成了一个可运行的小系统。如果你只是刷选择题,可能觉得VBA离考试很远,但中财的数据库及应用课程往往要求做一个课程设计,这段代码就是现成的模板。
我建议的进阶用法是:把第3章建的学生表、课程表、修课表导入ACCESS,然后仿照第10章的代码结构,做一个学生信息管理窗体。核心改动是把记录集的数据源从“读者注册表”换成“student”,字段名对应改掉。下面是我改过的关键部分:
Option Compare Database Dim rst As DAO.Recordset Dim db As DAO.Database Private Sub Form_Load() Set db = DBEngine.Workspaces(0).Databases(0) Set rst = db.OpenRecordset("student", dbOpenDynaset) ' 初始化文本框为空 txtSno.Value = "": txtSname.Value = "": txtSsex.Value = "" txtSage.Value = "": txtSdept.Value = "" End Sub Private Sub cmdAdd_Click() ' 学号和姓名不能为空 If RTrim(txtSno.Value) = "" Or RTrim(txtSname.Value) = "" Then MsgBox "学号和姓名不能为空", vbOKOnly, "错误提示" txtSno.SetFocus Exit Sub End If rst.AddNew rst("sno") = txtSno.Value rst("sname") = txtSname.Value rst("ssex") = txtSsex.Value rst("sage") = Val(txtSage.Value) rst("sdept") = txtSdept.Value rst.Update MsgBox "添加成功", vbOKOnly, "提示" End Sub Private Sub cmdDelete_Click() If Not rst.EOF Then If MsgBox("确认删除当前记录?", vbYesNo, "确认") = vbYes Then rst.Delete rst.MoveNext If rst.EOF Then rst.MoveLast Call ShowCurrent End If End If End Sub Private Sub ShowCurrent() ' 把当前记录的值填到文本框 If Not rst.EOF And Not rst.BOF Then txtSno.Value = rst("sno") txtSname.Value = rst("sname") txtSsex.Value = rst("ssex") txtSage.Value = rst("sage") txtSdept.Value = rst("sdept") End If End Sub逻辑说明:dbOpenDynaset表示打开一个动态集,支持增删改。AddNew开始一条新记录,给字段赋值后必须调Update才会写入。Delete删除当前记录后,记录指针会失效,所以要MoveNext再判断是否到了末尾。ShowCurrent是一个自定义过程,把当前记录的值同步到文本框,翻页和删除后都调它。
参数说明:DBEngine.Workspaces(0).Databases(0)是获取当前数据库的引用,这是ACCESS DAO的固定写法。rst("sno")是字段引用,字段名要和表结构一致。Val(txtSage.Value)把文本转成数字,因为sage字段是整型。
验证方法:运行窗体后,先点添加,输入学号1001、姓名张三、性别男、年龄20、系别财经系,确认后记录写入。再点删除,确认删除后记录消失。最后用ACCESS的“表”视图打开student表,核对数据是否一致。如果窗体显示的数据和表里不一致,检查ShowCurrent里字段名有没有写错。
从那以后我每次用DAO操作记录集,都会在Form_Unload里强制加一遍rst.Close和db.Close,因为吃过亏——有一次调试时中途报错,记录集没关,再打开窗体就提示数据库被锁定,只能重启ACCESS。希望帮到你。
本文还有配套的精品资源,点击获取