中财ACCESS数据库复习题解析:SQL语句与数据库增删改查实战

发布时间:2026/9/26 1:36:59
中财ACCESS数据库复习题解析:SQL语句与数据库增删改查实战
简介这份《中财ACCESS数据库复习题》面向备考数据库原理与应用课程的学生尤其适合中央财经大学相关课程的学习者用于期末复习与知识点自测。内容围绕数据库三级模式结构、关系模型与完整性约束、并发控制、E-R模型转换、规范化理论及ACCESS数据库对象等核心考点展开并配有教材第一章至第六章的选择题及详细答案解析覆盖选择、投影、联接、SQL函数、视图与更新语句等典型题型。资源包共1个docx文件约23KB以文档形式集中呈现填空题与选择题便于打印或电子化刷题。目前已有67人学习下载可作为课堂笔记之外的补充练习材料帮助读者快速梳理概念脉络、检验掌握程度并查漏补缺。1. 从一份「中财ACCESS数据库复习题.docx」说起它到底在考什么如果你手上正躺着这份《中财ACCESS数据库复习题.docx》大概率不是想研究 Access 这个软件本身而是被它背后的那套东西卡住了——SQL 语句怎么写、查询条件怎么拼、表之间的关系怎么连、窗体报表的数据源从哪来。Access 在国内高校的数据库课程里长期扮演「入门教具」的角色中央财经大学的这套复习题本质上就是把关系数据库的核心概念压缩进一个可视化工具里考你建表、设主键、建关系、写查询、做统计、生成报表。它考的不是 Access 的按钮在哪而是你对「数据库增删改查」这件事的理解到不到位。这份材料适合三类人一是正在备考、需要把零散知识点串成体系的学生二是从 Access 转向 SQL Server、MySQL 的初学者想借它把 SQL 基础打牢三是工作中偶尔要维护老 Access 系统、需要快速回忆查询写法的从业者。热词里反复出现的「SQL 语句」「数据库增删改查」「数据库课程设计」恰好就是这份复习题的骨架。接下来我不逐题讲答案而是把它拆成一条能复现、能验证、能迁移到其他数据库的学习路径。2. 把复习题拆成四类考点建表、查询、统计、窗体数据源2.1 先看清 Access 的「表」和标准 SQL 的差异在哪Access 的表设计视图里你可以直接拖字段、选数据类型、设主键看起来和 SQL Server 的图形化建表差不多但底层差异会在写查询时暴露出来。Access 的数据类型叫「文本」「数字」「日期/时间」「是/否」「OLE 对象」对应到标准 SQL 大致是 VARCHAR、INT/DOUBLE、DATETIME、BIT、BLOB。复习题里常考的一个点Access 的「文本」默认长度是 255超过要改用「备注」而标准 SQL 里 VARCHAR 必须显式给长度。另一个高频考点是主键与索引——Access 允许复合主键但设置入口在「设计视图」里选中多行再点主键图标很多人第一次做会找不到。如果你要把复习题里的建表逻辑迁移到 SQL Server 或 MySQL常见做法是先用 Access 的「SQL 视图」把 DDL 导出来看一遍。Access 的 DDL 语法和标准 SQL 有出入比如它用COUNTER表示自增用YESNO表示布尔迁移时需要手动替换。下面这段是 Access SQL 视图里典型的建表语句以及我一般会改写成通用 SQL 的版本-- Access SQL 视图中的建表语句复习题常见样式 CREATE TABLE 学生 ( 学号 TEXT(10) PRIMARY KEY, 姓名 TEXT(20) NOT NULL, 性别 TEXT(2), 出生日期 DATETIME, 专业 TEXT(30) ); -- 迁移到 MySQL 时的等价写法 CREATE TABLE student ( student_id VARCHAR(10) PRIMARY KEY, name VARCHAR(20) NOT NULL, gender CHAR(2), birth_date DATETIME, major VARCHAR(30) );逻辑说明Access 的TEXT(n)在标准 SQL 里对应VARCHAR(n)但 Access 不区分 CHAR 和 VARCHAR统一用 TEXTDATETIME两边都有但 Access 的日期格式受系统区域设置影响迁移时要注意。参数上TEXT(10)的 10 是字符数不是字节数中文环境下 Access 按字符计MySQL 的 VARCHAR 在 utf8mb4 下也按字符计这一点是一致的。复习题里如果出现「设置字段有效性规则」那是 Access 特有的表级约束标准 SQL 里要用 CHECK 约束替代但 MySQL 8.0 之前对 CHECK 支持不完整这是迁移时的一个暗坑。2.2 查询题占分最重SELECT 的五个子句怎么对应复习题翻一遍复习题你会发现查询题几乎覆盖了 SELECT 的全部核心子句WHERE 做条件筛选、ORDER BY 排序、GROUP BY 分组、HAVING 过滤分组、JOIN 连接多表。Access 的查询设计视图会把它们拆成「字段」「条件」「排序」「总计」几行很多人对着界面会写一换成 SQL 视图就懵。我的建议是拿到任何一道查询题先在 SQL 视图里把它写成完整语句再对照设计视图看每个子句落在哪一行这样两边就打通了。复习题里最典型的题型是「查询选修了某门课的学生姓名和成绩」这需要三张表连接学生表、选课表、课程表。Access 的 JOIN 写法和标准 SQL 基本一致但 Access 要求 JOIN 必须用括号嵌套多表连接时括号位置错了会直接报语法错误。下面是一个三表连接的例子-- 查询选修了「数据库原理」且成绩大于 80 的学生姓名和成绩 SELECT s.姓名, c.课程名, sc.成绩 FROM (学生 AS s INNER JOIN 选课 AS sc ON s.学号 sc.学号) INNER JOIN 课程 AS c ON sc.课程号 c.课程号 WHERE c.课程名 数据库原理 AND sc.成绩 80 ORDER BY sc.成绩 DESC;逻辑说明Access 的多表 JOIN 必须用括号把前两个表先括起来再和第三个表连接这是 Access SQL 解析器的硬性要求标准 SQL 里可以省略括号。参数上AS别名在 Access 里对字段别名要用方括号或引号对表别名可以直接写ORDER BY默认升序加DESC降序。如果复习题里出现「模糊查询」Access 用LIKE配合*和?通配符而标准 SQL 用%和_这是考试和实际迁移时最容易混的一点。2.3 统计与分组Access 的「总计」行到底做了什么Access 查询设计视图里有一个「总计」按钮点下去每个字段下面会多出一行可以选 Group By、Sum、Avg、Count、Max、Min 等。这行东西本质上就是生成 GROUP BY 和聚合函数。复习题里常考「按专业统计学生人数」「按课程统计平均分」用设计视图点两下就出来了但换成 SQL 视图要自己写。我一般会让学生先在设计视图里做一遍再切到 SQL 视图抄下来反复几次就记住了。-- 按专业统计学生人数和平均年龄 SELECT 专业, COUNT(*) AS 人数, AVG(YEAR(DATE()) - YEAR(出生日期)) AS 平均年龄 FROM 学生 GROUP BY 专业 HAVING COUNT(*) 5 ORDER BY 人数 DESC;逻辑说明GROUP BY后面必须列出所有非聚合字段Access 对这点比 MySQL 严格MySQL 在宽松模式下可以省略但 Access 不行。HAVING用于过滤分组后的结果和WHERE的区别是 WHERE 在分组前过滤行HAVING 在分组后过滤组。参数上YEAR(DATE())是 Access 取当前年份的写法标准 SQL 里用YEAR(CURRENT_DATE)COUNT(*)统计所有行COUNT(字段)会跳过该字段为 NULL 的行复习题里如果问「统计有成绩的学生人数」要用后者。2.4 窗体和报表的数据源复习题里容易被忽略的实操点复习题如果只考 SQL那还好办但中财这套题里通常会有窗体和报表的题目问「窗体的记录源是什么」「报表的分组依据怎么设」。这部分没法用纯 SQL 解决需要理解 Access 的对象模型窗体绑定一个表或查询作为 RecordSource报表同理但报表多了「分组和排序」和「计算控件」。常见考法是给一个查询让你把它设为某个窗体的数据源然后问窗体上某个文本框的控件来源怎么写。我一般会这样处理先在查询里把需要的字段和计算列都写好再在窗体设计视图里把 RecordSource 设为这个查询然后文本框的 ControlSource 直接选字段名。如果是计算控件比如「显示成绩等级」就在 ControlSource 里写 IIF 表达式-- 在窗体文本框的控件来源中写 IIF 判断成绩等级 IIF([成绩]90,优秀,IIF([成绩]80,良好,IIF([成绩]60,及格,不及格)))逻辑说明Access 的 IIF 是三元表达式的嵌套等价于标准 SQL 的 CASE WHEN。参数上字段名要用方括号包起来字符串用双引号。这种写法在报表里也通用但报表的控件来源如果引用分组字段要注意作用域分组外的控件不能直接引用分组内的计算值这是复习题里容易失分的地方。3. 从复习题到真实数据库把 Access 查询迁移到 SQL Server 和 MySQL3.1 迁移前先做一次语法差异对照Access 的 SQL 方言和标准 SQL 有几十处差异复习题里不会全考但迁移时会全遇到。我整理了一张高频差异对照表做迁移前先过一遍能省掉大量试错时间。特性Access 写法SQL Server 写法MySQL 写法字符串连接CONCAT()通配符*?%_%_当前日期DATE()GETDATE()CURDATE()自增字段COUNTERIDENTITY(1,1)AUTO_INCREMENT布尔值YESNO/TRUEBITTINYINT(1)多表 JOIN必须括号嵌套可省略括号可省略括号日期格式化FORMAT()CONVERT()DATE_FORMAT()分页TOP nOFFSET FETCHLIMIT这张表里最坑的是字符串连接Access 用SQL Server 用MySQL 用CONCAT()。复习题里如果出现「把姓和名拼成全名」Access 写姓 名迁到 SQL Server 要改成姓 名迁到 MySQL 要改成CONCAT(姓, 名)。另一个坑是日期函数Access 的DATE()不带参数取当前日期SQL Server 的GETDATE()带时间MySQL 的CURDATE()只取日期写统计题时差一天就是差一天。3.2 用 Python 批量验证复习题里的查询结果复习题做完对答案最怕的是「看着对但实际跑出来不对」。我一般会用 Python 的 pyodbc 连 Access 文件把复习题里的查询逐条跑一遍和手工算的结果对比。这样既能验证答案又能顺便把查询语句存下来做迁移素材。import pyodbc # 连接 Access 数据库文件.accdb 或 .mdb conn pyodbc.connect( rDRIVER{Microsoft Access Driver (*.mdb, *.accdb)}; rDBQC:\path\to\your\database.accdb; ) cursor conn.cursor() # 逐条执行复习题里的查询并打印结果 queries [ SELECT 姓名 FROM 学生 WHERE 专业金融, SELECT 课程号, AVG(成绩) FROM 选课 GROUP BY 课程号, SELECT s.姓名, c.课程名 FROM (学生 AS s INNER JOIN 选课 AS sc ON s.学号sc.学号) INNER JOIN 课程 AS c ON sc.课程号c.课程号 ] for sql in queries: print(f执行: {sql}) cursor.execute(sql) for row in cursor.fetchall(): print(row) print(- * 40) cursor.close() conn.close()逻辑说明pyodbc 连接 Access 需要系统安装对应的 ODBC 驱动32 位和 64 位要匹配 Python 版本这是最常见的翻车点。参数上DBQ后面是 Access 文件的绝对路径路径里有中文或空格时要用原始字符串。如果报「未找到驱动程序」去 ODBC 数据源管理器里确认驱动名称或者换用 32 位 Python 配 32 位驱动。跑完这批查询你就得到了一份可迁移的 SQL 清单接下来改写成 SQL Server 或 MySQL 语法就快了。3.3 迁移到 SQL Server 的实操步骤与参数调整把 Access 查询迁到 SQL Server最省事的路径是用 SQL Server 的导入导出向导把表结构搬过去然后手工改查询。但向导对 Access 的「备注」字段和「是/否」字段处理得不够干净我一般会先建好目标表再用 Python 或 SSIS 搬数据。查询改写时重点盯三处字符串连接符、日期函数、TOP 分页。-- Access 原句SELECT TOP 10 姓名, 成绩 FROM 学生 ORDER BY 成绩 DESC -- SQL Server 等价写法2012 之后推荐 OFFSET FETCH SELECT 姓名, 成绩 FROM 学生 ORDER BY 成绩 DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY; -- 如果 SQL Server 版本较老用 TOP SELECT TOP 10 姓名, 成绩 FROM 学生 ORDER BY 成绩 DESC;逻辑说明Access 的TOP n在 SQL Server 里可以直接用但TOP n PERCENT和TOP n WITH TIES的语义要确认。OFFSET FETCH是 SQL Server 2012 引入的标准分页写法必须配合 ORDER BY 使用否则报错。参数上OFFSET 0 ROWS表示跳过 0 行FETCH NEXT 10 ROWS ONLY表示取 10 行做分页时改这两个数字即可。如果复习题里有「查询前 10 名」迁到 SQL Server 后建议统一用 OFFSET FETCH兼容性更好。3.4 迁移到 MySQL 时字符集和日期函数的坑MySQL 迁移最大的坑是字符集。Access 默认用系统区域编码中文 Windows 下是 GBK迁到 MySQL 如果目标库是 utf8mb4直接导入会乱码。我一般会先用 Python 读出 Access 数据转成 UTF-8 再写入 MySQL。日期函数方面Access 的FORMAT(日期, yyyy-mm)在 MySQL 里要改成DATE_FORMAT(日期, %Y-%m)格式串的占位符完全不同。import pyodbc import pymysql # 读 Access access_conn pyodbc.connect( rDRIVER{Microsoft Access Driver (*.mdb, *.accdb)}; rDBQC:\path\to\database.accdb; ) access_cursor access_conn.cursor() access_cursor.execute(SELECT 学号, 姓名, 专业 FROM 学生) rows access_cursor.fetchall() # 写 MySQL确保目标库字符集为 utf8mb4 mysql_conn pymysql.connect( hostlocalhost, userroot, passwordyour_password, databaseschool, charsetutf8mb4 ) mysql_cursor mysql_conn.cursor() mysql_cursor.executemany( INSERT INTO student (student_id, name, major) VALUES (%s, %s, %s), [(r[0], r[1], r[2]) for r in rows] ) mysql_conn.commit() access_cursor.close() access_conn.close() mysql_cursor.close() mysql_conn.close()逻辑说明pyodbc 读出的字符串在 Python 3 里已经是 Unicode写入 MySQL 时只要连接字符集设为 utf8mb4 就不会乱码。参数上executemany比逐条execute快一个数量级适合批量搬数据charsetutf8mb4必须显式指定否则 pymysql 默认用 latin1。如果 Access 里有「是/否」字段读出来是 True/False写入 MySQL 的 TINYINT(1) 会自动转成 1/0不用额外处理。4. 避坑与排查复习题和迁移中最容易翻车的五个点4.1 现象查询在 Access 里能跑迁到 MySQL 报语法错误原因Access 的 JOIN 括号嵌套、连接符、*通配符都不是标准 SQLMySQL 不认。解决按第 3 章的对照表逐项替换JOIN 去掉多余括号改CONCAT()*改%。如果报错信息里带near ...把报错位置前后的语句单独拿出来跑通常能定位到具体哪个符号没换。4.2 现象GROUP BY 查询在 Access 里正常迁到 MySQL 报「ONLY_FULL_GROUP_BY」错误原因MySQL 5.7 之后默认开启 ONLY_FULL_GROUP_BY要求 SELECT 列表里的非聚合字段必须出现在 GROUP BY 里Access 没这个限制。解决要么把缺失的字段补进 GROUP BY要么临时关闭该模式不推荐生产环境。复习题里如果出现「按专业统计人数但还要显示专业名称」确保专业字段在 GROUP BY 里。4.3 现象Access 日期字段迁到 SQL Server 后查询结果差一天原因Access 的日期存储精度和 SQL Server 的 DATETIME 不同Access 的DATE()只取日期SQL Server 的GETDATE()带毫秒比较时可能跨天。解决统一用CAST(GETDATE() AS DATE)取日期部分或者在 Access 侧就把日期字段规范成纯日期格式。复习题里做「查询今天出生的学生」这类题时两边都要注意。4.4 现象Python 连 Access 报「未找到驱动程序」原因Python 位数和 ODBC 驱动位数不匹配或者没装 Access 数据库引擎。解决确认 Python 是 32 位还是 64 位装对应位数的驱动如果用的是 Office 自带的 Access驱动通常随 Office 安装但 64 位 Office 只带 64 位驱动。实在不行用 32 位 Python 配 32 位驱动这是最稳的组合。4.5 现象复习题里的「有效性规则」迁到 MySQL 后不生效原因Access 的字段有效性规则是表级属性迁到 MySQL 后如果只建了字段没加 CHECK 约束规则就丢了。解决把 Access 的有效性规则翻译成 MySQL 的 CHECK 约束但注意 MySQL 8.0.16 之前对 CHECK 是忽略的要确认版本。复习题里如果考「设置成绩在 0 到 100 之间」迁移时写成CHECK (成绩 BETWEEN 0 AND 100)。5. 用复习题练手之后把 SQL 能力沉淀成可复用的查询模板做完这份复习题真正的收获不是记住某道题的答案而是把常见查询模式抽象成模板。我自己的习惯是建一个sql_snippets文件夹按「单表筛选」「多表连接」「分组统计」「子查询」「分页」分类每个模板写清楚适用场景和参数占位符。下次遇到类似需求直接改表名和字段名就能用比从头写快得多。比如「分组统计」这个模板我一般会写成这样-- 模板按某字段分组统计支持 HAVING 过滤和排序 -- 占位符{分组字段}、{聚合字段}、{聚合函数}、{表名}、{过滤条件} SELECT {分组字段}, {聚合函数}({聚合字段}) AS 统计值 FROM {表名} WHERE {过滤条件} GROUP BY {分组字段} HAVING COUNT(*) 1 ORDER BY 统计值 DESC;逻辑说明这个模板覆盖了复习题里 80% 的统计题改占位符就能套。参数上{聚合函数}可以是 COUNT、SUM、AVG、MAX、MIN{过滤条件}如果不需要就写11保持语法完整。我一般还会在模板下面附一条注释写明 Access 和 MySQL 在这个模板上的差异点比如 Access 的 HAVING 不能引用 SELECT 里的别名MySQL 可以。另一个值得沉淀的是「多表连接」模板。复习题里的连接题通常不超过三张表但真实业务里五张表以上的连接很常见。我的做法是先画一张表关系草图标出连接字段和连接类型INNER、LEFT、RIGHT再按「主表在前、从表在后」的顺序写 JOIN每写一个 JOIN 就单独跑一次验证行数避免最后结果爆炸。这个习惯帮我省过很多次后悔药——有一次做课程设计四张表连接没验证中间结果最后查出来数据翻了三倍排查了一下午才发现是连接字段有重复值。最后说一个验证技巧不管复习题还是真实迁移写完查询后先用SELECT COUNT(*)跑一遍确认行数和预期一致再换成SELECT *看具体数据。这个顺序能让你在数据量大的时候快速定位是「条件写错」还是「连接写错」。我做了这么多年数据库相关的工作最深的教训就是不要相信「看着对」的查询只相信跑出来的行数。希望帮到你。本文还有配套的精品资源点击获取