4、数据库中的数据具有普遍性,涵盖所有可能出现的情况(例如一个学校需要2个专业,一个专业需要2个以上班级,一个班级至少有2个以上人员)。
先创建一个数据库,假设它的名字为"schoolDB"。
CREATE DATABASE schoolDB;
USE schoolDB;
接着将创建几个数据表:学校(Schools),专业(Majors),班级(Classes),学生(Students),课程(Courses)和成绩(Grades)。
1. Schools表
CREATE TABLE Schools (
SchoolID INT PRIMARY KEY,
SchoolName VARCHAR(100) NOT NULL
);
2. Majors表
CREATE TABLE Majors (
MajorID INT PRIMARY KEY,
MajorName VARCHAR(100) NOT NULL,
SchoolID INT,
FOREIGN KEY (SchoolID) REFERENCES Schools(SchoolID)
);
3. Classes表
CREATE TABLE Classes (
ClassID INT PRIMARY KEY,
ClassName VARCHAR(50) NOT NULL,
MajorID INT,
FOREIGN KEY (MajorID) REFERENCES Majors(MajorID)
);
4. Students表
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50) NOT NULL,
ClassID INT,
FOREIGN KEY (ClassID) REFERENCES Classes(ClassID)
);
5. Courses表
CREATE TABLE Courses (
CourseID INT PRIMARY KEY,
CourseName VARCHAR(50) NOT NULL,
MajorID INT,
FOREIGN KEY (MajorID) REFERENCES Majors(MajorID)
);
6. Grades表
CREATE TABLE Grades (
StudentID INT,
CourseID INT,
Grade INT CHECK (Grade BETWEEN 0 AND 100),
PRIMARY KEY (StudentID, CourseID),
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
符合SQL SERVER的语法
-- 学校表
CREATE TABLE Schools ( school_id INT PRIMARY KEY, school_name VARCHAR(50) NOT NULL, address VARCHAR(100) );
-- 专业表
CREATE TABLE Majors ( major_id INT PRIMARY KEY, major_name VARCHAR(50) NOT NULL, school_id INT, FOREIGN KEY (school_id) REFERENCES Schools(school_id) );
-- 班级表
CREATE TABLE Classes ( class_id INT PRIMARY KEY, class_name VARCHAR(50) NOT NULL, major_id INT, FOREIGN KEY (major_id) REFERENCES Majors(major_id) );
-- 人员表
CREATE TABLE Persons ( person_id INT PRIMARY KEY, person_name VARCHAR(50) NOT NULL, class_id INT, FOREIGN KEY (class_id) REFERENCES Classes(class_id) );
-- 课程表
CREATE TABLE Courses ( course_id INT PRIMARY KEY, course_name VARCHAR(50) NOT NULL, major_id INT, FOREIGN KEY (major_id) REFERENCES Majors(major_id) );
-- 成绩表
CREATE TABLE Grades ( grade_id INT PRIMARY KEY, person_id INT, course_id INT, grade DECIMAL(4,2), FOREIGN KEY (person_id) REFERENCES Persons(person_id), FOREIGN KEY (course_id) REFERENCES Courses(course_id) );
根据范式要求和你的需求, 可设计如下表结构:
学校表:
专业表:
学校专业关联表:
班级表:
学生表:
其中, 学校和专业是多对多的关系,所以需要关联表, 专业和班级是 多对一, 可不用关联表,在班级中存储专业id, 班级和学生是一对多,可不用关联表,在学生表中存放专业班级id.
所以最基础的设计为
学校表: {学校id, 学校名称}
专业表:{专业id,专业名称}
学校专业关联表:{学校id,专业id}
班级表:{班级id,班级名称,专业id}
学生表:{学生id,学生姓名,班级id}
可扩展补充,性别,地址 生日等字段,
转化为sql语句为:
CREATE TABLE school{
School_ID INT PRIMARY KEY,
School_Name VARCHAR(50) NOT NULL
};
CREATE TABLE speciality{
speciality_ID INT PRIMARY KEY,
speciality_Name VARCHAR(50) NOT NULL
};
CREATE TABLE school_speciality{
ID INT PRIMARY KEY,
speciality_ID INT ,
School_ID INT
};
CREATE TABLE class{
class_ID INT PRIMARY KEY,
speciality_ID INT,
class_Name VARCHAR(50) NOT NULL
};
CREATE TABLE user{
user_ID INT PRIMARY KEY,
class_ID INT,
user_Name VARCHAR(50) NOT NULL
};
-- 英文单词直接用百度翻译,不符合期望,按照实际情况更改
不知道你这个问题是否已经解决, 如果还没有解决的话:(1)代码实现:
SELECT Student.Sno AS '学号', COUNT(SC.Cno) AS '选课门数',
CASE
WHEN COUNT(SC.Cno) >= 6 THEN '多'
WHEN COUNT(SC.Cno) BETWEEN 3 AND 5 THEN '一般'
WHEN COUNT(SC.Cno) BETWEEN 1 AND 2 THEN '偏少'
WHEn COUNT(SC.Cno) = 0 THEN '未选课'
END AS '选课情况'
FROM Student
LEFT JOIN SC ON SC.Sno = Student.Sno
GROUP BY Student.Sno
(2)运行效果:
我可以解决该问题。
首先,使用2019版SQL创建数据库的方法与其他版本类似,可以通过以下步骤完成:
接下来,按照题目要求创建数据表,并保证其中包含所有六类约束。
在创建数据表时,需要明确每个表的字段,以及字段与其他表之间的关系。根据题目要求可以设计如下表:
在创建表时,需要注意以下几点:
创建数据表的具体SQL语句如下:
-- 创建专业表 CREATE TABLE major ( mno CHAR(4) PRIMARY KEY, -- 专业编号,主键 mname VARCHAR(20) NOT NULL, -- 专业名称,非空 UNIQUE(mname) -- 专业名称唯一 );
-- 创建班级表,包含一个外键(mno),参考专业表中的mno字段 CREATE TABLE class ( cno CHAR(4) PRIMARY KEY, -- 班级编号,主键 cname VARCHAR(20) NOT NULL, -- 班级名称,非空 mno CHAR(4) NOT NULL, -- 专业编号,非空 FOREIGN KEY (mno) REFERENCES major(mno) -- 外键,参考专业表中的mno字段 );
-- 创建学生表,包含一个外键(cno),参考班级表中的cno字段 CREATE TABLE student ( sno CHAR(8) PRIMARY KEY, -- 学生学号,主键 sname VARCHAR(20) NOT NULL, -- 学生姓名,非空 cno CHAR(4) NOT NULL, -- 班级编号,非空 FOREIGN KEY (cno) REFERENCES class(cno) -- 外键,参考班级表中的cno字段 );
-- 创建课程表 CREATE TABLE course ( cno CHAR(4) PRIMARY KEY, -- 课程编号,主键 cname VARCHAR(20) NOT NULL -- 课程名称,非空 );
-- 创建成绩表,包含两个外键(sno和cno),分别参考学生表和课程表中的字段 CREATE TABLE score ( sno CHAR(8) NOT NULL, -- 学生学号,非空 cno CHAR(4) NOT NULL, -- 课程编号,非空 grade INT NOT NULL, -- 成绩,非空 PRIMARY KEY (sno, cno), -- 主键由学生学号和课程编号组成 FOREIGN KEY (sno) REFERENCES student(sno), -- 外键,参考学生表中的sno字段 FOREIGN KEY (cno) REFERENCES course(cno) -- 外键,参考课程表中的cno字段 );
在表格中,可以通过insert语句插入数据,例如:
-- 插入专业表数据 INSERT INTO major VALUES ('M001', '计算机科学与技术'); INSERT INTO major VALUES ('M002', '软件工程');
-- 插入班级表数据 INSERT INTO class VALUES ('C001', '计算机1班', 'M001'); INSERT INTO class VALUES ('C002', '计算机2班', 'M001'); INSERT INTO class VALUES ('C003', '软工1班', 'M002'); INSERT INTO class VALUES ('C004', '软工2班', 'M002');
-- 插入学生表数据 INSERT INTO student VALUES ('S10001', '张三', 'C001'); INSERT INTO student VALUES ('S10002', '李四', 'C002'); INSERT INTO student VALUES ('S10003', '王五', 'C003'); INSERT INTO student VALUES ('S10004', '赵六', 'C004');
-- 插入课程表数据 INSERT INTO course VALUES ('C0101', '计算机基础'); INSERT INTO course VALUES ('C0102', '面向对象编程'); INSERT INTO course VALUES ('C0201', '软件需求分析'); INSERT INTO course VALUES ('C0202', '软件开发过程');
-- 插入成绩表数据 INSERT INTO score VALUES ('S10001', 'C0101', 90); INSERT INTO score VALUES ('S10001', 'C0102', 85); INSERT INTO score VALUES ('S10002', 'C0101', 92); INSERT INTO score VALUES ('S10002', 'C0102', 88); INSERT INTO score VALUES ('S10003', 'C0201', 95); INSERT INTO score VALUES ('S10003', 'C0202', 93); INSERT INTO score VALUES ('S10004', 'C0201', 89); INSERT INTO score VALUES ('S10004', 'C0202', 91);
需要注意的是,插入数据时,需要保证外键的参考值在相应的参考表中存在,否则会出现插入失败的情况。
至此,完成了创建数据库和数据表的步骤。由于设计表格和插入数据的方法可以有多种,具体的实现方式可能会有所不同,但最终的目标是保证数据具有普遍性,并可以满足题目要求。