数据库实验二--学生选课数据库(OpenGuess)

实验二要求:

实验二 实验内容:

创建数据库、表和索引

(一)实验目的:

  1. 掌握如何在OpenGauss中创建用户、数据库、模式、表和索引等。
  2. 灵活运用SQL语句建立上述概念。
  3. 理解数据库用户、数据库、schema、表、索引之间的关系。

(二)实验内容:

  1. 创建数数据库、模式、表和索引。
  2. 修改基本表的结构。 在OpenGauss数据库系统中使用SQL语句(按教材上所示的属性)建立基本表,如STUDENT表、COURSE表、SC表等,并向表中填充数据。熟悉使用虚拟机进行OpenGauss中SQL语句的代码输入方式。
  3. 创建和删除索引 使用SQL语句在上述表中创建索引,熟悉相应的SQL语句,请参考教材P73-79页的SQL语句,请注意标准SQL和openGauss中相应SQL语句相同与不同之处。
  4. 操作系统:Windows系统或者openEuler。
  5. 数据库管理系统:OpenGauss

学生选课数据库的数据:

(书中数据有不完善的地方,在输入数据时部分有修改)
在这里插入图片描述

请添加图片描述

过程

打开数据库

首先切换到omm用户进行操作(参照了华为实验指导书,使用omm用户操作数据库)

su - omm

使用gs_om启动服务

gs_om -t start

在这里插入图片描述
使用gsql连接数据库

gsql -d postgres -p 26000 -r

在这里插入图片描述

其中,postgres为openGauss安装完成后默认生成的数据库。初始可以连接到此数据库进行新数据库的创建。26000为数据库主节点的端口号,需根据openGauss的实际情况做替换,请确认连接信息获取。

引申信息
使用数据库前,需先使用客户端程序或工具连接到数据库,然后就可以通过客户端程序或工具执行SQL来使用数据库了。
gsql是openGauss数据库提供的命令行方式的数据库连接工具。

连接数据库之后我们正式开始实验。

新建数据库

我们首先创建选课系统的数据库

创建数据库之前我们为即将要创建的数据库创建一个表空间``

CREATE TABLESPACE c_c RELATIVE LOCATION 'tablespace/c_c';

我们创建了一个叫做c_c的表空间,我们可以使用

SELECT spcname FROM pg_tablespace;

来查看表空间
在这里插入图片描述

接着我们去创建数据库,并让这个数据库使用c_c这个表空间:

CREATE DATABASE db_cc WITH TABLESPACE = c_c;

之后使用

\c db_cc

来进入到db_cc数据库
在这里插入图片描述

创建模式和数据表

我们接着可以创建模式了,本实验我们要创建模式S_C,并且该模式下有六个关系(详见上图)
Departments、Teachers、Students、Courses、Teaches、SC
模式允许多个用户
创建模式的语句为:

CREATE SCHEMA<模式名> [<模式元素>]

CREATE SCHEMA[<模式名>]AUTHORIZATION <用户名>

我们也可以在创建模式的同时创建该模式中的对象。

我们这里先直接新建模式:

CREATE SCHEMA S_C;

在这里插入图片描述

接着我们创建该模式下的信息表;
由实验要求得,我们共计要创建六个表,我们在创建的时候暂时忽略表约束条件,创建完成之后再进行修改。

CREATE TABLE Teachers 
( 
    Tno                 char(7) PRIMARY KEY, 
    Thame               char(10) NOT NULL,
    Sex                 char(2) CHECK(Sex = '男' OR Sex = '女'),
	Birthday            DATE,
    Title               char(6),
	Dno                 CHAR(4)
); 

在这里插入图片描述

CREATE TABLE Departments 
( 
    Dno                 char(4) PRIMARY KEY, 
    Dhame               char(10),
    Dheadno             char(7)
); 
CREATE TABLE Students
( 
    Sno                 char(9) PRIMARY KEY, 
    Shame               char(10) NOT NULL,
	Birthday            DATE,
    Enrollyear          char(4),
	Speciality          char(20),
	Dno                 char(4);
	 Sex                 char(2)
); 

注:本处我把性别的约束删除了,与课本上有了一些出入,倘若加上性别约束也不影响结果,但是请注意各列的顺序。

CREATE TABLE Courses 
( 
    Cno                 char(5) PRIMARY KEY, 
    Cname               char(20) NOT NULL,
    Period              SMALLINT,
	Credit              SMALLINT
); 
CREATE TABLE Teaches 
( 
    Tno                 char(7) , 
    Cno               char(5),
    TCsores             SMALLINT,
	PRIMARY KEY (Tno, Cno)
); 

CREATE TABLE SC 
( 
    Sno                 char(9), 
    Cno               char(5),
    Grade              SMALLINT CHECK(Grade >0 AND Grade <=100),
	PRIMARY KEY (Sno, Cno),
	FOREIGN KEY (Sno) REFERENCES Students (Sno),
	FOREIGN KEY (Cno) REFERENCES Courses (Cno)
); 

创建完成后我们可以使用\dt来查看刚刚创建的数据表:
在这里插入图片描述

现在,我们已经新建了六个数据表并为其添加了合适的约束条件。

接着我们按照实验要求为其添加数据库数据。

再插入数据的时候发现之前定义的字符长度有些不够,会出现报错,例如:在这里插入图片描述

