西电计科大三上数据库系统概论代码合集

目录

一.课本课后作业解析

1.问题说明

<1>代码解析

2.问题说明

 <1>代码解析

 3.问题说明

<1>代码解析

 4.问题说明

<1>代码解析

二.openGauss实践平台实验

1.关系模型描述

 <1>构建关系模型

<2>插入测试数据 

2.问题解析

三.上机作业

1.需求分析

<1>内容

<2>基本要求

2.概念结构设计

<1>数据库语义

<2>E-R图设计

3.逻辑结构设计

(1)关系模型

4.功能实现

<1>建库时应录入一定数量的(不能过少)学生、教师、课程、成绩等基本信息

<2>录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息

<3>按学号、姓名、专业三种方式查询学生基本信息

<4>录入一位学生一门课的成绩

<5>查询一位学生所修的课程、性质(必修或选修)、学期、学分及成绩

<6>查询一位学生被哪些教师教过课

<7>查询快要被开除的学生(距被开除差3学分之内)

5.主要问题及解决

6.总结

7.附录

<1>TXT转SQL C语言程序脚本


一.课本课后作业解析

1.问题说明

        用SQL语句建立第2章习题6中的4个表(要求给出主码和外码约束,但无需插入记录):

设有一个SPJ数据库,包括S,P,J及SPJ4个关系模式:

S(SNO, SNAME, STATUS, CITY);

P(PNO, PNAME, COLOR, WEIGHT);

J(JNO, JNAME, CITY);

SPJ(SNO, PNO, JNO, QTY)。

        供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。

        零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。

        工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。

        供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。

<1>代码解析

/*-- 删除已有的表*/
/*-- 注意要先删除参照表(如SC),再删除被参照表(如Student,Course)*/
DROP TABLE SPJ;
DROP TABLE S;
DROP TABLE P;
DROP TABLE J;


/*创建基本表*/
/*注意要先创建被参照表,再创建参照表*/
CREATE TABLE S(
SNO CHAR(10) PRIMARY KEY,	/*-- 列级完整性约束的方式,定义主码*/
SNAME CHAR(20),
STATUS INT,
CITY CHAR(10)
); 

CREATE TABLE P(
PNO CHAR(10) PRIMARY KEY,
PNAME CHAR(20),
COLOR CHAR(10),
WEIGHT CHAR(10)
);

CREATE TABLE J(
JNO CHAR(10) PRIMARY KEY,
JNAME CHAR(20),
CITY CHAR(10)
);

CREATE TABLE SPJ(
SNO CHAR(10),
PNO CHAR(10),
JNO CHAR(10),
QTY INT,
PRIMARY KEY (SNO,PNO,JNO),
FOREIGN KEY (SNO) REFERENCES S(SNO),	/*-- 表级完整性约束的方式,定义外码;注意参照列Cpno必须加括号*/
FOREIGN KEY (PNO) REFERENCES P(PNO),	
FOREIGN KEY (JNO) REFERENCES J(JNO)	
);

插入测试数据: 

/*-- 向基本表中插入数据*/
INSERT INTO S VALUES ('S1','精益',20,'天津');
INSERT INTO S VALUES ('S2','盛锡',10,'北京');
INSERT INTO S VALUES ('S3','东方红',30,'北京');
INSERT INTO S VALUES ('S4','丰泰盛',20,'天津');
INSERT INTO S VALUES ('S5','为民',20,'上海');

/*-- 如果根据参照关系表中一行参照了另外一行,应先插入被参照行(如('6',...,...,...)),后插入参照行(如(...,...,'6',...))*/
INSERT INTO P VALUES ('P1','螺母','红',12);
INSERT INTO P VALUES ('P2','螺栓','绿',17);
INSERT INTO P VALUES ('P3','螺丝刀','蓝',14);
INSERT INTO P VALUES ('P4','螺丝刀','红',14);
INSERT INTO P VALUES ('P5','凸轮','蓝',40);
INSERT INTO P VALUES ('P6','齿轮','红',30);

