目录
<1>建库时应录入一定数量的(不能过少)学生、教师、课程、成绩等基本信息
<2>录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息
<5>查询一位学生所修的课程、性质(必修或选修)、学期、学分及成绩
一.课本课后作业解析
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软件实现,安装过程参考:
建表结果:
另外可使用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, ");");
}
本文转自 https://blog.csdn.net/qq_32971095/article/details/134984670,如有侵权,请联系删除。