简介这份资源是大连理工大学软件学院数据库系统课程的上机实验报告基于华为 OpenGauss 数据库管理系统编写面向正在学习数据库课程、需要完成上机实验或撰写实验报告的高校学生。报告围绕数据库核心操作展开涵盖 DDL 数据定义创建数据库、表、索引与视图、DML 数据操作插入、更新、删除、数据查询单表查询、聚合查询、多表查询、子查询与集合查询、索引操作以及事务的并发控制等模块并配有预备知识、实验任务与 SQL 代码及对应结果便于对照练习与复盘。资源包共 1 个 docx 文件约 1.36MB结构完整、条理清晰可直接作为实验报告模板或复习提纲使用。目前已有 619 人学习下载适合需要系统掌握 OpenGauss 基本操作、查漏补缺的软件学院学生参考借鉴。1. 大连理工软件数据库opengauss上机作业报告从建库到查询一份能直接复现的实操记录选课系统里弹出“数据库上机”四个字的时候很多人第一反应是打开文档抄一段 SQL 交差。但大连理工软件学院的这门课上机作业报告不是走形式——它要求你在 openGauss 上从建库、建表、插数据一路做到多表查询和存储过程最后交一份能跑通的报告。我带过几届学弟做这份作业最常见的翻车点不是 SQL 写错而是环境没配好、约束没加对、报告里贴的语句在自己机器上跑不出来。这篇笔记就按真实上机流程拆一遍openGauss 怎么装、DDL 怎么设计、DML 怎么插、查询怎么写、报告怎么组织每一步都给可抄的语句和参数说明。适合正在做这份作业的软件学院学生也适合想用 openGauss 练手 SQL 的初学者。数据库这门课知识点概念背再多不如把一份作业从头到尾跑通一次。2. openGauss 环境搭建与上机作业的准备工作2.1 为什么上机作业选 openGauss 而不是 MySQL大连理工软件学院的数据库课程选 openGauss 作为上机平台不是随便定的。openGauss 是华为开源的关系型数据库内核基于 PostgreSQL但做了大量企业级增强比如列存、MOT 内存表、AI 能力。对教学来说它有几个实际好处一是 SQL 语法标准和课程讲的 DDL、DML 理论对得上二是自带 gsql 命令行工具不依赖图形界面作业报告里贴命令输出很干净三是安装包和文档齐全学生机跑得动。从就业角度看openGauss 在国内政企、金融、运营商场景用得越来越多会 openGauss 在简历上比只会 MySQL 多一点差异化。数据库课程设计如果选 openGauss答辩时也容易讲出深度。所以这份上机作业报告值得认真做不是应付。2.2 在 Linux 上装 openGauss 的最小步骤openGauss 官方推荐在 openEuler 或 CentOS 上部署学生用虚拟机装一个最小化系统就行。下面是我一般会用的极简安装流程以 openGauss 5.x 单机版为例。# 1. 创建用户和组openGauss 不允许 root 直接运行 groupadd dbgrp useradd -g dbgrp omm passwd omm # 2. 创建安装目录并授权 mkdir -p /opt/software/openGauss chown -R omm:dbgrp /opt/software/openGauss # 3. 切换到 omm 用户解压安装包 su - omm cd /opt/software/openGauss tar -zxvf openGauss-5.x.x-CentOS-64bit.tar.gz # 4. 执行安装脚本-w 指定初始化密码 ./install.sh -w Gauss123这段脚本的关键点omm是 openGauss 的专用运行用户不能用 root 跑数据库进程这是安全设计。install.sh的-w参数设置的是数据库初始用户密码密码必须包含大小写字母、数字、特殊字符长度至少 8 位否则安装会报密码复杂度错误。安装完成后用gs_ctl启动数据库gs_ctl start -D /opt/software/openGauss/data/single_node-D指定数据目录单机版默认在data/single_node下。启动后用gsql连接gsql -d postgres -p 5432 -r-d是数据库名初始只有postgres-p是端口默认 5432-r让 gsql 支持上下键翻历史命令做作业时很实用。2.3 上机作业报告的结构该怎么搭老师看报告第一眼看的是结构是否完整。一份合格的 openGauss 上机作业报告通常包含这几块实验目的、实验环境系统版本、openGauss 版本、连接方式、数据库设计E-R 图、表结构、DDL 语句、DML 语句、查询语句及结果、存储过程或触发器如果要求、实验总结。其中 DDL 和 DML 是核心也是热搜里 opengauss、SQL、DDL、DML 这几个词对应的内容。我建议报告里每条 SQL 都配一段说明这条语句做什么、涉及哪些约束、执行结果是什么。不要只贴代码老师要看的是你理解了多少。表结构设计部分字段类型、主键、外键、非空约束都要写清楚这是数据库课程设计的基本功。3. DDL 建表把 E-R 图翻译成 openGauss 能执行的语句3.1 从需求到表结构一个选课系统的例子上机作业一般会给一个场景比如学生选课系统。需求通常是学生可以选多门课一门课可以被多个学生选老师可以开多门课。这就是典型的多对多关系需要三张实体表加一张关联表。设计表的时候先确定主键。学生表用学号做主键课程表用课程号做主键教师表用教师编号做主键。选课表用学号加课程号做联合主键防止同一个学生重复选同一门课。字段类型要合理学号用VARCHAR(20)成绩用NUMERIC(5,2)学分用NUMERIC(3,1)。不要所有字段都用VARCHAR那是新手常犯的错老师一眼就能看出来。3.2 建表语句与约束主键、外键、非空一个都不能少下面是一套可以直接在 openGauss 里执行的 DDL 语句覆盖学生、教师、课程、选课四张表。-- 学生表 CREATE TABLE student ( sno VARCHAR(20) PRIMARY KEY, sname VARCHAR(50) NOT NULL, ssex CHAR(2) CHECK (ssex IN (男,女)), sage INT CHECK (sage BETWEEN 15 AND 60), sdept VARCHAR(50) ); -- 教师表 CREATE TABLE teacher ( tno VARCHAR(20) PRIMARY KEY, tname VARCHAR(50) NOT NULL, title VARCHAR(20), dept VARCHAR(50) ); -- 课程表 CREATE TABLE course ( cno VARCHAR(20) PRIMARY KEY, cname VARCHAR(50) NOT NULL, credit NUMERIC(3,1) CHECK (credit 0), tno VARCHAR(20), CONSTRAINT fk_course_teacher FOREIGN KEY (tno) REFERENCES teacher(tno) ); -- 选课表 CREATE TABLE sc ( sno VARCHAR(20), cno VARCHAR(20), grade NUMERIC(5,2) CHECK (grade BETWEEN 0 AND 100), PRIMARY KEY (sno, cno), CONSTRAINT fk_sc_student FOREIGN KEY (sno) REFERENCES student(sno), CONSTRAINT fk_sc_course FOREIGN KEY (cno) REFERENCES course(cno) );这段 DDL 里有几个参数和约束值得说明。PRIMARY KEY声明主键openGauss 会自动为主键建唯一索引。CHECK约束用来限制取值范围比如性别只能是男或女成绩只能在 0 到 100 之间。FOREIGN KEY声明外键CONSTRAINT给外键起名字方便后面排错时定位。NUMERIC(5,2)表示总共 5 位数字其中 2 位小数存成绩刚好。注意openGauss 默认对表名和字段名大小写不敏感但建表时如果用了双引号就会区分大小写。作业里建议统一用小写避免后面查询时找不到表。3.3 修改表结构与删除表ALTER 和 DROP 的用法建完表之后有时候需要加字段或改类型。比如课程表要加一个“开课学期”字段ALTER TABLE course ADD COLUMN semester VARCHAR(20);如果要修改字段类型比如把semester改成CHAR(10)ALTER TABLE course ALTER COLUMN semester TYPE CHAR(10);删除表用DROP TABLE但如果有外键依赖要先删子表再删父表DROP TABLE sc; DROP TABLE course; DROP TABLE student; DROP TABLE teacher;顺序不能反否则会报“被其他对象依赖”的错误。这是上机时常见的翻车点很多人直接DROP TABLE student结果因为sc表有外键引用而失败。解决方法是先删sc再删student。如果不想记顺序可以用DROP TABLE sc, course, student, teacher;让数据库自己处理依赖但作业报告里建议写清楚顺序体现你理解外键约束。4. DML 增删改查把数据插进去再查出来4.1 INSERT 插入数据批量插入与单条插入的写法DDL 建好表之后下一步是插数据。openGauss 支持单条插入和多条插入。单条插入INSERT INTO student (sno, sname, ssex, sage, sdept) VALUES (2021001, 张三, 男, 20, 软件工程);多条插入用逗号分隔INSERT INTO student (sno, sname, ssex, sage, sdept) VALUES (2021002, 李四, 女, 19, 软件工程), (2021003, 王五, 男, 21, 计算机科学), (2021004, 赵六, 女, 20, 软件工程);插入数据时要注意字段顺序和值的类型匹配。sno是VARCHAR值要用单引号括起来sage是INT直接写数字。如果插入的值违反约束比如性别写了“未知”openGauss 会报错并拒绝插入。这是好事说明约束在起作用。作业报告里可以把这个报错截图放上去说明你验证了约束。4.2 UPDATE 和 DELETE改成绩、删记录的正确姿势更新数据用UPDATE比如把张三的成绩改成 95UPDATE sc SET grade 95 WHERE sno 2021001 AND cno C001;WHERE条件一定要写否则会更新全表。这是血泪经验我见过有人漏写WHERE把全班成绩都改成同一个值最后只能重做。删除数据用DELETEDELETE FROM sc WHERE sno 2021004 AND cno C002;同样WHERE不能漏。如果只想删所有记录但保留表结构用DELETE FROM sc;或TRUNCATE TABLE sc;。TRUNCATE更快但不写日志不能回滚作业里慎用。4.3 SELECT 查询单表、多表、聚合与子查询查询是上机作业的重头戏。先看单表查询查所有软件工程的学生。SELECT sno, sname, sage FROM student WHERE sdept 软件工程;多表查询用JOIN比如查每个学生的选课和成绩SELECT s.sno, s.sname, c.cname, sc.grade FROM student s JOIN sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno ORDER BY s.sno;聚合查询用GROUP BY和HAVING比如查每门课的平均分SELECT cno, AVG(grade) AS avg_grade FROM sc GROUP BY cno HAVING AVG(grade) 60;子查询可以嵌套比如查选了“数据库”这门课的学生SELECT sname FROM student WHERE sno IN ( SELECT sno FROM sc WHERE cno (SELECT cno FROM course WHERE cname 数据库) );这些查询覆盖了 SQL 的核心用法作业报告里每种至少写一条并附上执行结果截图。openGauss 的gsql里可以用\d查看表结构用\dt列出所有表做作业时很方便。5. 上机作业避坑那些让报告返工的常见问题5.1 连接不上数据库端口、密码、用户三查现象gsql -d postgres -p 5432 -r报“connection refused”。原因通常是数据库没启动或者端口不对。解决先用gs_ctl status -D 数据目录看进程在不在不在就gs_ctl start。如果端口被改过用netstat -tlnp | grep gauss查实际端口。密码错则报“authentication failed”需要确认omm用户密码是否过期openGauss 默认有密码有效期过期后要改密码。5.2 外键约束报错插入顺序和删除顺序现象插入sc表时提示“violates foreign key constraint”。原因是student或course表里没有对应的sno或cno。解决先插父表数据再插子表数据。删除时反过来先删子表再删父表。如果作业要求批量插入可以用事务包起来出错就回滚。5.3 中文乱码字符集和客户端编码现象插入中文后查询显示问号或乱码。原因是数据库编码和客户端编码不一致。openGauss 默认用 UTF-8gsql连接时可以用\encoding UTF8设置客户端编码。建库时也要指定ENCODING UTF8。如果已经建了库可以用ALTER DATABASE ... SET ENCODING改但更稳妥的是重建。5.4 报告里 SQL 跑不通环境差异和版本差异现象报告里贴的 SQL 在老师机器上跑不通。原因可能是版本不同比如 openGauss 5.x 和 3.x 在某些函数上有差异。解决报告里注明 openGauss 版本尽量用标准 SQL 语法少用版本特有的函数。如果用了gsql的元命令如\d要说明这是客户端命令不是 SQL。5.5 存储过程调试参数和返回值现象存储过程创建成功但调用报错。原因通常是参数类型不匹配或返回值没处理。openGauss 支持 PL/pgSQL下面是一个简单例子CREATE OR REPLACE PROCEDURE add_student( p_sno VARCHAR, p_sname VARCHAR, p_ssex CHAR, p_sage INT, p_sdept VARCHAR ) AS $$ BEGIN INSERT INTO student (sno, sname, ssex, sage, sdept) VALUES (p_sno, p_sname, p_ssex, p_sage, p_sdept); END; $$ LANGUAGE plpgsql;调用CALL add_student(2021005, 孙七, 男, 22, 软件工程);。注意参数名不要和字段名冲突否则会报歧义错误。存储过程是上机作业的加分项建议至少写一个。6. 让报告拿高分的三个进阶技巧6.1 用 EXPLAIN 分析查询计划展示慢 SQL 优化openGauss 的EXPLAIN可以看查询执行计划作业里加上这个老师会觉得你有工程思维。比如EXPLAIN SELECT s.sname, c.cname, sc.grade FROM student s JOIN sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno WHERE s.sdept 软件工程;输出里会显示Seq Scan还是Index Scan。如果发现全表扫描可以给sdept建索引CREATE INDEX idx_student_sdept ON student(sdept);再跑EXPLAIN看到Index Scan就说明优化生效。报告里对比优化前后的计划是很好的加分点。6.2 用事务保证数据一致性选课操作涉及多张表用事务包起来更安全BEGIN; INSERT INTO sc (sno, cno, grade) VALUES (2021001, C003, NULL); UPDATE course SET credit credit WHERE cno C003; COMMIT;如果中间出错ROLLBACK回滚。openGauss 默认自动提交显式写BEGIN和COMMIT能体现你对事务的理解。6.3 报告排版与截图规范最后说报告本身。SQL 语句用等宽字体执行结果截图要清晰包含命令和输出。表结构用表格列出字段名、类型、约束、说明。E-R 图可以用 draw.io 画导出 PNG 插入。实验总结不要写空话写你遇到的具体问题和解决过程比如“插入中文乱码通过设置客户端编码解决”。这样的报告老师一看就知道是你自己做的。我做这份作业的时候第一次因为外键顺序删表失败重做了两遍。后来养成习惯建表先画依赖图删表从叶子节点开始。数据库这东西理论听十遍不如亲手跑一遍。希望帮到你。本文还有配套的精品资源点击获取