SQL经典面试题实战解析:去重、比赛组合与科目对比

需积分: 9 19 下载量 73 浏览量 更新于2024-12-19 收藏 110KB DOC 举报
在SQL经典面试题中,面试官经常考察候选人的基础理论知识、查询技巧以及对数据库结构的理解。以下是一些常见的面试问题及其解答: 1. **查询每门课成绩都大于80分的学生姓名**: 该问题要求找出所有没有低于80分课程的学生,可以使用子查询来实现。SQL语句如下: ``` SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT DISTINCT name FROM table WHERE fenshu <= 80); ``` 这里假设表名为`table`,字段`fenshu`表示分数。 2. **删除重复记录(除自动编号外)**: 要删除具有相同学号、姓名、课程编号和课程名称但自动编号不同的重复项,可以使用`GROUP BY`和`MIN`函数: ``` DELETE FROM tablename WHERE 自动编号 NOT IN (SELECT MIN(自动编号) FROM tablename GROUP BY 学号, 姓名, 课程编号, 课程名称, 分数); ``` 3. **部门表中的比赛组合**: 假设`department`表仅有一个字段`name`,则列出所有可能的比赛组合,可以这样设计: ``` SELECT a.name, b.name FROM teama AS a, teamb AS b WHERE a.name < b.name; ``` 这里假设`team`表有两个分支,`teama`和`teamb`,且每个表只包含球对的名字。 4. **比较TestDB数据库中科目发生额**: 查询TestDB中所有月份发生额高于科目101在相应月份发生额的科目,涉及到两个表连接和比较: ``` SELECT a.* FROM TestDB a JOIN ( SELECT Occmonth, MAX(DebitOccur) AS Debit101cur FROM TestDB WHERE AccID = '101' GROUP BY Occmonth ) b ON a.Occmonth = b.Occmonth AND a.DebitOccur > b.Debit101cur; ``` 其中`AccID`是科目代码,`Occmonth`是月份,`DebitOccur`是发生额。 5. **最后的问题是关于一个表格`yearm`,但题目没有提供具体内容,可能是关于时间范围的查询或者年度报告的筛选。如果需要解决这个问题,我们需要具体了解`yearm`表的结构和要查询的具体条件。例如,如果要找出某个年份或特定时间范围内特定事件的数据,可能会涉及`WHERE`子句和日期范围的操作。 这些问题不仅考察了SQL的基础语法,还涉及到了性能优化、关联查询、聚合函数等高级技能。候选人需具备良好的逻辑思维和实际操作能力才能应对这些面试挑战。