【SQL面试题详解】 在SQL面试中,对数据库查询能力的考察是重点。以下是对给定的SQL查询题目的详细解析: ### 常见查询一 #### 1. 找出没有选修过“李明”老师讲授课程的所有学生姓名 此题通过`NOT EXISTS`子查询实现。首先在子查询中找出选修了“李明”老师课程的学生,然后在外层查询中排除这些学生。代码如下: ```sql SELECT SNAME FROM S WHERE NOT EXISTS ( SELECT * FROM SC, C WHERE SC.CNO = C.CNO AND CNAME = '李明' AND SC.SNO = S.SNO ) ``` #### 2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩 此题先找出不及格课程超过一门的学生学号,再与学生表和选课表联接,计算平均成绩。代码如下: ```sql SELECT S.SNO, S.SNAME, AVG_SCGRADE = AVG(SC.SCGRADE) FROM S, SC, ( SELECT SNO FROM SC WHERE SCGRADE < 60 GROUP BY SNO HAVING COUNT(DISTINCT CNO) >= 2 ) A WHERE S.SNO = A.SNO AND SC.SNO = A.SNO GROUP BY S.SNO, S.SNAME ``` #### 3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名 此题通过`GROUP BY`和`HAVING`子句筛选满足条件的学生。代码如下: ```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 ``` #### 4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号 通过两层嵌套子查询,比较同一学生在两门课程的成绩。代码如下: ```sql SELECT S.SNO, S.SNAME FROM S, ( SELECT SC1.SNO 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 ``` #### 5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩 在上一个问题的基础上,进一步显示具体成绩。代码如下: ```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 ``` ### 常见查询二 #### 1. 使用标准 SQL 嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名 通过内连接查询,找到选修了特定课程的学生。代码如下: ```sql SELECT SN, SD FROM S WHERE [S#] IN ( SELECT [S#] FROM C, SC WHERE C.[C#] = SC.[C#] AND CN = N'税收基础' ) ``` #### 2. 使用标准 SQL 嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位 直接联接查询,筛选出选修特定课程的学生。代码如下: ```sql SELECT S.SN, S.SD FROM S, SC WHERE S.[S#] = SC.[S#] AND SC.[C#] = 'C2' ``` #### 3. 使用标准 SQL 嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位 使用`NOT IN`子句排除选修特定课程的学生。代码如下: ```sql SELECT SN, SD FROM S WHERE [S#] NOT IN ( SELECT [S#] FROM SC WHERE [C#] = 'C5' ) ``` #### 4. 使用标准 SQL 嵌套语句查询选修全部课程的学员姓名和所属单位 使用右连接和聚合函数`COUNT(*)`来查找选修所有课程的学生。代码如下: ```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#]) ) ``` #### 5. 查询选修了课程的学员人数 计算不同学号的数量,即学员人数。代码如下: ```sql SELECT 学员人数 = COUNT(DISTINCT [S#]) FROM SC ``` #### 6. 查询选修课 未提供完整问题,但通常会要求列出所有学生选修的课程或统计每门课程的选修人数。例如,列出每个学生选修的课程,可以这样写: ```sql SELECT S.S#, S.SN, S.SD, C.CN FROM S, SC, C WHERE S.[S#] = SC.[S#] AND SC.[C#] = C.[C#] ``` 或者统计每门课程的选修人数: ```sql SELECT C.CN, 选修人数 = COUNT(DISTINCT SC.[S#]) FROM C, SC WHERE C.[C#] = SC.[C#] GROUP BY C.CN ``` 这些题目涵盖了SQL中的基本查询、联接、子查询、聚合函数以及分组操作,对于理解SQL查询逻辑和优化非常重要。在实际面试中,面试官可能会根据这些基础题进行扩展,考察更复杂的查询场景,如分页查询、性能优化、窗口函数等。
剩余13页未读,继续阅读
- 粉丝: 3
- 资源: 15
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助