(12) 查询出学生“李勇”和“刘晨”同时选修的课程的课程号,课程名。
时间: 2024-12-16 12:16:35 浏览: 6
查询学生“李勇”和“刘晨”共同选择的课程,需要访问他们的选课记录以及对应的课程信息。假设我们有一个包含学生、课程和选课关系的数据库表结构,例如:
- `students` 表:有字段 `id`, `name`
- `courses` 表:有字段 `id`, `course_name`
- `enrollments` 表:关联了学生和课程,有字段 `student_id`, `course_id`
我们可以使用 SQL 查询来获取所需信息:
```sql
SELECT enrollments.course_id AS course_number, courses.course_name
FROM enrollments
JOIN students ON enrollments.student_id = students.id
WHERE students.name IN ('李勇', '刘晨')
GROUP BY enrollments.course_id, courses.course_name
HAVING COUNT(DISTINCT students.name) = 2;
```
这个查询首先通过`JOIN`将学生的选课表与学生表连接起来,然后筛选出“李勇”和“刘晨”的记录。`GROUP BY`按照课程ID和课程名称分组,`HAVING`条件确保只有那些两个学生都选择过的课程才会被返回。
相关问题
查询出学生“李勇”和“刘晨”同时选修的课程的课程号,课程名
查询出学生“李勇”和“刘晨”同时选修的课程需要假设我们有一个数据库表结构,其中包括学生表(如student_id, student_name)和课程表(course_id, course_name, student_id)。在这个场景下,我们可以编写SQL查询来获取结果:
```sql
SELECT c.course_id, c.course_name
FROM courses c
INNER JOIN students s1 ON c.student_id = s1.student_id AND s1.student_name = '李勇'
INNER JOIN students s2 ON c.student_id = s2.student_id AND s2.student_name = '刘晨'
WHERE c.student_id IN (SELECT student_id FROM students WHERE student_name = '李勇')
AND c.student_id IN (SELECT student_id FROM students WHERE student_name = '刘晨');
```
这个查询首先通过内连接找到“李勇”和“刘晨”各自选择的所有课程,然后筛选出在这两个列表中都存在的课程。
create table student( sno varchar(20), sname varchar(20), ssex varchar(4), sday date, sdept varchar(20)); insert into student(sno,sname,ssex,sday,sdept) values("202115121","李勇","男",'1992-01-12',"信息学院"), ("202115123","刘晨","女",'1993-06-04',"信息学院"), ("202115124","王敏","女",'1991-02-04',"理学院"), ("202115125","张立","男",'1995-06-08',"工学院" create table sc( sno varchar(20), cno int, score double); insert into sc(sno,cno,score) values("202115121",1,92), ("202115121",2,85), ("202115122",3,88), ("202115122",2,90), ("202115123",3,80); create table course( cno int, cname varchar(20)); insert into course(cno,cname) values(1,"数据库"), (2,"高等数学"), (3,"信息系统"), (4,"操作系统"); 查询同时选修了课程号为1和2的学生的学号和姓名
可以使用 `INNER JOIN` 和 `WHERE` 子句来查询同时选修了课程号为1和2的学生的学号和姓名,具体的 SQL 语句如下:
```
SELECT s.sno, s.sname
FROM student s
INNER JOIN sc s1 ON s.sno = s1.sno
INNER JOIN sc s2 ON s.sno = s2.sno
WHERE s1.cno = 1 AND s2.cno = 2;
```
解释一下这个 SQL 语句的每一部分:
- `SELECT s.sno, s.sname`:查询结果中只包含学号和姓名两个字段;
- `FROM student s`:从 `student` 表中查询学生信息;
- `INNER JOIN sc s1 ON s.sno = s1.sno`:将 `student` 表和 `sc` 表连接起来,查询学生选课信息,其中 `s1` 是 `sc` 表的别名;
- `INNER JOIN sc s2 ON s.sno = s2.sno`:再次将 `student` 表和 `sc` 表连接起来,查询学生选课信息,其中 `s2` 是 `sc` 表的别名;
- `WHERE s1.cno = 1 AND s2.cno = 2`:筛选出选修了课程号为1和2的学生,其中 `s1.cno = 1` 表示选修了课程号为1的学生,`s2.cno = 2` 表示选修了课程号为2的学生。
注意,这个 SQL 语句中选修了课程号为1和2的学生只有李勇(202115121)符合要求。
阅读全文