用2019版sql创建数据库,数据库中数据表的数量不少于5个,六类约束都要有

4、数据库中的数据具有普遍性,涵盖所有可能出现的情况(例如一个学校需要2个专业,一个专业需要2个以上班级,一个班级至少有2个以上人员)。

TechWhizKid参考GPT回答:

先创建一个数据库,假设它的名字为"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)
);
  • 在这些表中,每个表都有一个主键(Primary Key),用于唯一标识表中的每一行。外键(Foreign Key)用于确保数据的完整性,即确保引用的数据存在。NOT NULL约束确保字段始终有值,CHECK约束用于限制Grade的值在0到100之间。最后,Grades表的主键是(StudentID, 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
};
-- 英文单词直接用百度翻译,不符合期望,按照实际情况更改
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/340151
  • 除此之外, 这篇博客: SQL语句操作练习(二)中的 20.统计每个学生的选课门数(包括没有选课的学生),列出学号、选课门数和选课情况,其中选课情况显示规则为:如果选课门数大于等于6门,则选课情况为“多”;如果选课门数超过在3-5门,则选课情况为“般”:如果选课门数在1-2门, 则选课情况为“偏少”;如果没有选课,则选课情况为“未选课”。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    (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)运行效果:
    在这里插入图片描述

  • 以下回答来自chatgpt:

    我可以解决该问题。

    首先,使用2019版SQL创建数据库的方法与其他版本类似,可以通过以下步骤完成:

    1. 打开MySQL Workbench
    2. 连接至MySQL服务器
    3. 点击“File”菜单-“New Model”-“Add Diagram”
    4. 右键新建的模型,在弹出的菜单中选择“Add New Schema”
    5. 输入数据库名,点击“Apply”按钮,即可创建新的数据库

    接下来,按照题目要求创建数据表,并保证其中包含所有六类约束。

    在创建数据表时,需要明确每个表的字段,以及字段与其他表之间的关系。根据题目要求可以设计如下表:

    1. 专业表major:包括专业编号mno、专业名称mname等字段
    2. 班级表class:包括班级编号cno、班级名称cname、专业编号mno等字段,其中mno为外键,参考专业表中的mno字段
    3. 学生表student:包括学生学号sno、学生姓名sname、班级编号cno等字段,其中cno为外键,参考班级表中的cno字段
    4. 课程表course:包括课程编号cno、课程名称cname等字段
    5. 成绩表score:包括学生学号sno、课程编号cno、成绩grade等字段,其中sno和cno为外键,分别参考学生表中的sno字段和课程表中的cno字段

    在创建表时,需要注意以下几点:

    1. 对于每个表,需要定义一个主键,并保证主键的唯一性。例如,在班级表中可以将cno定义为主键,保证每个班级有一个唯一的编号。
    2. 对于需要参考其他表中的字段的表,需要定义外键,保证数据的完整性。例如,在学生表中,需要参考班级表中的cno字段,因此可以将cno定义为外键,并将其与班级表的主键cno关联起来。
    3. 六类约束分别是主键约束、非空约束、唯一约束、外键约束、默认约束和检查约束。在创建表时,需要针对每个字段定义相应的约束。

    创建数据表的具体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);

    需要注意的是,插入数据时,需要保证外键的参考值在相应的参考表中存在,否则会出现插入失败的情况。

    至此,完成了创建数据库和数据表的步骤。由于设计表格和插入数据的方法可以有多种,具体的实现方式可能会有所不同,但最终的目标是保证数据具有普遍性,并可以满足题目要求。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^