查询没学过“张三”老师课的同学的学号、姓名; sql语言
时间: 2024-06-11 10:07:20 浏览: 164
假设学生信息存储在名为“students”的表中,课程信息存储在名为“courses”的表中,选课信息存储在名为“selections”的表中,其中“selections”表包括学生学号和课程编号两个字段。
则可以使用如下的SQL语句查询没学过“张三”老师课的同学的学号、姓名:
```
SELECT s.student_id, s.student_name
FROM students s
WHERE s.student_id NOT IN
(SELECT se.student_id
FROM selections se, courses c
WHERE se.course_id = c.course_id AND c.teacher_name = '张三')
```
解释:先在“courses”表中找到“张三”老师的课程编号,再在“selections”表中找到选择这些课程的学生学号,最后在“students”表中找到没有在上述结果中出现过的学生学号和姓名。
相关问题
查询没学过张三老师课程的学生学号,有四张表
查询没有上过张三老师课程的学生学号通常需要通过联接多个表来进行。假设我们有以下四个表:
1. `Students` (学生表) - 包含学生的基本信息,如 `StudentID`, `Name`
2. `Courses` (课程表) - 包含课程的信息,如 `CourseID`, `TeacherID`, `CourseName`
3. `Enrollments` (注册表) - 记录了学生选课情况,包含 `StudentID`, `CourseID`
4. `Teachers` (教师表) - 包含教师的信息,如 `TeacherID`, `TeacherName`
你可以使用 SQL 语句(以 MySQL 为例)来完成这个查询:
```sql
SELECT s.StudentID
FROM Students s
LEFT JOIN Enrollments e ON s.StudentID = e.StudentID
LEFT JOIN Courses c ON e.CourseID = c.CourseID
LEFT JOIN Teachers t ON c.TeacherID = t.TeacherID
WHERE t.TeacherName != '张三' AND s.StudentID NOT IN (
SELECT StudentID FROM Enrollments WHERE CourseID IN (
SELECT CourseID FROM Courses WHERE TeacherID = (SELECT TeacherID FROM Teachers WHERE TeacherName = '张三')
)
);
```
这个查询首先通过 left join 将所有相关的表连接起来,然后筛选出教师名字不是张三,并且学生的 ID 未出现在张三老师的课程列表中的学生。
将student表重命名为你名字的全拼(例如:zhangsan) 查询hu老师教什么课 查询挂过科的同学的学号和姓名 查询各科成绩的最高分、最低分 (查询科目名,最高分,最低分) 查询平均成绩大于80的所有学生的学号(查询student_id、姓名、平均分) 查询所有学生的学号,姓名,选课数和总成绩 查询学过“4”且学过编号“5”课程的同学的学号 查询没有上过‘wo’的课的学生姓名
对于这些问题,我们需要使用 SQL 语句来查询数据库。以下是我给出的 SQL 语句:
1. 将student表重命名为你名字的全拼(例如:zhangsan):
```
ALTER TABLE student RENAME TO <your_full_name>;
```
其中 `<your_full_name>` 为你的全拼名字,例如如果你的名字是张三,则可以将表名改为 `zhangsan`。
2. 查询hu老师教什么课:
```
SELECT course_name FROM course INNER JOIN teacher ON course.teacher_id = teacher.teacher_id WHERE teacher.teacher_name = 'hu';
```
其中 `course` 表包含课程信息,`teacher` 表包含教师信息。通过 INNER JOIN 将这两张表连接起来,然后筛选出教师名字为 'hu' 的课程名。
3. 查询挂过科的同学的学号和姓名:
```
SELECT student_id, student_name FROM student WHERE student_id IN (SELECT student_id FROM score WHERE score < 60);
```
其中 `score` 表包含学生成绩信息。首先查询出成绩低于 60 分的学生 ID,然后在 `student` 表中筛选出这些学生的学号和姓名。
4. 查询各科成绩的最高分、最低分:
```
SELECT course_name, MAX(score) as max_score, MIN(score) as min_score FROM score INNER JOIN course ON score.course_id = course.course_id GROUP BY course_name;
```
首先使用 INNER JOIN 连接 `score` 表和 `course` 表,然后按照科目名字分组,计算出每个科目的最高分和最低分。
5. 查询平均成绩大于80的所有学生的学号:
```
SELECT student_id, student_name, AVG(score) as avg_score FROM score INNER JOIN student ON score.student_id = student.student_id GROUP BY student_id HAVING avg_score > 80;
```
使用 INNER JOIN 连接 `score` 表和 `student` 表,然后按照学生 ID 分组,计算出每个学生的平均分,并筛选出平均分大于 80 的学生的学号、姓名和平均分。
6. 查询所有学生的学号,姓名,选课数和总成绩:
```
SELECT student.student_id, student.student_name, COUNT(score.course_id) as num_courses, SUM(score.score) as total_score FROM student LEFT JOIN score ON student.student_id = score.student_id GROUP BY student.student_id;
```
使用 LEFT JOIN 连接 `student` 表和 `score` 表,按照学生 ID 分组,计算出每个学生选修的课程数和总成绩。
7. 查询学过“4”且学过编号“5”课程的同学的学号:
```
SELECT student_id FROM score WHERE course_id IN (4, 5) GROUP BY student_id HAVING COUNT(DISTINCT course_id) = 2;
```
首先筛选出选修了课程编号为 4 或 5 的学生成绩记录,然后按照学生 ID 分组,筛选出选修了这两门课程的学生的学号。
8. 查询没有上过‘wo’的课的学生姓名:
```
SELECT student_name FROM student WHERE student_id NOT IN (SELECT student_id FROM score WHERE course_id = (SELECT course_id FROM course WHERE course_name = 'wo'));
```
首先查询出课程名为 'wo' 的课程 ID,然后在 `score` 表中筛选出选修了这门课程的学生 ID,最后在 `student` 表中筛选出没有选修这门课程的学生的姓名。
阅读全文