(8)查询既选修了“3”号又选修了“4”号课程的学生姓名、课程名及成绩:
```
SELECT students.name, courses.name, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id
INNER JOIN courses ON scores.course_id = courses.id
WHERE scores.course_id IN (3, 4)
GROUP BY students.id
HAVING COUNT(DISTINCT scores.course_id) = 2;
```
这个查询语句使用 INNER JOIN 连接了三个表,并使用 WHERE 子句过滤出选修了“3”号和“4”号课程的学生信息。然后,使用 GROUP BY 子句按照学生 ID 进行分组,并使用 HAVING 子句过滤出同时选修了两门课程的学生信息。其中,students.name 表示返回学生姓名,courses.name 表示返回课程名称,scores.score 表示返回成绩。
(9)查询同时选修了“操作系统”课程和“数据库原理”课程的学生名单:
```
SELECT students.name
FROM students
INNER JOIN scores AS s1 ON students.id = s1.student_id
INNER JOIN courses AS c1 ON s1.course_id = c1.id AND c1.name = '操作系统'
INNER JOIN scores AS s2 ON students.id = s2.student_id
INNER JOIN courses AS c2 ON s2.course_id = c2.id AND c2.name = '数据库原理';
```
这个查询语句使用多次 INNER JOIN 连接了四个表,并使用 WHERE 子句过滤出同时选修了“操作系统”课程和“数据库原理”课程的学生信息。其中,students.name 表示返回学生姓名。
(10)查询所有同学的基本信息及选课情况(包含未选课同学的信息):
```
SELECT students.id, students.name, departments.name AS department, courses.name AS course, scores.score
FROM students
LEFT JOIN departments ON students.department_id = departments.id
LEFT JOIN scores ON students.id = scores.student_id
LEFT JOIN