SQL面试精华:去冗余、比赛组合与科目对比

需积分: 9 13 下载量 129 浏览量 更新于2024-12-17 收藏 58KB DOC 举报
在SQL面试中,面试官常会提问一些关于基础操作、逻辑思维以及复杂查询的问题,以便了解应聘者的SQL语言掌握程度和问题解决能力。以下是一些常见的SQL面试题目及其解答: 1. **查询每门课成绩大于80分的学生姓名**: 题目要求找出没有低于80分课程的学生名字。通过使用`NOT IN`子句和`DISTINCT`关键字,可以避免重复列出所有学生的姓名。示例SQL语句如下: ``` SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT DISTINCT name FROM table WHERE fenshu <= 80); ``` 这个查询首先筛选出所有课程成绩小于或等于80分的学生,然后从剩余的学生中选取不同的姓名。 2. **删除冗余学生信息**: 如果有一张包含学生成绩的表,需要删除除自动编号外其他属性完全相同的重复记录,可以使用`GROUP BY`和`MIN`函数来找出每个唯一组的最小自动编号,然后删除不符合条件的记录: ``` DELETE FROM tablename WHERE 自动编号 NOT IN (SELECT MIN(自动编号) FROM tablename GROUP BY 学号, 姓名, 课程编号, 课程名称, 分数); ``` 这将确保每个唯一组合只保留一行。 3. **部门比赛组合查询**: 针对一个部门表`department`,列出所有可能的比赛组合,这里可以直接列出部门名的组合,因为只有四个部门: ``` SELECT a.name, b.name FROM teama, teamb WHERE a.name < b.name; ``` 这个查询假设`team`表中的`name`字段代表部门名,并且保证了每个部门之间的比赛。 4. **比较TestDB数据表中的发生额**: 要找出TestDB表中所有科目在特定月份的发生额高于科目101的金额,可以使用子查询来获取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; ``` 这个查询首先确定每个月101科目的最高发生额,然后与TestDB表中其他科目的发生额进行比较。 5. **处理多对多关系的表查询**: 题目最后提到“怎么把这样一个表”,但从给出的信息来看,并未提供具体的表结构,可能是缺失了部分问题。如果涉及一个多对多关系的表,比如关于比赛的表,可能需要进一步明确关联字段和查询需求。 这些SQL面试题涵盖了基础查询、数据去重、比较操作以及多表查询等常见场景,应聘者在准备此类面试时,不仅要熟悉语法,还要理解如何根据实际业务场景编写高效且可读性强的SQL语句。