SQL面试精华:DBA总结的高频问题与实战技巧

需积分: 9 2 下载量 184 浏览量 更新于2024-07-23 收藏 169KB DOC 举报
在SQL面试中,DBA面试者可能会被问到一系列关于数据库管理和优化的问题,这包括基本的SQL语法、查询技巧以及数据库设计原则。以下是一些典型的问题及解答,供你参考: 1. **多条件筛选查询**: 题目要求找出每门课成绩都大于80分的学生姓名。这个问题需要使用`NOT IN`子句来排除那些成绩未达标准的学生。SQL语句如下: ``` SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT DISTINCT name FROM table WHERE fenshu <= 80); ``` 这里的关键是理解如何使用`DISTINCT`关键字避免重复结果,并通过子查询排除特定条件的结果。 2. **删除冗余记录**: 需要删除除自动编号外其他字段完全相同的重复记录。SQL语句使用`MIN`函数结合`GROUP BY`来找出每个组的最小自动编号,然后删除其他编号不匹配的记录: ``` DELETE FROM tablename WHERE 自动编号 NOT IN (SELECT min(自动编号) FROM tablename GROUP BY 学号, 姓名, 课程编号, 课程名称, 分数); ``` 3. **组合比赛记录**: 对于部门表,要求列出所有球对之间的比赛组合。题目提供的SQL语句已经是一个基本的解决方案,通过比较两个部门表的name字段来创建组合: ``` SELECT a.name, b.name FROM teama, teamb WHERE a.name < b.name; ``` 这个查询假设表中每个部门只有一个球对,并且每个球对的名字不会重复。 4. **比较不同科目发生额**: 题目中要求找出TestDB数据表中某个科目(如101)在每月发生额低于其他科目的情况。SQL语句使用子查询获取101科目的最大发生额,然后与TestDB中的其他科目对比: ``` 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 ``` 这里通过`JOIN`操作和嵌套子查询来完成比较。 5. **复杂表结构查询**: 最后一个问题涉及一个包含年月和金额的表,但没有给出完整的表结构。如果需要查询特定科目在所有月份中发生额高于另一个科目(比如101)的科目,需要明确表的列名。假设表名为`YearMonthAmount`,则可能的SQL语句类似: ``` SELECT a.AccID, a.Occmonth, a.Amount FROM YearMonthAmount a LEFT JOIN ( SELECT Occmonth, Max(DebitOccur) AS Debit101 FROM YearMonthAmount WHERE AccID = '101' GROUP BY Occmonth ) b ON a.Occmonth = b.Occmonth AND a.Amount > b.Debit101 WHERE a.AccID != '101'; ``` 这里假设`Amount`列存储发生额,`AccID`是科目代码。 这些面试题涵盖了SQL查询的基本技能、数据去重、关联查询和条件比较等重要知识点,能够帮助你在面试中展示你的数据库管理能力。在实际面试中,可能还需要根据具体的表结构和需求进行调整。