根据给定文件中的标题、描述、标签以及部分内容,我们可以总结出以下关于SQL Server经典习题的知识点:
### SQL Server经典习题概览
SQL Server作为一款流行的关系型数据库管理系统,其经典习题集旨在帮助学习者掌握SQL语言的核心概念与实践技巧。这些习题涵盖了SQL查询、数据操作、连接与子查询等多个方面,是提高SQL技能的理想资源。
### 习题解析与示例
#### 1. 查询选修特定课程的学生姓名和部门
```sql
SELECT SN, SD FROM S
WHERE [S#] IN (
SELECT [S#] FROM C, SC
WHERE C.[C#] = SC.[C#]
AND CN = N'特定课程名'
)
```
此习题展示了如何通过子查询与表连接找出选修特定课程的学生信息。
#### 2. 查询选修了课程号为C2的学生姓名和部门
```sql
SELECT S.SN, S.SD FROM S, SC
WHERE S.[S#] = SC.[S#]
AND SC.[C#] = 'C2'
```
这里使用了表之间的连接来筛选出特定课程的选课学生信息。
#### 3. 查询未选修课程号为C5的学生姓名和部门
```sql
SELECT SN, SD FROM S
WHERE [S#] NOT IN (
SELECT [S#] FROM SC
WHERE [C#] = 'C5'
)
```
本习题通过`NOT IN`子句排除了选修特定课程的学生,从而找到未选该课程的学生信息。
#### 4. 查询选修了所有课程的学生姓名和部门
```sql
SELECT SN, SD FROM S
WHERE [S#] IN (
SELECT [S#] FROM SC RIGHT JOIN C ON SC.[C#] = C.[C#]
GROUP BY [S#]
HAVING COUNT(*) = COUNT([S#])
)
```
这里使用了`RIGHT JOIN`和聚合函数来找出那些选修了所有可选课程的学生。
#### 5. 查询选课人数
```sql
SELECT 学生数 = COUNT(DISTINCT [S#]) FROM SC
```
这个简单的查询利用`COUNT`与`DISTINCT`计算了不同学生的总数。
#### 6. 查询选课超过5门的学生姓名和部门
```sql
SELECT SN, SD FROM S
WHERE [S#] IN (
SELECT [S#] FROM SC
GROUP BY [S#]
HAVING COUNT(DISTINCT [C#]) > 5
)
```
通过`GROUP BY`和`HAVING`子句,找出选课超过5门的学生。
### 扩展习题:复杂查询与多表关联
#### 1. 找出没有选修某老师课程的学生
```sql
SELECT SNAME FROM S
WHERE NOT EXISTS (
SELECT * FROM SC, C
WHERE SC.CNO = C.CNO
AND CNAME = '某老师'
AND SC.SNO = S.SNO
)
```
这里利用`NOT EXISTS`来判断是否学生选修了特定老师的课程。
#### 2. 计算特定课程的学生平均成绩
```sql
SELECT S.SNO, S.SNAME, AVG_SCGRADE = AVG(SC.SCGRADE) FROM S, SC
WHERE S.SNO = A.SNO AND SC.SNO = A.SNO
GROUP BY S.SNO, S.SNAME
```
此习题通过`GROUP BY`和`AVG`函数计算特定课程的学生平均成绩。
#### 3. 找出同时选修了两门特定课程的学生
```sql
SELECT S.SNO, S.SNAME FROM S, (
SELECT SC.SNO FROM SC, C
WHERE SC.CNO = C.CNO
AND C.CNAME IN ('课程1', '课程2')
GROUP BY SNO
HAVING COUNT(DISTINCT CNO) = 2
) SC
WHERE S.SNO = SC.SNO
```
使用嵌套查询与`GROUP BY`及`HAVING`条件,找出同时选修了两门特定课程的学生。
#### 4. 找出一门课程成绩高于另一门课程成绩的学生及其成绩对比
```sql
SELECT S.SNO, S.SNAME, SC.[课程1成绩], SC.[课程2成绩] FROM S, (
SELECT SC1.SNO, [课程1成绩] = SC1.SCGRADE, [课程2成绩] = SC2.SCGRADE
FROM SC SC1, C C1, SC SC2, C C2
WHERE SC1.CNO = C1.CNO AND C1.NAME = '课程1'
AND SC2.CNO = C2.CNO AND C2.NAME = '课程2'
AND SC1.SCGRADE > SC2.SCGRADE
) SC
WHERE S.SNO = SC.SNO
```
此查询涉及多表连接与成绩比较,以找出在一门课程中表现优于另一门课程的学生,并显示他们的成绩对比。
### Oracle认证计划(OCP)习题概览
除了SQL Server的经典习题,文件中还提到了Oracle认证计划(OCP)的相关习题,例如使用Oracle序列生成唯一标识符、执行基本的CRUD操作等,这些都是深入学习数据库管理与开发所必需的基础技能。
通过以上习题解析与示例,我们可以看出,无论是SQL Server还是Oracle数据库系统,其经典习题都旨在锻炼学习者的SQL语言理解和应用能力,覆盖了从基础查询到复杂数据操作的多个层面。通过实践这些习题,学习者可以加深对数据库结构、查询优化、数据完整性等方面的理解,进而提升自己的数据库管理和编程技能。