根据提供的信息,我们可以详细解析这些SQL面试题目以及给出的示例答案,并且深入理解每一道题目背后的原理与应用场景。 ### 風险1: 查询身份证号码为440401430103082的申请日期 #### 问题描述 此题目要求查询在`g_cardapply`表和`g_cardapplydetail`表中,身份证号码为`440401430103082`的记录对应的申请日期。 #### SQL 实现 ```sql SELECT g_applydate FROM g_cardapply t1 JOIN g_cardapplydetail t2 ON t1.g_applyno = t2.g_applyno WHERE t2.g_idcard = '440401430103082'; ``` #### 解析 这里使用了`JOIN`语句来连接两个表,通过共同的字段`g_applyno`关联两个表,然后通过`WHERE`子句筛选出特定的身份证号码,最终返回的是符合条件的申请日期。 ### 题目2: 查询同一个身份证号码有两条以上记录的身份证号码及记录个数 #### 问题描述 该题目要求找出在`g_cardapplydetail`表中,哪些身份证号码出现了两次以上的情况,并统计这些身份证号码的出现次数。 #### SQL 实现 ```sql SELECT g_idcard, COUNT(1) AS 数量 FROM g_cardapplydetail GROUP BY g_idcard HAVING COUNT(1) > 2; ``` #### 解析 通过`GROUP BY`子句按`g_idcard`分组,然后利用`COUNT()`函数统计每个身份证号码出现的次数,最后用`HAVING`子句筛选出出现次数大于2次的身份证号码。 ### 题目3: 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07 #### 问题描述 这道题目要求更新`g_cardapply`表和`g_cardapplydetail`表中身份证号码为`440401430103082`的记录的申请状态为`07`。 #### SQL 实现 ```sql UPDATE g_cardapplydetail SET g_state = '07' WHERE g_idcard = '440401430103082'; UPDATE g_cardapply t1 SET t1.g_state = '07' FROM g_cardapply t1 JOIN g_cardapplydetail t2 ON t1.g_applyno = t2.g_applyno WHERE t2.g_idcard = '440401430103082'; ``` #### 解析 第一个`UPDATE`语句直接更新`g_cardapplydetail`表中的记录;第二个`UPDATE`语句通过`JOIN`语句连接两个表,并更新`g_cardapply`表中符合条件的记录。 ### 题目4: 删除`g_cardapplydetail`表中所有姓李的记录 #### 问题描述 本题要求删除`g_cardapplydetail`表中所有姓氏为“李”的记录。 #### SQL 实现 ```sql DELETE FROM g_cardapplydetail WHERE LEFT(g_name, 1) = '李'; ``` #### 解析 这里使用了`LEFT()`函数获取`g_name`字段的第一个字符,判断是否为“李”,如果是,则删除该记录。 ### 题目2: 关系数据库查询题目 #### 问题描述 这部分涉及一个较为复杂的场景,包含三个表:学生表`S`、课程表`C`和选课表`SC`。 ### 题目2.1: 找出没有选修过“李明”老师讲授课程的所有学生姓名 #### SQL 实现 ```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.2: 列出有两门以上不及格课程的学生姓名及其平均成绩 #### SQL 实现 ```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; ``` #### 解析 首先通过子查询找出至少有两门不及格课程的学生编号,然后外层查询通过这些学生编号来显示学生姓名和平均成绩。 ### 题目2.3: 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名 #### SQL 实现 ```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 SC.SNO HAVING COUNT(DISTINCT C.CNAME) = 2 ) SC WHERE S.SNO = SC.SNO; ``` #### 解析 通过子查询找出同时选修了“1”号和“2”号课程的学生编号,然后通过这些学生编号来显示学生姓名。 ### 题目2.4: 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号 #### SQL 实现 ```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; ``` #### 解析 这里使用了多个表的连接来找出成绩高于“2”号同学的“1”号课程的学生。 ### 题目2.5: 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩 #### SQL 实现 ```sql SELECT S.SNO, S.SNAME, SC.[1号课成绩], SC.[2号课成绩] FROM S, ( SELECT SC1.SNO, [1号课成绩] = SC1.SCGRADE, [2号课成绩] = SC2.SCGRADE FROM SC SC1, SC SC2 WHERE SC1.CNO = '1' AND SC2.CNO = '2' AND SC1.SCGRADE > SC2.SCGRADE ) SC WHERE S.SNO = SC.SNO; ``` #### 解析 通过子查询找出“1”号课成绩比“2”号课成绩高的学生的学号及两门课程的成绩,再通过这些信息展示学生姓名和其他相关信息。 通过以上解析,我们可以看到这些题目涵盖了SQL的基础查询、更新、删除操作以及更高级的多表连接、子查询等技术,是很好的SQL面试准备材料。
- 粉丝: 3
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助