以 Student、SC、Course 基本表为数据源,查询选修了全部课程的学生学号、姓名和专业。其中student数据源包括sno学号,sname姓名,ssex性别,birthday生日,en_time入学时间,specialty专业,grade年级;SC数据表包括sno学号,cno课程号,score成绩;course数据表包括cno课程号,cname课程名,classhour学时,credit学分,cpno先修课程,用SQL server实现
时间: 2023-06-18 09:05:16 浏览: 64
可以使用子查询和聚合函数(COUNT和SUM)来解决这个问题。以下是解决方案:
```
SELECT s.sno, s.sname, s.specialty
FROM student s
WHERE (SELECT COUNT(DISTINCT cno) FROM course) =
(SELECT COUNT(*) FROM SC WHERE SC.sno = s.sno)
```
解释:
1. 子查询 `(SELECT COUNT(DISTINCT cno) FROM course)` 用来计算课程总数。
2. 子查询 `(SELECT COUNT(*) FROM SC WHERE SC.sno = s.sno)` 用来计算每个学生选修的课程数。
3. `WHERE` 子句用来筛选出选修了全部课程的学生。
4. 最终结果中只显示学号、姓名和专业。
注意:如果有学生选修了同一门课程多次,需要使用 `DISTINCT` 关键字去重。
相关问题
用 sc 代表选课表 student 为学生表 course 为课程表 随机生成三表内容,并查询选修高等数学的学号和姓名
好的,假设我们有以下三个表:
学生表(student):
| 学号 | 姓名 | 性别 | 年龄 |
|------|------|------|------|
| 001 | 张三 | 男 | 20 |
| 002 | 李四 | 女 | 19 |
| 003 | 王五 | 男 | 21 |
| 004 | 赵六 | 男 | 22 |
| 005 | 小明 | 男 | 18 |
课程表(course):
| 课程编号 | 课程名称 | 学分 |
|----------|-------------|------|
| 001 | 高等数学 | 4 |
| 002 | 大学英语 | 3 |
| 003 | 数据结构 | 4 |
| 004 | 计算机网络 | 3 |
| 005 | 离散数学 | 4 |
选课表(sc):
| 学号 | 课程编号 |
|------|----------|
| 001 | 001 |
| 002 | 002 |
| 003 | 001 |
| 004 | 004 |
| 005 | 001 |
| 001 | 002 |
| 002 | 004 |
| 003 | 003 |
| 004 | 001 |
| 005 | 003 |
现在,我们可以使用如下 SQL 语句查询选修高等数学的学号和姓名:
```
SELECT student.学号, student.姓名
FROM student, sc, course
WHERE student.学号 = sc.学号 AND sc.课程编号 = course.课程编号 AND course.课程名称 = '高等数学';
```
查询结果如下:
| 学号 | 姓名 |
|------|------|
| 001 | 张三 |
| 003 | 王五 |
| 005 | 小明 |
在student表、course表、sc表中,查询选修课程号为“a01”的学生的学号、姓名、课程名、分数
可以使用 SQL 的 JOIN 操作来查询选修课程号为“a01”的学生的学号、姓名、课程名、分数,具体的 SQL 语句如下:
```sql
SELECT s.sid, s.sname, c.cname, sc.score
FROM student s
JOIN sc ON s.sid = sc.sid
JOIN course c ON c.cid = sc.cid
WHERE c.cid = 'a01';
```
这里使用了 INNER JOIN 连接了三个表:student、sc、course,条件是 sc 表中的 cid 和 course 表中的 cid 相等,同时 sc 表中的 sid 和 student 表中的 sid 相等。最后使用 WHERE 子句筛选出选修课程号为“a01”的学生。