ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Access数据库复习题拆解:从SQL查询到DAO记录集全攻略

Access数据库复习题拆解:从SQL查询到DAO记录集全攻略 简介中财ACCESS数据库复习题.docx是一份面向ACCESS数据库课程学习与考前复习的要点与题库资料覆盖数据库三级模式结构、关系模型完整性约束、并发控制、实体间联系、SQL选择投影联接操作、规范化及E-R模型转换等核心概念也包含针对具体数据表的SQL查询、视图创建、记录更新等典型题型。资源内为1个docx文档共23KB文字版便于直接打印、批注或导入笔记软件。包内系统梳理了填空题知识框架从主键选取、INSERT INTO插入记录到DROP TABLE删表、SUM/MIN/COUNT函数用法均有涉及同时给出多道选择题的标准答案与解析有助于快速定位易混淆概念如BETWEEN边界判定、SELECT MAX数组存储位置等适合需要集中回顾知识点的学生考前自测与查漏补缺。该文档目前已获得67人次的浏览学习可作为ACCESS基础教学或期末复习的辅助材料。1. 一份ACCESS数据库复习题为什么值得拆开讲这套中财《数据库及应用》复习题表面上是一份期末备考资料实际上把Access数据库从概念到实操的考点全串了一遍三级模式、完整性约束、SQL查询、视图、DAO记录集操作几乎每道题都在考“能不能动手”。我拆完以后的感觉是它比很多教材的课后题更贴近真实办公场景——比如给你一个股票表让你排序、分组、更新单价这些操作放到企业里就是报表和批量数据处理。对两类人尤其有用一类是正在考Access或数据库基础课程的学生另一类是工作中要接手Access数据库维护的工程师。前者需要把概念和SQL对应起来后者需要知道记录集怎么遍历、怎么避免空指针和重复主键。这篇文章不贴原题答案而是把每类题背后的原理、语句边界和容易翻车的细节展开你可以拿它当复习提纲也可以当Access SQL的速查手册。2. 从三级模式到完整性约束先把理论基础夯实2.1 外模式、概念模式、内模式到底对应数据库的哪一层复习题第一题问的就是三级模式结构外模式、概念模式也叫模式、内模式。这是数据库系统的逻辑分层初学者容易混淆因为Access里没有直接暴露这三个概念。外模式对应视图VIEW是用户看到的数据窗口可以隐藏字段、限制行概念模式对应整张表的逻辑结构比如“学生表”有哪些列、主键是什么内模式对应物理存储比如Access里.accdb/.mdb文件在磁盘上的组织方式。Access是一个自带图形界面的关系型数据库通常你建表、建查询操作的是概念模式和外模式。视图就是典型的外模式下面这个语句在Access里创建了一个只含深圳交易所股票的视图CREATE VIEW stock_view AS SELECT * FROM stock WHERE 交易所深圳;执行后视图里只有深发展、深万科两条记录。视图本身不存数据它的行和列来自基表stock所以对视图查询时引擎会去读原表。这也是为什么题里考“视图对应外模式”因为视图给用户暴露的正是经过筛选后的数据视图。2.2 实体完整性靠主键参照完整性靠外键用户自定义完整性靠规则关系模型的三类完整性约束中实体完整性要求主键不能为NULL且不能重复参照完整性要求外键要么为NULL要么等于被引用表的主键用户自定义完整性是业务规则比如年龄必须大于0。在Access里写SQL建表时这些约束是这样落地的CREATE TABLE 学生表 ( sno TEXT(10) PRIMARY KEY, sname TEXT(8) NOT NULL, ssex TEXT(1), sage INTEGER, sdept TEXT(20) );这里sno作为主键自动满足实体完整性。NOT NULL是用户自定义完整性约束的简单例子——不许为空。如果你再建一个修课表用外键指向学生表CREATE TABLE sc ( sno TEXT(10) NOT NULL, cno TEXT(6) NOT NULL, grade INTEGER, PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES 学生表(sno) );注意Access的SQL语法中REFERENCES需要在查询设计视图的SQL模式下执行而且两表都要保存在同一个数据库文件中。这个外键约束确保你插入sno9999的修课记录时会被拒绝因为学生表里没有这个学号。2.3 一对一到多对多关系类型决定表结构怎么拆“一个公司只能有一个总经理”“一个员工可以参与多个项目一个项目也可以有多个员工”……这类题考的是实体间的联系类型。关系类型直接影响表的设计一对一可以把两个实体的主键合并成一张表或者把一方的主键作为另一方的外键并加唯一约束一对多在“多”的一方添加外键例如订单表里放“客户号”多对多必须拆成三张表中间表存两个外键。回到复习题班级和班长是一对一因为一个班只有一个班长、一个班长只对应一个班。职工和部门是一对多所以“部门号”放在职工表里而不是反过来。多对多比如“学生-课程”就要建中间表sc联合主键sno, cno。3. SQL 查询与操作选择、投影、连接和更新一次说清3.1 SELECT 的执行顺序与排序陷阱复习题第1题是SELECT * FROM stock ORDER BY 单价答案选“升序排列”。很多人疑惑为什么不是降序因为ORDER BY默认升序ASC降序要加DECS。这个考点背后是SQL子句的执行顺序先FROM再WHERE再GROUP BY再HAVING再SELECT最后ORDER BY。所以ORDER BY里可以使用SELECT中的别名但不能在WHERE里用别名。实操时排序通常伴随Top N。比如“工资最高的前十名”SELECT TOP 10 * FROM 职工 ORDER BY 基本工资职务津贴 DESC;这里TOP 10是Access特有的写法SQL Server也支持但MySQL用LIMIT。注意TOP 10必须和ORDER BY一起用才有意义否则随机取10条。另外Access的TOP支持PERCENT比如TOP 10 PERCENT等价于TOP 10%但语法是TOP 10 PERCENT不是TOP 10%。3.2 WHERE 与 BETWEEN含边界与不含边界的区别题目里单价 BETWEEN 12.76 AND 15.20等价于单价12.76 AND 单价15.20。BETWEEN是闭区间包括两端值。这个点很基础但考试喜欢反着考“以下哪个等价”实际工作中也容易踩如果你要查询一个开区间比如不下于12.76但不超过15.20就要写 AND 千万不能套BETWEEN去改边界。通配符也是Access SQL的重灾区。Access里LIKE A*星号代表任意多个字符问号代表单个字符而SQL Server用的是百分号%和下划线_。这个差异在从Access迁移到其他数据库时经常导致查询结果为空。复习题第13题就是考这个DELETE FROM 图书 WHERE 图书号 LIKE A*;Access中删除记录用DELETE FROM但不是真正物理删除只是加删除标记压缩数据库后才彻底删除。而DROP TABLE是删表结构完全不同。3.3 分组统计GROUP BY 与 HAVING 的配合“求每个交易所的平均单价”必须按交易所分组而不是按单价分组。正确写法是SELECT 交易所, AVG(单价) FROM stock GROUP BY 交易所;如果题目要求“统计每个部门的平均年龄只取前3个”并且要降序排列需要用HAVING吗不需要只要GROUP BY ORDER BY TOPSELECT TOP 3 部门号, AVG(年龄) AS 平均年龄 FROM 职工 GROUP BY 部门号 ORDER BY AVG(年龄) DESC;这里有个细节Access的ORDER BY中不能直接用别名“平均年龄”有的版本可以但保险起见还是用表达式。HAVING用在分组后过滤例如“订单数在3个以上且平均金额在200元以上”SELECT 职员号 FROM 订单 GROUP BY 职员号 HAVING COUNT(*)3 AND AVG(金额)200;注意WHERE过滤行HAVING过滤组。如果 WHERE 和 HAVING 同时出现先执行WHERE再分组再HAVING。这是高频考点。3.4 子查询与聚合WHERE 中使用聚合函数题目问“单价等于最低单价的记录”不能直接在WHERE里写MIN(单价)必须用子查询SELECT 股票代码, 单价 FROM stock WHERE 单价 (SELECT MIN(单价) FROM stock);Access支持在WHERE后跟一个返回单值的子查询。如果子查询返回多行要用IN。统计“最低价的记录个数”根据题数据最低价7.48有两条记录青岛啤酒和深发展所以结果记录个数是2。子查询还可以用在NOT IN排除场景比如“没有签订任何订单的职员”SELECT 职员号, 姓名 FROM 职员 WHERE 职员号 NOT IN (SELECT 职员号 FROM 订单);性能上这种写法在数据量小时没问题但职员工资表几万行时建议改成LEFT JOIN ... IS NULL效果一样执行计划更优。3.5 INSERT、UPDATE、DELETE 与 ALTER TABLE写操作比查询更容易出问题INSERT有两张常见形式。一种是向指定列插入INSERT INTO 学生表(sno, sname, ssex, sage, sdept) VALUES (1001,张小和,男,39,财经系);另一种是从表查询插入另一张表SELECT 学号, 姓名 INTO 优秀学生 FROM 学生 WHERE 高考成绩 600;这个SELECT INTO在Access里会创建新表“优秀学生”但如果表已存在会报错需要先删除。UPDATE不用多说最容易错的是忘了WHERE条件。比如“所有单价上浮8%”UPDATE stock SET 单价 单价 * 1.08;而“职称为高级工程师的津贴加200”UPDATE 职工 SET 职务津贴 职务津贴 200 WHERE 职称 高级工程师;DELETE也一样不带WHERE就是清空表。而“删除表”用DROP TABLE不是DELETE。题目里“删除表stock”唯一正确命令是DROP TABLE stock。ALTER TABLE在Access里的语法略有不同。增加字段ALTER TABLE 部门 ADD 单位所在地 TEXT(20);删除字段ALTER TABLE 部门 DROP COLUMN 单位所在地;注意Access用DROP COLUMN不要写成DROP 单位所在地。新增记录直接用INSERT。字段类型TEXT对应文本日期要用DATETIME整型是INTEGER或LONG。实际操作中我习惯先用查询设计视图的“数据表视图”确认字段类型再写ALTER否则类型不匹配容易把已有数据截断。4. Access 对象与 DAO 记录集窗体背后的数据流动4.1 七个对象里报表是唯一不依赖数据文件的对象吗Access数据库对象有七种表、查询、窗体、报表、数据访问页、宏、模块。复习题说“除报表外其他对象都存放在.MDB文件里”这句话容易误解。实际上在.accdb格式中所有对象包括报表都存在数据库文件中报表只是不直接存储数据它的数据源来自表或查询。早期版本里报表可以在独立文件里但现代Access统一管理。这题更准确的理解是报表的数据来源是查询或表它本身不是数据容器。表是存储数据的根本查询是动态数据集合窗体是人机交互界面报表用于打印输出。宏和模块是自动化逻辑。数据访问页在较新版本中已不再支持旧版是网页形式。4.2 用 DAO.Recordset 遍历记录比 DLookup 更可控复习题末尾给出了第10章的VBA代码通过DAO操作“读者注册表”。核心流程是声明DAO.Database和DAO.Recordset然后在Form_Load里打开数据库和记录集。这段代码值得细看的是循环遍历和增删改的写法。Dim db As DAO.Database Dim rst As DAO.Recordset Private Sub Form_Load() Set db DBEngine.Workspaces(0).Databases(0) Set rst db.OpenRecordset(读者注册表, dbOpenDynaset) End SubDBEngine.Workspaces(0).Databases(0)指的是当前Access数据库。如果你想打开外部数据库需要先OpenDatabase例如DBEngine.Workspaces(0).OpenDatabase(C:\data\library.accdb)。遍历记录集判断是否重复用的是rst.MoveFirstDo While Not rst.EOF其中EOF表示文件尾。这是最经典的遍历模式。如果记录集只有一行也要先判断BOF And EOF都为真——这代表空记录集。添加记录的标准动作是AddNew→ 给字段赋值 →Update。这段代码里有个细节ent MsgBox(...)如果用户点击“取消”就执行CancelUpdate不会写入数据库。这是事务思想的雏形。rst.AddNew rst(读者ID) txt1.Value rst(姓名) txt2.Value rst(证件号码) txt3.Value rst(注册日期) txt4.Value rst(联系方式) txt5.Value rst.Update注意字段名必须和表里完全一致否则会报“找不到字段”。代码里用txt1.Value而不是txt1.Text是因为当文本框失去焦点后Value才能正确获取内容Text只能在焦点期间读取。4.3 查找、编辑、删除记录游标移动的常见误区查找功能里db.OpenRecordset(strsql)创建了一个新记录集rst1.EOF用来判断是否存在记录。如果找到多条代码用MsgBox询问“查找是否正确”点“否”就MoveNext继续找。这个逻辑有一个问题当循环到EOF时没有退出循环可能会陷入无限循环——实际代码里Do While Not rst1.EOF会在EOF时退出但如果用户一直点“否”到最后一条后循环结束也不会崩溃。更健壮的写法是加一个标志位。编辑记录使用Edit和Update组合删除使用Delete。Delete之后记录指针会指向已删除的位置必须移动指针才能继续操作。代码里删除后直接MoveFirst这没问题但如果记录集为空MoveFirst会报错需要先判断BOF And EOF。移动记录的四个按钮首记录、上一记录、下一记录、尾记录。题目代码里cmd2_Click重复出现了两次一次是“查找”一次是“首记录”这是因为原题排版有误。实际编写VBA时注意按钮的Click事件不能重复定义否则编译错误。Private Sub cmdFirst_Click() rst.MoveFirst Call ShowData End Sub Private Sub cmdNext_Click() If rst.EOF Then MsgBox 已到最后一条 Else rst.MoveNext Call ShowData End If End Sub这里的ShowData是一个自定义过程把当前记录的字段值塞到文本框里。这样主逻辑清晰避免在每个事件里重复写赋值代码。5. 易错点与刷题技巧把复习题当面试题来做5.1 五个高频易错点速查下面是复习题里最容易出错的几个点也是Access开发中常见的坑整理成表方便对比场景正确做法常见错误降序取前几条ORDER BY 字段 DESC忘了DESC默认升序空值判断WHERE 字段 IS NULL写字段 Null永远为假删除表DROP TABLE 表名用DELETE FROM视图对应层次外模式写成模式或内模式多表分组按关联字段分组按非分组列分组导致语法错误另一个高频点是COUNT(*)与COUNT(列名)的区别。COUNT(*)统计所有行包括NULLCOUNT(列名)跳过NULL。题里问“非空值的个数”必然用COUNT(字段名)如果字段是主键两者相同。5.2 用查询设计视图对照SQL比死记硬背有效Access的查询设计视图QBE会自动生成SQL这是刷题时最好的自检工具。你可以把题目要求的查询用QBE拖出来然后切换到SQL视图看Access生成的语句再对比标准答案。比如创建一个统计每个系女生人数的查询在“创建”选项卡里选“查询设计”添加“学生”表双击“所在系”和“学号”字段在“总计”行把“学号”改为“计数”在“所在系”条件列输入女运行后切到SQL视图会看到类似SELECT 学生.所在系, Count(学生.学号) AS 学号之计数 FROM 学生 WHERE (((学生.性别)女)) GROUP BY 学生.所在系;这个过程中你能直观理解GROUP BY和WHERE的位置关系。如果自己手写SQL写错了比如把WHERE写到GROUP BY后面QBE会拒绝执行这时再对照生成的正确语句改印象更深。5.3 一个能直接照抄的 VBA 数据遍历模板最后分享一个在实际Access维护中常用的数据导出模板。当你需要把表中符合条件的数据批量处理到Excel或文本文件时这段代码比DoCmd.TransferSpreadsheet更灵活Sub ExportData() Dim db As DAO.Database Dim rst As DAO.Recordset Dim fso As Object, ts As Object Dim sql As String Set db CurrentDb sql SELECT * FROM 职工 WHERE 基本工资3000 Set rst db.OpenRecordset(sql, dbOpenSnapshot) Set fso CreateObject(Scripting.FileSystemObject) Set ts fso.CreateTextFile(D:\export.txt, True) Do While Not rst.EOF ts.WriteLine rst!职工号 | rst!姓名 | rst!基本工资 rst.MoveNext Loop ts.Close rst.Close db.Close Set rst Nothing Set db Nothing End Sub这里dbOpenSnapshot表示静态快照适合只读查询如果需要更新数据用dbOpenDynaset。写文件用Scripting.FileSystemObject分隔符用竖线避免数据里含逗号或制表符时Excel解析错乱。这段代码不需要额外引用Access内置。把它放在标准模块里点击运行就能在指定路径生成文本文件。本文还有配套的精品资源点击获取
返回列表