INSERT INTO J VALUES ('J1','三建','北京');
INSERT INTO J VALUES ('J2','一汽','长春');
INSERT INTO J VALUES ('J3','弹簧厂','天津');
INSERT INTO J VALUES ('J4','造船厂','天津');
INSERT INTO J VALUES ('J5','机车厂','唐山');
INSERT INTO J VALUES ('J6','无线电厂','常州');
INSERT INTO J VALUES ('J7','半导体厂','南京');

INSERT INTO SPJ VALUES ('S1','P1','J1',200);
INSERT INTO SPJ VALUES ('S1','P1','J3',100);
INSERT INTO SPJ VALUES ('S1','P1','J4',700);
INSERT INTO SPJ VALUES ('S1','P2','J2',100);
INSERT INTO SPJ VALUES ('S2','P3','J1',400);
INSERT INTO SPJ VALUES ('S2','P3','J2',200);
INSERT INTO SPJ VALUES ('S2','P3','J4',500);
INSERT INTO SPJ VALUES ('S2','P3','J5',400);
INSERT INTO SPJ VALUES ('S2','P5','J1',400);
INSERT INTO SPJ VALUES ('S2','P5','J2',100);
INSERT INTO SPJ VALUES ('S3','P1','J1',200);
INSERT INTO SPJ VALUES ('S3','P3','J1',200);
INSERT INTO SPJ VALUES ('S4','P5','J1',100);
INSERT INTO SPJ VALUES ('S4','P6','J3',300);
INSERT INTO SPJ VALUES ('S4','P6','J4',200);
INSERT INTO SPJ VALUES ('S5','P2','J4',100);
INSERT INTO SPJ VALUES ('S5','P3','J1',200);
INSERT INTO SPJ VALUES ('S5','P6','J2',200);
INSERT INTO SPJ VALUES ('S5','P6','J4',500);

2.问题说明

针对建立的4个表用SQL完成第2章习题6中的查询:

(1)求供应工程J1零件的供应商号码SNO;

(2)求供应工程J1零件P1的供应商号码SNO;

(3)求供应工程J1零件为红色的供应商号码SNO;

(4)求没有使用天津供应商生产的红色零件的工程号JNO;

(5)求至少使用了供应商S1所供应的全部零件的工程号JNO。

 <1>代码解析

/*求供应工程J1零件的供应商号码SNO*/
SELECT DISTINCT SNO
FROM SPJ
WHERE JNO='J1';

/*求供应工程J1零件P1的供应商号码SNO*/
SELECT DISTINCT SNO
FROM SPJ
WHERE JNO='J1' AND PNO='P1';

/*求供应工程J1零件为红色的供应商号码SNO*/
SELECT DISTINCT SNO
FROM SPJ
WHERE JNO='J1' AND PNO IN(
    SELECT DISTINCT PNO
    FROM P
    WHERE COLOR='红'
);

/*求没有使用天津供应商生产的红色零件的工程号JNO*/
SELECT DISTINCT JNO
FROM SPJ
WHERE SNO NOT IN (
    SELECT SNO
    FROM S
    WHERE CITY='天津'
    ) OR PNO NOT IN(
        SELECT DISTINCT PNO
        FROM P
        WHERE COLOR='红'
);

/*求至少使用了供应商S1所供应的全部零件的工程号JNO*/
/*方法一*/
SELECT DISTINCT JNO
FROM SPJ
WHERE SNO='S1'
GROUP BY JNO 
HAVING COUNT(PNO)=(SELECT COUNT(DISTINCT PNO) FROM SPJ WHERE SNO='S1');

/*方法二*/
SELECT DISTINCT JNO
FROM SPJ X
WHERE NOT EXISTS(
    SELECT DISTINCT PNO
    FROM SPJ Y
    WHERE SNO='S1' AND NOT EXISTS(
        SELECT *
        FROM SPJ Z
        WHERE Z.SNO='S1' AND Y.PNO=Z.PNO AND X.JNO=Z.JNO
    )
);

 3.问题说明

