SQLSERVER面试:查询学员与课程信息

5星 · 超过95%的资源 需积分: 49 171 下载量 147 浏览量 更新于2024-08-02 2 收藏 211KB DOC 举报
"SQLSERVER数据库面试题及答案" 在SQL Server数据库面试中,常常会涉及到一些复杂的查询技巧,这里我们分析并解答几个与之相关的题目。 题目1: 此题旨在找出选修了“税收基础”课程的学员的学号和姓名。正确的方法是使用嵌套查询,先从`C`和`SC`表中找出选修了该课程的学号,然后在`S`表中查找对应的学员信息。代码如下: ```sql SELECT SN, SD FROM S WHERE [S#] IN (SELECT [S#] FROM C, SC WHERE C.[C#] = SC.[C#] AND CN = N'税收基础') ``` 题目2: 这道题要求找出选修课程编号为'C2'的学员姓名和所属单位。同样使用嵌套查询,从`S`和`SC`表中匹配出对应的信息: ```sql SELECT S.SN, S.SD FROM S, SC WHERE S.[S#] = SC.[S#] AND SC.[C#] = 'C2' ``` 题目3: 题目3是找出没有选修课程编号为'C5'的学员姓名和所属单位。这可以通过`NOT IN`操作符来实现,排除在`SC`表中选修了'C5'课程的学生: ```sql SELECT SN, SD FROM S WHERE [S#] NOT IN (SELECT [S#] FROM SC WHERE [C#] = 'C5') ``` 题目4: 这是一个比较复杂的问题,要求查询选修了所有课程的学员姓名和所属单位。网上流传的答案是错误的,因为它试图通过RIGHT JOIN来获取没有选修课程的学生,但正确的做法应该是找到那些选修的课程数量等于总课程数量的学生。这是修正后的正确答案: ```sql SELECT SN, SD FROM S WHERE [S#] IN (SELECT SC.S# FROM SC RIGHT JOIN C ON SC.C# = C.C# GROUP BY SC.S# HAVING COUNT(DISTINCT SC.C#)) -- 注意:去除重复课程记录 = (SELECT COUNT(*) FROM C) -- 注意:比较选修的课程总数是否等于所有课程数 ``` 这些题目展示了SQL Server中如何处理复杂的联接、子查询以及聚合函数的应用。在面试中,能够熟练掌握并应用这些技术,对于数据库管理员或开发者的角色来说至关重要,因为它们直接影响到数据查询的效率和准确性。在实际工作中,理解并优化这样的查询可以帮助提高数据库性能,减少资源消耗。