简介:这份资源是大连理工大学软件学院数据库系统课程的上机实验报告,基于华为 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 Gauss@123这段脚本的关键点: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,比如把张三的成绩改成 95:
UPDATE sc SET grade = 95 WHERE sno = '2021001' AND cno = 'C001';WHERE条件一定要写,否则会更新全表。这是血泪经验,我见过有人漏写WHERE,把全班成绩都改成同一个值,最后只能重做。删除数据用DELETE:
DELETE 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-8,gsql连接时可以用\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 插入。实验总结不要写空话,写你遇到的具体问题和解决过程,比如“插入中文乱码,通过设置客户端编码解决”。这样的报告,老师一看就知道是你自己做的。
我做这份作业的时候,第一次因为外键顺序删表失败,重做了两遍。后来养成习惯,建表先画依赖图,删表从叶子节点开始。数据库这东西,理论听十遍不如亲手跑一遍。希望帮到你。
本文还有配套的精品资源,点击获取