sqlserver,有两张表:学生表(学号、姓名)、课程表(课程号、学号) 现在要查询选修课程号为K002的学生的学号、姓名,请使用普通子查询、相关子查询、使用exists关键字的相关子查询三种方式)
时间: 2023-08-06 14:01:44 浏览: 59
1. 普通子查询:
```
SELECT 学号, 姓名
FROM 学生表
WHERE 学号 IN (SELECT 学号 FROM 课程表 WHERE 课程号 = 'K002')
```
2. 相关子查询:
```
SELECT 学号, 姓名
FROM 学生表
WHERE 学号 IN (SELECT 学号 FROM 课程表 WHERE 学号 = 学生表.学号 AND 课程号 = 'K002')
```
3. EXISTS关键字的相关子查询:
```
SELECT 学号, 姓名
FROM 学生表
WHERE EXISTS (SELECT 1 FROM 课程表 WHERE 课程表.学号 = 学生表.学号 AND 课程号 = 'K002')
```
以上三种方式都可以实现查询选修课程号为K002的学生的学号、姓名。区别在于语法和执行效率。其中,相关子查询和EXISTS关键字的相关子查询可能更加高效。
相关问题
sqlserver,有一张学生作业表,有3列:课程号、学号、成绩。同一个学号可能会对应多个课程号,如何查询没有选修课程号K001和K002的学生的学号、成绩,请用子查询
可以使用子查询和 NOT IN 来查询没有选修课程号 K001 和 K002 的学生的学号和成绩,SQL语句如下:
```
SELECT 学号, 成绩
FROM 学生作业表
WHERE 学号 NOT IN (
SELECT 学号
FROM 学生作业表
WHERE 课程号 IN ('K001', 'K002')
)
```
这个子查询会先找出选修了课程号 K001 或 K002 的学生,然后外层查询使用 NOT IN 找出没有选修这些课程的学生。
SQL Server查询至少选修了课程号为C001、E002和X003三门课(可多于这三门)的学生学号和姓名。
可以使用如下的SQL查询语句来实现:
```sql
SELECT S.学号, S.姓名
FROM 学生 S
INNER JOIN 选课 C ON S.学号 = C.学号
WHERE C.课程号 IN ('C001', 'E002', 'X003')
GROUP BY S.学号, S.姓名
HAVING COUNT(DISTINCT C.课程号) >= 3
```
解释一下这条SQL查询语句的具体含义:
- `SELECT S.学号, S.姓名`:表示我们要查询的结果中包括学号和姓名两列。
- `FROM 学生 S INNER JOIN 选课 C ON S.学号 = C.学号`:表示我们要从学生表和选课表中获取数据,并且通过学号这一列进行内连接。
- `WHERE C.课程号 IN ('C001', 'E002', 'X003')`:表示我们要筛选出选修了C001、E002和X003三门课的所有选课记录。
- `GROUP BY S.学号, S.姓名`:表示我们要按照学号和姓名两列进行分组。
- `HAVING COUNT(DISTINCT C.课程号) >= 3`:表示我们要筛选出选修课程数目大于等于3门的学生,这里使用了`COUNT`函数来计算每个学生选修的课程数量,同时使用`DISTINCT`关键字去重,避免同一个学生重复计算。