多表查询列出选修”JAVA基础”课程的学生学号,学生姓名,课程名,分数
时间: 2023-08-06 08:06:46 浏览: 124
假设我们有以下四张表:
- 学生表(Student):学生编号(id),学生姓名(name)
- 课程表(Course):课程编号(id),课程名(name)
- 选课表(SC):学生编号(sid),课程编号(cid),分数(score)
- 课程类型表(Category):课程编号(cid),课程类型(type)
则可以使用以下 SQL 语句进行查询:
```sql
SELECT Student.id, Student.name, Course.name, SC.score
FROM Student, Course, SC, Category
WHERE Student.id = SC.sid
AND Course.id = SC.cid
AND Course.name = 'JAVA基础'
AND Category.cid = Course.id
AND Category.type = '选修';
```
这条 SQL 语句的含义是:
- 从四张表中选取需要的列:学生编号、学生姓名、课程名、分数。
- 从四张表中选取需要的行,这里使用了 WHERE 子句,将四张表中需要的行连接起来:
- 学生表和选课表通过学生编号连接;
- 课程表和选课表通过课程编号连接;
- 课程表和课程类型表通过课程编号连接。
- 最后限定条件,只选取课程名为“JAVA基础”且课程类型为“选修”的记录。
相关问题
查询选修java课程的同学姓名,学号及考试成绩和授课教师
查询选修Java课程的同学信息通常需要数据库操作,假设我们有一个包含学生信息、课程选择和成绩的表结构,我们可以编写SQL查询来获取所需数据:
```sql
SELECT students.name AS 姓名, students.student_id AS 学号, courses.score AS 考试成绩, teachers.teacher_name AS 授课教师
FROM students
JOIN student_courses ON students.student_id = student_courses.student_id
JOIN courses ON student_courses.course_id = courses.course_id
JOIN teachers ON courses.teacher_id = teachers.teacher_id
WHERE courses.course_name = 'Java';
```
这个查询假设存在`students`表记录学生的姓名和学号,`student_courses`表关联了学生和他们选修的课程,`courses`表存储了课程名称、分数以及对应的教师ID,`teachers`表则列出了教师的信息。
用Java编写一个学生成绩管理系统。学生的属性包括学号、姓名、年龄等。每个学生要学习若干课程,每门课程有平时成绩、其中考试成绩、实习成绩、期末考试成绩以及总评成绩等多个成绩,其中平时成绩的数目不定(因为不同课程的教师布置的平时作业不同),而总评成绩是其它成绩的平均值。请先设计合理的类存放这些信息,然后设计程序完成以下功能: (1)列出某个学生的所有成绩; (2)列出某门课程每个学生的总评成绩,及所有学生总评成绩的总评分; (3)分区段统计某门课程的学生总评成绩,例如60分以下的学生人数、60至70分的学生人数等。
好的,根据您的要求,我为您设计了下面的类:
1. 学生类(Student):包含学号、姓名、年龄等属性,以及学生所选的课程列表。
2. 课程类(Course):包含课程名称、平时成绩列表、其中考试成绩、实习成绩、期末考试成绩等属性,以及选修该课程的学生列表。
3. 成绩类(Grade):包含平时成绩、其中考试成绩、实习成绩、期末考试成绩等属性,以及计算总评成绩的方法。
然后,我们可以设计以下程序实现您的功能需求:
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
// 创建学生列表和课程列表
List<Student> students = new ArrayList<>();
List<Course> courses = new ArrayList<>();
// 添加学生和课程信息...
// 省略代码
// (1) 列出某个学生的所有成绩
Student student = students.get(0); // 假设要查询的学生是列表中的第一个
System.out.println(student.getName() + "的所有成绩:");
for (Course course : student.getCourses()) {
Grade grade = course.getGrade(student);
System.out.println(course.getName() + ":总评成绩为" + grade.getFinalGrade());
}
// (2) 列出某门课程每个学生的总评成绩,及所有学生总评成绩的总评分
Course course = courses.get(0); // 假设要查询的课程是列表中的第一个
double totalFinalGrade = 0.0;
for (Student s : course.getStudents()) {
Grade grade = course.getGrade(s);
System.out.println(s.getName() + "的总评成绩为" + grade.getFinalGrade());
totalFinalGrade += grade.getFinalGrade();
}
System.out.println("所有学生的总评成绩总分为" + totalFinalGrade);
// (3) 分区段统计某门课程的学生总评成绩
Map<String, Integer> gradeCount = new HashMap<>();
for (Student s : course.getStudents()) {
Grade grade = course.getGrade(s);
double finalGrade = grade.getFinalGrade();
if (finalGrade < 60) {
gradeCount.put("60分以下", gradeCount.getOrDefault("60分以下", 0) + 1);
} else if (finalGrade < 70) {
gradeCount.put("60-70分", gradeCount.getOrDefault("60-70分", 0) + 1);
} else if (finalGrade < 80) {
gradeCount.put("70-80分", gradeCount.getOrDefault("70-80分", 0) + 1);
} else if (finalGrade < 90) {
gradeCount.put("80-90分", gradeCount.getOrDefault("80-90分", 0) + 1);
} else {
gradeCount.put("90分以上", gradeCount.getOrDefault("90分以上", 0) + 1);
}
}
for (String range : gradeCount.keySet()) {
int count = gradeCount.get(range);
System.out.println(range + "的学生人数为" + count);
}
}
}
```
上述代码中,我们通过调用各个类的方法实现了所需的功能。其中,(1) 需要遍历学生所选的课程列表,得到每门课程的总评成绩;(2) 需要遍历课程的学生列表,计算每个学生的总评成绩,并累加总分;(3) 需要遍历课程的学生列表,根据总评成绩分布计算各个分数段的学生人数。
阅读全文