我们可以更改字段长度来避免这个问题:

 ALTER table 表名
 modify 需要修改列名 char(100);

在这里插入图片描述

之后我们添加数据:

INSERT INTO teachers VALUES 
(05001, '张海峰','1969-02-21','教授','CS', '男'),
(05002, '刘晓明','1978-10-06','副教授','CS','男'),
(05003, '王梅','1972-02-25','副教授','CS','女'),
(05004, '赵青山','1981-05-18','讲师','CS','男'),
(06001, '朱杰','1963-01-30','教授','MA','男'),
(06002, '欧阳梅','1970-08-11','副教授','MA','女');


insert into courses values
('cs101' ,'计算科学导论',2,1),
('cs102','C语言',4,3),
('cs201','数据结构',4,3),
('cs202','离散数学',4,3),
('cs301','数据库系统原理',4,3);

insert into departments values
('CS' ,'计算机系',05001),
('MA','数学系',06001),
('PH','物理系',07001),
('CH','化学系',08001);



 insert into students values
(201705001,'张华' ,'男','1999_12_16','计算机','cs'),
(201705002,'李玉','女','1998_10_17','计算机','cs'),
(201705003,'欧阳山','男','1999_05_24','计算机','cs'),
(201706001,'林艳','女','1998_09_20','数学','ma'),
(201706002,'高山','男','1997_08_16','数学','ma'),
(201706003,'王海洋','男','1997_01_30','数学','ma');


insert into sc values
(201705001 ,'cs101',89),
(201705002,'cs101',91),
(201705003,'cs101',80),
(201705001,'cs102',90),
(201705002,'cs102',87),
(201705003,'cs102',82),
(201705001 ,'cs201',88),
(201705002,'cs201',89),
(201705003,'cs201',90),
(201705001,'cs202',86),
(201705002,'cs202',85),
(201705001,'cs301',92);


insert into teaches values
(05001 ,'cs101',95),
(05002,'cs101',92),
(05003,'cs101',90),
(05004,'cs101',95);

在这里插入图片描述
在这里插入图片描述

还需要注意的是我们刚刚还没有添加表约束条件,我们在这里添加约束条件:

我们现在通过修改表来添加表级约束。

ALTER TABLE departments
ADD FOREIGN KEY (Dheadno) REFERENCES Teachers(Tno);

在这里插入图片描述

ALTER TABLE teachers
ADD FOREIGN KEY (Dno) REFERENCES departments(Dno);
ALTER TABLE students
ADD FOREIGN KEY (Dno) REFERENCES departments(Dno);
ALTER TABLE teaches
ADD FOREIGN KEY (Cno) REFERENCES Courses(Cno);

ALTER TABLE teaches
ADD FOREIGN KEY (Tno) REFERENCES teachers(Tno);

查询

全部完成后我们可以使用selecr语句来查询
在这里插入图片描述
在这里插入图片描述

建立索引

CREATE INDEX 索引名 ON 表名 (列名);
CREATE INDEX Student_Dept ON Students (Dno);

使用\di来查看索引;
DBMS会自动为主码创建索引。
在这里插入图片描述



更新:
做完试验后发现几个表的列名name被打成了hame,一不小心就打错了,可以再改一下。

openGauss修改列名的指令和mysql的指令不太一样:

ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )}
    RENAME [ COLUMN ] column_name TO new_column_name;

例如:

alter table students rename shame to sname;

在这里插入图片描述

  • 14
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
学生选课系统是一个常见的应用程序,用于管理学生选课信息。在C语言中,可以使用文件操作和算法来实现学生选课系统的功能。 以下是一个简单的C语言学生选课系统的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义课程结构体 typedef struct { char courseCode[10]; char courseName[50]; char courseProperty[20]; char semester[20]; int credit; } Course; // 定义学生结构体 typedef struct { char studentID[10]; char studentName[50]; Course courses[10]; int numCourses; } Student; // 函数声明 void displayMenu(); void searchCourse(Student* student); void displayCourseInfo(Student* student); void addCourse(Student* student); void removeCourse(Student* student); int main() { Student student; student.numCourses = 0; int choice; do { displayMenu(); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: searchCourse(&student); break; case 2: displayCourseInfo(&student); break; case 3: addCourse(&student); break; case 4: removeCourse(&student); break; case 5: printf("Exiting the program...\n"); break; default: printf("Invalid choice. Please try again.\n"); break; } } while (choice != 5); return 0; } // 显示菜单 void displayMenu() { printf("-- Student Course Registration System ---\n"); printf("1. Search course\n"); printf("2. Display course information\n"); printf("3. Add course\n"); printf("4. Remove course\n"); printf("5. Exit\n"); } // 搜索课程 void searchCourse(Student* student) { // 根据菜单选择查询字段,实现相应的查找算法 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Searching course...\n"); } // 显示课程信息 void displayCourseInfo(Student* student) { // 分屏显示课程信息,每屏10条课程记录,按任意键继续 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Displaying course information...\n"); } // 添加课程 void addCourse(Student* student) { // 添加课程到学生选课列表中 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Adding course...\n"); } // 移除课程 void removeCourse(Student* student) { // 从学生选课列表中移除课程 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Removing course...\n"); } ``` 这个示例中,我们使用了结构体来定义课程和学生的信息。通过菜单选择,可以进行课程的搜索、课程信息的显示、课程的添加和课程的移除等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiaki_0ff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值