针对建立的4个表用SQL完成一下各项操作:

(1)找出所有供应商的姓名和所在城市;

(2)找出所有零件的名称、颜色、重量;

(3)找出使用供应商S1所供应零件的工程号码;

(4)找出工程项目J2使用的各种零件的名称及其数量;

(5)找出上海厂商供应的所有零件号码;

(6)找出使用上海产的零件的工程名称;

(7)找出没有使用天津产的零件的工程号码;

(8)把全部红色零件的颜色改成蓝色;

(9)由S5供给J4的零件P6改为由S3供应,请作出必要的修改;

(10)从供应商关系中删除S2的记录,并从供应情况关系中删除相应的记录;

(11)请将(S2,J6,P4,200)插入供应情况关系。

<1>代码解析

/*找出所有供应商的姓名和所在城市*/
SELECT SNAME,CITY
FROM S;

/*找出所有零件的名称、颜色、重量*/
SELECT PNAME,COLOR,WEIGHT
FROM P;

/*找出使用供应商S1所供应零件的工程号码*/
SELECT DISTINCT JNO
FROM SPJ
WHERE SNO='S1';

/*找出工程项目J2使用的各种零件的名称及其数量*/
SELECT PNAME,QTY
FROM SPJ,P
WHERE SPJ.PNO=P.PNO AND JNO='J2';

/*找出上海厂商供应的所有零件号码*/
SELECT DISTINCT PNO
FROM SPJ,S
WHERE SPJ.SNO=S.SNO AND CITY='上海';

/*找出使用上海产的零件的工程名称*/
SELECT DISTINCT JNO
FROM SPJ,S
WHERE SPJ.SNO=S.SNO AND CITY='上海';

/*找出没有使用天津产的零件的工程号码*/
SELECT DISTINCT JNO
FROM SPJ,S
WHERE SPJ.SNO=S.SNO AND CITY!='天津';

/*把全部红色零件的颜色改成蓝色*/
UPDATE P
SET COLOR='蓝'
WHERE COLOR='红';

/*由S5供给J4的零件P6改为由S3供应,请作出必要的修改*/
UPDATE SPJ
SET SNO='S3'
WHERE SNO='S5' AND PNO='P6' AND JNO='J4';

/*从供应商关系中删除S2的记录,并从供应情况关系中删除相应的记录*/
ALTER TABLE SPJ 
ADD FOREIGN KEY (SNO) REFERENCES S(SNO) ON DELETE CASCADE;/*添加外键,设置级联删除*/
DELETE FROM S WHERE SNO='S2';


/*请将(S2,J6,P4,200)插入供应情况关系*/
INSERT INTO SPJ VALUES ('S1','P1','J1',200);

 4.问题说明

        请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)。针对该视图完成下列查询:

(1)找出三建工程项目使用的各种零件代码及其数量;

(2)找出供应商S1的供应情况。

<1>代码解析

/*为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)*/
CREATE VIEW PROD(SNO,PNO,QTY)
AS
SELECT SNO,PNO,QTY
FROM SPJ
WHERE JNO='J1'

/*找出三建工程项目使用的各种零件代码及其数量*/
SELECT PNO,SUM(QTY)
FROM PROD
GROUP BY PNO;


/*找出供应商S1的供应情况*/
SELECT PNO,QTY
FROM PROD
WHERE SNO='S1';

二.openGauss实践平台实验

1.关系模型描述

学籍管理数据库有如下关系模式:

学生Student(学号Sno,姓名Sname,性别Ssex,年龄Sage,系别Sdept);

课程Course(课程号Cno,课程名称Cname,先修课Cpno,学分Ccredit);

成绩SC(学号Sno,课程号Cno,成绩Grade)。

 <1>构建关系模型

