查询选修了“C语言”课程,但是没有选修“数据结构”课程的学生 分数 3 作者 张庆 单位 集美大学 本题目要求编写SQL语句,查询选修了“C语言”课程,但是没有选修“数据结构”课程的学生姓名。 提示:请使用SELECT语句作答。 表结构: 请在这里写定义表结构的SQL语句。例如: CREATE TABLE `major` ( `mno` char(2) NOT NULL, `mname` varchar(20) NOT NULL, PRIMARY KEY (`mno`) ); CREATE TABLE `stu` ( `sno` char(4) NOT NULL, `sname` char(8) NOT NULL, `sex` tinyint(1) DEFAULT NULL, `mno` char(2) DEFAULT NULL, `birdate` datetime DEFAULT NULL, `memo` text, PRIMARY KEY (`sno`), KEY `fk_stu_mno` (`mno`), CONSTRAINT `fk_stu_mno` FOREIGN KEY (`mno`) REFERENCES `major` (`mno`) ); CREATE TABLE `cou` ( `cno` char(4) NOT NULL, `cname` varchar(30) NOT NULL, `credit` smallint(6) DEFAULT NULL, `ptime` char(5) DEFAULT NULL, `teacher` char(10) DEFAULT NULL, PRIMARY KEY (`cno`) ); CREATE TABLE `sc` ( `sno` char(4) NOT NULL, `cno` char(4) NOT NULL, `grade` decimal(6,1) DEFAULT NULL, PRIMARY KEY (`sno`,`cno`), KEY `fk_sc_cno` (`cno`), CONSTRAINT `fk_sc_cno` FOREIGN KEY (`cno`) REFERENCES `cou
时间: 2025-06-05 07:58:02 浏览: 22
### 查询选修C语言但未选修数据结构的学生姓名
以下是基于提供的引用内容以及标准 SQL 实现的解决方案:
为了查询选修了 “C语言” 课程但未选修 “数据结构” 课程的学生姓名,可以使用 `LEFT JOIN` 和子查询的方式完成。具体逻辑如下:
1. 首先通过子查询找到所有选修了 “C语言” 的学生。
2. 接着排除那些也选修了 “数据结构” 的学生。
最终的 SQL 语句如下所示:
```sql
SELECT DISTINCT sname AS 姓名
FROM stu
WHERE sno IN (
SELECT sc.sno
FROM sc
JOIN cou ON sc.cno = cou.cno
WHERE cou.cname = 'C语言'
) AND sno NOT IN (
SELECT sc.sno
FROM sc
JOIN cou ON sc.cno = cou.cno
WHERE cou.cname = '数据结构'
);
```
上述查询的核心在于利用两次子查询来筛选符合条件的学生学号,并将其映射到学生的姓名上[^3]。
---
另一种方法可以通过 `EXISTS` 和 `NOT EXISTS` 来实现相同的逻辑:
```sql
SELECT sname AS 姓名
FROM stu s
WHERE EXISTS (
SELECT 1
FROM sc
JOIN cou ON sc.cno = cou.cno
WHERE s.sno = sc.sno AND cou.cname = 'C语言'
)
AND NOT EXISTS (
SELECT 1
FROM sc
JOIN cou ON sc.cno = cou.cno
WHERE s.sno = sc.sno AND cou.cname = '数据结构'
);
```
此版本的查询更加直观地表达了条件关系,即存在选修 C语言 的记录而不存在选修 数据结构 的记录[^3]。
---
### 注意事项
- 如果表中的字段名或表名有所不同,请根据实际数据库结构调整相应的字段名称。
- 上述查询假设 `cou.cname` 是唯一的,如果可能重复,则需进一步优化去重逻辑。
问题
阅读全文