R10-25 查询学生选修的课程 R10-25 查询学生选修的课程 分数 3 例如:本题目要求编写SQL语句, 查询学号为‘S001’或‘S003’的学生选修的课程,输出结果集按课程号升序排序,且不包含重复的课程记录。 提示:请使用UNION语句作答。 表结构: 请在这里写定义表结构的SQL语句。例如: 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`), CONSTRAINT `fk_sc_cno` FOREIGN KEY (`cno`) REFERENCES `cou` (`cno`) ); 表样例 请在这里给出上述表结构对应的表样例。例如 cou表: cou.JPG sc表: sc.JPG 输出样例: 请在这里给出输出样例。例如: l219.JPG 代码长度限制 16 KB 时间限制 400 ms 数据库 MySQL 结果输出要求 严格对比顺序与数据 建表语句 结果表结构
时间: 2025-06-22 22:09:19 AIGC 浏览: 38
<think>我们使用UNION来合并两个查询结果,并自动去重。同时,我们需要按课程号升序排序。根据引用[1]和引用[4],我们可以写出如下SQL语句:方法1:使用子查询和UNION,并在外层进行排序引用[1]的示例:SELECT课程号,课程FROM(SELECTcnoas课程号,cnameas课程FROMcouWHEREcnoIN(SELECTcnoFROMscWHEREsno='S001')UNIONSELECTcnoas课程号,cnameas课程FROMcouWHEREcnoIN(SELECTcnoFROMscWHEREscWHEREsno='S003'))ASsubqueryORDERBY课程号但是,我们也可以直接在UNION之后进行排序。方法2:直接使用UNION并排序(注意:排序作用于整个结果集)引用[4]的示例(但未排序,我们稍作修改):SELECTsc.cnoas课程号,cou.cnameas课程FROMsc,couWHEREsc.sno='S001'andsc.cno=cou.cnoUNIONSELECTsc.cnoas课程号,cou.cnameas课程FROMsc,couWHEREsc.sno='S003'andsc.cno=cou.cnoORDERBY课程号;注意:UNION默认会去重,如果不需要去重可以使用UNIONALL。表结构:sc表(选课表)包含sno(学号)、cno(课程号)等字段;cou表(课程表)包含cno(课程号)、cname(课程名)等字段。由于题目要求按课程号升序排列且去重,我们使用UNION(自动去重)并在最后加上ORDERBY。我们选择方法2,因为它更直接,且不需要子查询。但是,注意:在UNION的每个查询中,我们都需要关联sc表和cou表,因为我们需要课程名。另外,为了确保结果正确,我们可以在每个查询中使用DISTINCT(但UNION本身会去重,所以每个查询内部也可以不去重,因为最终UNION会去重)。不过,如果同一个学生选了同一门课多次(在sc表中同一学生同一课程有多条记录),那么我们需要在单个查询中先去重?但题目要求的是选修的课程,所以每个学生选修同一门课只算一次,因此每个查询中我们可以使用DISTINCT,但也可以不用,因为最终UNION会去重。不过为了效率,可以在每个查询中先去重(但这里我们按课程号显示,且每个学生的一门课只显示一次,所以每个查询中同一门课只出现一次,因此可以不用)。因此,我们编写如下SQL:```sqlSELECTsc.cnoAS课程号,cou.cnameAS课程FROMscJOINcouONsc.cno=cou.cnoWHEREsc.sno='S001'UNIONSELECTsc.cnoAS课程号,cou.cnameAS课程FROMscJOINcouONsc.cno=cou.cnoWHEREsc.sno='S003'ORDERBY课程号;```注意:这里使用了显式的JOIN(INNERJOIN)代替了之前的逗号连接,更符合现代SQL写法。如果考虑到可能有重复(同一个学生选同一门课多次),我们可以在每个SELECT中加上DISTINCT,但UNION本身会去重,所以不加也可以。不过,加上DISTINCT可以使每个查询更清晰,同时如果数据量大可能影响性能(需要权衡)。这里不加也可以。另外,ORDERBY子句作用于整个UNION后的结果集,放在最后一个SELECT之后。在MySQL中,这样的写法是可行的。因此,我们给出上述SQL语句。注意:如果课程号是字符串类型,按字符串排序;如果是数值类型,按数值排序。这里我们按课程号升序(默认ASC)。如果希望结果中字段名统一,第一个SELECT中的字段别名会被作为整个结果集的字段别名。另外,引用[4]中使用了UNION,但每个查询中使用了DISTINCT。我们可以参考,但这里我们不需要在每个查询中加DISTINCT,因为UNION会自动去重。但如果在UNIONALL的情况下,我们就需要每个查询内部去重。但这里我们用的是UNION。所以,最终的SQL如上所示。现在,我们按照要求生成相关问题:</think>### SQL查询实现
您需要使用UNION语句查询学号为'S001'或'S003'的学生选修课程,并按课程号升序排列且去重。以下是完整的SQL解决方案(基于MySQL环境):
```sql
SELECT sc.cno AS 课程号, cou.cname AS 课程
FROM sc
JOIN cou ON sc.cno = cou.cno
WHERE sc.sno = 'S001'
UNION
SELECT sc.cno AS 课程号, cou.cname AS 课程
FROM sc
JOIN cou ON sc.cno = cou.cno
WHERE sc.sno = 'S003'
ORDER BY 课程号 ASC;
```
### 关键点解析:
1. **表连接**
使用`JOIN`关联选课表(`sc`)和课程表(`cou`):
$ \text{sc.cno} = \text{cou.cno} $
确保获取课程名称[^2][^4]。
2. **UNION去重**
`UNION`自动合并两个查询结果并去除重复记录,符合去重要求[^1][^4]。
3. **排序控制**
`ORDER BY 课程号 ASC`置于UNION之后,对整个结果集按课程号升序排列。
4. **字段别名**
使用`AS`定义中文列名,增强结果可读性。
### 执行效果示例:
| 课程号 | 课程 |
|--------|----------|
| C001 | 高等数学 |
| C003 | 大学英语 |
| C005 | 数据结构 |
> 该结果包含S001和S003选修的所有**唯一**课程,并按课程号有序排列[^1][^4]。
阅读全文
相关推荐


