/*构建关系模型*/
CREATE TABLE Student(
    Sno CHAR(10) PRIMARY KEY,	/*-- 列级完整性约束的方式,定义主码*/
    Sname CHAR(20),
    Ssex CHAR(10),
    Sage INT,
    Sdept CHAR(10)
);

CREATE TABLE Course(
    Cno CHAR(10) PRIMARY KEY,	/*-- 列级完整性约束的方式,定义主码*/
    Cname CHAR(20),
    Cpno CHAR(10),
    Ccredit INT
);

CREATE TABLE SC(
    Sno CHAR(10),
    Cno CHAR(10),
    Grade INT,
    PRIMARY KEY (Sno,Cno),
    FOREIGN KEY (Sno) REFERENCES Student(Sno),	/*-- 表级完整性约束的方式,定义外码;注意参照列Cpno必须加括号*/
    FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

<2>插入测试数据 

/*插入示例数据*/
INSERT INTO Student VALUES ('1','SWQ','男',20,'CS');
INSERT INTO Student VALUES ('2','SSS','男',19,'CS');
INSERT INTO Student VALUES ('3','WWW','男',17,'CS');
INSERT INTO Student VALUES ('4','QQQ','男',17,'IS');

INSERT INTO Course VALUES ('1','OS','2',4);
INSERT INTO Course VALUES ('2','MATH','3',5);
INSERT INTO Course VALUES ('3','ENG','3',2);

INSERT INTO SC VALUES ('1','1',94);
INSERT INTO SC VALUES ('2','1',85);
INSERT INTO SC VALUES ('3','1',72);
INSERT INTO SC VALUES ('4','1',94);
INSERT INTO SC VALUES ('1','2',69);
INSERT INTO SC VALUES ('2','2',99);
INSERT INTO SC VALUES ('3','2',77);
INSERT INTO SC VALUES ('4','2',58);
INSERT INTO SC VALUES ('1','3',100);
INSERT INTO SC VALUES ('2','3',78);
INSERT INTO SC VALUES ('3','3',87);
INSERT INTO SC VALUES ('4','3',67);

2.问题解析

/*查询年龄不大于19的“女”生的学号和姓名。*/
SELECT Sno,Sname
FROM Student
WHERE Sage<20 AND Ssex='女';

/*查询所有姓“王”的学生的学号、姓名和性别。*/
SELECT Sno,Sname,Ssex
FROM Student
WHERE Sname LIKE '王%';

/*查询“CS”系年龄大于本系平均年龄的学生的学号、姓名和年龄。*/
SELECT Sno,Sname,Sage
FROM Student X
WHERE Sdept='CS' AND Sage>(
    SELECT AVG(Sage)
    FROM Student
    GROUP BY Sdept
    HAVING Sdept='CS'
)

/*
错误写法:
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='CS'
GROUP BY Sdept
HAVING Sage>AVG(Sage);
*/

/*查询每门课程的课程号、课程名、平均成绩、最低成绩和最高成绩。*/
SELECT DISTINCT Course.Cno,Cname,AVG(Grade),MIN(Grade),MAX(Grade)
FROM Course,SC
WHERE Course.Cno=SC.Cno
GROUP BY Course.Cno;

/*查询至少选修了学号为“200215121”的学生所选全部课程*/
SELECT Sno
FROM Student
WHERE NOT EXISTS(
    SELECT Cno
    FROM SC X
    WHERE Sno='200215121' AND NOT EXISTS(
        SELECT *
        FROM SC Y
        WHERE Y.Sno=Student.Sno AND X.Cno=Y.Cno
    )
);

/*查询每门课程分数排名第1的学生学号、课程号和成绩。*/
SELECT Sno,Cno,Grade
FROM SC X
WHERE NOT EXISTS(
    SELECT *
    FROM SC Y
    WHERE X.Cno=Y.Cno AND Y.Grade>X.Grade
);

/*查询每门课程分数排名第2的学生学号、课程号和成绩。*/
SELECT Sno,Cno,Grade
FROM SC X
WHERE EXISTS(
    SELECT Cno
    FROM SC Y
    WHERE X.Cno=Y.Cno AND X.Grade<Y.Grade
    GROUP BY Y.Cno
    HAVING COUNT(Y.Sno)=1
);

/*将一个新学生元组(学号:200215228;姓名:陈冬;性别*/
INSERT
INTO Student(Sno,Sname,Ssex,Sage,Sdept)
VALUES('200215228','陈冬','男',18,'IS');

/*将所有学生的年龄增加1岁。*/
UPDATE Student
SET Sage=Sage+1;

/*删除学号为“200215122”的学生的选课记录。*/
DELETE
FROM SC
WHERE Sno='200215122';

/*创建视图View_IS,找出Sdept为IS的学生的学号*/
CREATE VIEW View_IS(Sno,Sname)
AS
SELECT Sno,Sname
FROM Student
WHERE Sdept='IS';

三.上机作业

1.需求分析

<1>内容

        为某大学设计一套学籍管理数据库系统

<2>基本要求

①设计学籍管理数据库,符合给定的语义(P3),并实现一定的功能需求(P4)
②使用一种DBMS,如SQL Server,具体不限

2.概念结构设计

<1>数据库语义

①学校有若干专业,每个专业每年招若干个班,每个班有若干学生
②每个专业有自己的教学计划,规定了该专业相关课程的性质(必修或选修)以及授课学期;例如,数据库课程对计算机专业为必修、在大三上学期,但对数学专业可能为选修、在大三下学期,而中文专业可能不学这门课
③一位教师可以给多个班带课,但不能给一个班带多门课
④一门课程最多允许学生一次补考;学生达到如下条件之一的被开除:不及格必修课累计达10学分、或不及格选修课累计达15学分
⑤上述语义未涉及到的事项和细节,可自行做出合理假定

<2>E-R图设计

3.逻辑结构设计

(1)关系模型

DROP TABLE Schedule;
DROP TABLE SC;
DROP TABLE Student;
DROP TABLE Teather;
DROP TABLE Course;
DROP TABLE Class;
DROP TABLE Department;

专业信息表(专业代号和专业名):

CREATE TABLE Department(
    Dept CHAR(10) PRIMARY KEY,
    Dname CHAR(75)
);

班级表(班级编号和从属专业):

CREATE TABLE Class(
    Class_no CHAR(10) PRIMARY KEY,
    Dept CHAR(10),
    FOREIGN KEY (Dept) REFERENCES Department(Dept) ON DELETE CASCADE
);

学生表(学号、姓名、性别、出生年月、从属班级):

CREATE TABLE Student(
    Sno CHAR(10) PRIMARY KEY,
    Sname CHAR(20),
    Ssex CHAR(4),
    Sbrith CHAR(10),
    Class_no CHAR(20),
    FOREIGN KEY (Class_no) REFERENCES Class(Class_no) ON DELETE CASCADE
);

课程表(课程号、课程名、从属专业、必/选修、开课时间、学分):

CREATE TABLE Course(
    Cno CHAR(20) PRIMARY KEY,
    Cname CHAR(75),
    Dept CHAR(10),
    Creq CHAR(10),
    Cterm CHAR(20),
    Ccredit INT,
    FOREIGN KEY (Dept) REFERENCES Department(Dept) ON DELETE CASCADE
);

教师表(编号、姓名、所带课程):

CREATE TABLE Teacher(
    Tno CHAR(10) PRIMARY KEY,
    Tname CHAR(20),
    Cno CHAR(10),
    FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE CASCADE
);

上课表(班级、老师、课程号):

CREATE TABLE Schedule(
    Class_no CHAR(10),
    Cno CHAR(10),
    Tno CHAR(10),
    PRIMARY KEY (Class_no,Cno),
    FOREIGN KEY (Class_no) REFERENCES Class(Class_no) ON DELETE CASCADE,
    FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE CASCADE,
    FOREIGN KEY (Tno) REFERENCES Teacher(Tno) ON DELETE CASCADE
);

成绩表(学号、课程号、成绩):

CREATE TABLE SC(
    Sno CHAR(10),
    Cno CHAR(10),
    Score INT,
    PRIMARY KEY (Sno,Cno),
    FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE,
     FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE CASCADE
);

其中相关约束条件均实现,各个编号的主码约束及引用约束。
 

4.功能实现

*说明:由于示例数据数量庞大且与自己设计的表格结构不同,如果要在示例数据中自行添加其他信息过于繁杂,于是将课程信息表Course和学生信息表Student拆分成两部分,基本信息和细节信息表_Detail。见下面示例。
本数据库的功能实现采用MySQL软件实现,安装过程参考:

【MySQL基础】MySQL介绍及安装icon-default.png?t=N7T8https://blog.csdn.net/m0_64338546/article/details/127149096?spm=1001.2014.3001.5506完成后进入界面如下:

 建表结果:

另外可使用table_status和desc命令查看表格详细数据:

<1>建库时应录入一定数量的(不能过少)学生、教师、课程、成绩等基本信息

将示例数据文件通过C语言程序导出SQL插入信息语句,如下:

示例数据:

导出的SQL插入语句:

插入结果:

<2>录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息

/*录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息*/
INSERT INTO Student (Sno, Sname, Ssex, Sbrith, Class_no) VALUES ('03051108','司武强','男','20030411','2103014');

实际拆分成两部分插入: 

/*录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息*/
INSERT INTO Student (Sno, Sname, Ssex) VALUES ('03051109','司武强','男');
INSERT INTO Student_Detail (Sno, Sbrith, Class_no) VALUES ('03051109','20030411','210101');

<3>按学号、姓名、专业三种方式查询学生基本信息

/*按学号、姓名、专业三种方式查询学生基本信息*/
SELECT *
FROM Student
WHERE Sno='03051108';

SELECT *
FROM Student
WHERE Sname='司武强';

SELECT *
FROM Student,Class
WHERE Student.Class_no=Class.Class_no AND Dept='CS';

<4>录入一位学生一门课的成绩

/*录入一位学生一门课的成绩*/
INSERT INTO SC (Sno,Cno,Score) VALUES ('03051108','CS3121014',99);

录入结果:

<5>查询一位学生所修的课程、性质(必修或选修)、学期、学分及成绩

SELECT Student.Sno,Sname,Cname,Creq,Cterm,Score
FROM Course,SC,Student
WHERE Course.Cno=SC.Cno AND SC.Sno=Student.Sno AND (Student.Sno='03051108' OR Sname='司武强');

查询他的必修课平均成绩:

SELECT AVG(Score)
FROM SC
WHERE Sno='03051108' AND EXISTS(
    SELECT *
    FROM Course
    WHERE SC.Cno=Course.Cno AND Course.Creq='必修'
);
/*或*/
SELECT Student.Sno,Sname,AVG(Score)
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
GROUP BY Student.Sno,SC.Sno,Course.Creq
HAVING Course.Creq='必修' AND (SC.Sno='03051108' OR Sname='司武强');

 所有课程平均成绩(平均成绩应按学分加权):

SELECT Student.Sno,Sname,SUM(Score*Ccredit)/SUM(Ccredit)
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
GROUP BY Student.Sno
HAVING Student.Sno='03051108' OR Sname='司武强';

注:由于课程信息庞大,查询时皆忽略条件“必修” 

查询结果:

<6>查询一位学生被哪些教师教过课

/*查询一位学生被哪些教师教过课*/
SELECT Tname,Cname
FROM Student,Schedule,Teacher,Course
WHERE Student.Class_no=Schedule.Class_no AND Schedule.Tno=Teacher.Tno AND Schedule.Cno=Course.Cno AND (Student.Sno='03051108' OR Student.Sname='司武强';

<7>查询快要被开除的学生(距被开除差3学分之内)

/*查询快要被开除的学生(距被开除差3学分之内)*/
SELECT Sno,Sname
FROM Student
WHERE 10<=(
    SELECT SUM(Ccredit)
    FROM SC,Course
    WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Creq='必修' AND Score<60
) OR 15<=(
    SELECT SUM(Ccredit)
    FROM SC,Course
    WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Creq='选修' AND Score<60
);

查询结果: 

5.主要问题及解决

<1>问题:插入数据工作量庞大且繁琐,示例数据与期望表结构不同

        解决:于是将课程信息表Course和学生信息表Student拆分成两部分,基本信息和细节信息表_Detail。将示例数据文件通过C语言程序导出SQL插入信息语句。

        改进:利用const char数组定义某个属性的可能取值,利用random函数插入细节数据

6.总结

        数据库的查询速度极快,基本在0.01s左右。但唯一的不足之处在于插入数据不便,需要用INSERT语句且符合表的结构。采用图形界面将优化这一不足。

7.附录

<1>TXT转SQL C语言程序脚本

主程序(INSERT_SQL.c):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"school_sql.h"

int main()
{

	INSERT_("Department","Department.txt", "INSERT_Department.sql");
	INSERT_("Class","Class.txt", "INSERT_Class.sql");
	INSERT_Course("Course", "Course.txt", "INSERT_Course.sql");
	INSERT_("Student","Student.txt", "INSERT_Student.sql");
	INSERT_("SC","SC.txt", "INSERT_SC.sql");

	return 0;
}

头文件(school.h):

#ifndef SCHOOL_SQL_H
#define SCHOOL_SQL_H
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char Dept[5]=
{
	"CS", "IS", "AI", "ES", "CE"
};

const char Class_no[10]=
{
	"_210101", "_210102", "_210103", "_210204","_210305","_210406","_210407","_210508","_210509","_210510"
};

const char Creq=
{
    "选修","必修"
};


//函数功能:读取文本数据生成插入SQL语句 
void INSERT_(char [], char [], char []);
#endif

插入函数(school.c):

#include"school_sql.h"

/*
@function:将文件中的数据导出成SQL插入语句
@parameter:插入表的名字,数据来源文件名src,导出文件名dst
@account:默认导出形式字符CHAR
*/
void INSERT_(char table[], char src[], char dst[])
{
	FILE* fr, * fw;
	char c;
	if ((fr = fopen(src, "r")) == NULL) {
		printf("%s File not exist\n", src);
		exit(0);
	}
	fw = fopen(dst, "w");
	fprintf(fw, "\nINSERT INTO %s VALUES\n('",table);
	while (!feof(fr)) {
		c = fgetc(fr);
		printf("%c", c);
		if (c == '\n')fprintf(fw, "'),\n('");
		else if (c == ',')fprintf(fw, "','");
		else fprintf(fw, "%c", c);
	}
	//需手动检查结果是否正确 
	fprintf(fw, "');");
}

/*
@function:将文件中的数据导出成SQL插入语句(定制)
@parameter:插入表的名字,数据来源文件名src,导出文件名dst
@account:第三个数据形式为INT(插入SQL语句第三个数据无'')
*/
void INSERT_Course(char table[], char src[], char dst[])
{
	FILE* fr, * fw;
	char c;
	int i = 0, cnt = 0;
	if ((fr = fopen(src, "r")) == NULL) {
		printf("%s File not exist\n", src);
		exit(0);
	}
	fw = fopen(dst, "w");
	fprintf(fw, "\nINSERT INTO %s VALUES\n('", table);
	while (!feof(fr)) {
		c = fgetc(fr);
		printf("%c", c);
		if (c == '\n') {
			cnt = 0;
			fprintf(fw, "),\n('");
		}
		else if (c == ',') {
			cnt++;
			if (cnt == 2)fprintf(fw, "',");
			else fprintf(fw, "','");
		}
		else fprintf(fw, "%c", c);
	}
	//需手动检查结果是否正确 
	fprintf(fw, ");");
}

  • 24
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

switch_swq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值