### Sqlite3 示例数据库 以下是针对 SQLite3 格式修改的 SQL 代码,其中主要调整了数据类型的兼容性,并去掉了一些 SQLite 不支持的特性: ### 数据库名称: `SchoolDB` #### 表 1: 学生表 (`Students`) ```sql CREATE TABLE Students ( StudentID INTEGER PRIMARY KEY, FirstName TEXT, LastName TEXT, DateOfBirth TEXT, Gender TEXT, EnrollmentDate TEXT ); ``` #### 表 2: 课程表 (`Courses`) ```sql CREATE TABLE Courses ( CourseID INTEGER PRIMARY KEY, CourseName TEXT, Credits INTEGER ); ``` #### 表 3: 教师表 (`Teachers`) ```sql CREATE TABLE Teachers ( TeacherID INTEGER PRIMARY KEY, FirstName TEXT, LastName TEXT, HireDate TEXT, Department TEXT ); ``` #### 表 4: 学生课程关系表 (`StudentCourses`) ```sql CREATE TABLE StudentCourses ( StudentID INTEGER, CourseID INTEGER, Grade TEXT, PRIMARY KEY (StudentID, CourseID), FOREIGN KEY (StudentID) REFERENCES Students(StudentID), FOREIGN KEY (CourseID) REFERENCES Courses(CourseID) ); ``` #### 表 5: 教师课程关系表 (`TeacherCourses`) ```sql CREATE TABLE TeacherCourses ( TeacherID INTEGER, CourseID INTEGER, PRIMARY KEY (TeacherID, CourseID), FOREIGN KEY (TeacherID) REFERENCES Teachers(TeacherID), FOREIGN KEY (CourseID) REFERENCES Courses(CourseID) ); ``` ### 示例数据插入 ```sql INSERT INTO Students (StudentID, FirstName, LastName, DateOfBirth, Gender, EnrollmentDate) VALUES (1, '张', '三', '2000-01-01', 'M', '2018-09-01'), (2, '李', '四', '2001-02-02', 'F', '2019-09-01'); INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (101, '数学', 3), (102, '英语', 2); INSERT INTO Teachers (TeacherID, FirstName, LastName, HireDate, Department) VALUES (201, '王', '老师', '2015-08-01', '数学系'), (202, '李', '老师', '2016-09-01', '英语系'); INSERT INTO StudentCourses (StudentID, CourseID, Grade) VALUES (1, 101, 'A'), (1, 102, 'B'), (2, 101, 'C'); INSERT INTO TeacherCourses (TeacherID, CourseID) VALUES (201, 101), (202, 102); ``` ### 修改点说明: 1. 将所有数据类型调整为 SQLite 支持的类型,比如 `TEXT` 替代 `VARCHAR`,`INTEGER` 替代 `INT`。 2. 外键约束在 SQLite 中需要显式启用。如果需要启用,请在执行 SQL 语句前使用: ```sql PRAGMA foreign_keys = ON; ``` 3. 日期类型使用 `TEXT` 存储,格式为 `YYYY-MM-DD`。 以下是从示例数据库中生成的两例综合查询,它们展示了多表联结以及聚合的用法: ### 查询示例 1:查询每位学生的姓名、选修课程的名称以及对应的成绩 ```sql SELECT Students.FirstName || ' ' || Students.LastName AS StudentName, Courses.CourseName, StudentCourses.Grade FROM Students JOIN StudentCourses ON Students.StudentID = StudentCourses.StudentID JOIN Courses ON StudentCourses.CourseID = Courses.CourseID; ``` **结果说明:** - 这个查询将显示所有学生的全名(`FirstName` 和 `LastName` 拼接),他们所选修的课程名称,以及他们在该课程中的成绩。 ------ ### 查询示例 2:统计每门课程的选修人数以及平均成绩 ```sql SELECT Courses.CourseName, COUNT(StudentCourses.StudentID) AS TotalStudents, ROUND(AVG(CASE WHEN StudentCourses.Grade = 'A' THEN 4.0 WHEN StudentCourses.Grade = 'B' THEN 3.0 WHEN StudentCourses.Grade = 'C' THEN 2.0 WHEN StudentCourses.Grade = 'D' THEN 1.0 ELSE 0.0 END), 2) AS AverageGPA FROM Courses LEFT JOIN StudentCourses ON Courses.CourseID = StudentCourses.CourseID GROUP BY Courses.CourseID; ``` **结果说明:** - 查询中使用了 GPA 等级换算(假设 A=4.0,B=3.0,依此类推),并计算每门课程的选修人数和平均成绩(四舍五入保留两位小数)。 - 如果某门课程没有学生选修,它的 `TotalStudents` 将为 0,`AverageGPA` 为 `NULL`。 ------ 这些查询展示了如何通过联结(`JOIN`)和分组(`GROUP BY`)从多张表中提取综合信息。如果你需要其他类型的查询示例,请告诉我!