
SQL面试题目汇总.doc
5星
- 浏览量: 0
- 大小:None
- 文件类型:DOC
简介:
本文件《SQL面试题目汇总》包含了各类常见的SQL面试题及答案解析,旨在帮助求职者准备与数据库相关的技术面试。
SQL是Structured Query Language的缩写,是一种管理关系数据库的标准语言。在面试过程中,经常会涉及查询、数据操作、聚合函数、联接、子查询以及窗口函数等多个方面的SQL题目。以下是一些常见的SQL面试题及其解答方法,以帮助你更好地准备和理解。
1. **找出每门课分数都超过80分的学生姓名**:
```sql
SELECT DISTINCT name
FROM table
WHERE name NOT IN (SELECT DISTINCT name FROM table WHERE score <= 80);
```
这个问题通过使用子查询和`DISTINCT`关键字来筛选出所有至少有一门课程成绩高于80分的学生。
2. **删除重复的记录**:
```sql
DELETE FROM tablename
WHERE id NOT IN (SELECT MIN(id)
FROM tablename
GROUP BY student_id, name, course_id, course_name, score);
```
这个问题利用`GROUP BY`和`MIN()`函数来移除具有相同学号、姓名、课程编号、课程名称及分数的重复记录,只保留每组中的第一条。
3. **生成比赛组合**:
```sql
SELECT a.name, b.name
FROM department a, department b
WHERE a.name < b.name;
```
此问题通过自连接`department`表,并使用条件`a.name < b.name`来确保没有重复的比赛配对出现。
4. **对比科目发生额**:
```sql
SELECT a.*
FROM TestDB a
INNER JOIN (SELECT Occmonth, MAX(DebitOccur) AS MaxDebit101
FROM TestDB
WHERE AccID = 101
GROUP BY Occmonth) b
ON a.Occmonth = b.Occmonth AND a.DebitOccur > b.MaxDebit101;
```
首先,该问题确定科目编号为101的每个月份的最大发生额,并将其与所有记录进行比较以筛选出每个月的发生额都高于给定科目的记录。
5. **数据重塑**:
- 使用子查询的方法:
```sql
SELECT year,
(SELECT amount FROM aaa m WHERE month = 1 AND m.year = aaa.year) AS m1,
(SELECT amount FROM aaa m WHERE month = 2 AND m.year = aaa.year) AS m2,
(SELECT amount FROM aaa m WHERE month = 3 AND m.year = aaa.year) AS m3,
(SELECT amount FROM aaa m WHERE month = 4 AND m.year = aaa.year) AS m4
FROM aaa
GROUP BY year;
```
- 使用Oracle中的`LEAD()`和`RANK()`函数:
```sql
SELECT *
FROM (
SELECT name, year AS b1, LEAD(year, 1) OVER (PARTITION BY name ORDER BY year) AS b2,
LEAD(amount, 2) OVER (PARTITION BY name ORDER BY year) AS b3,
RANK() OVER (PARTITION BY name ORDER BY year) AS rk
FROM t
)
WHERE rk = 1;
```
该问题的目标是将数据从垂直格式转换为水平展示,即列转行。在Oracle中可以使用窗口函数`LEAD()`和`RANK()`来实现这一需求。
掌握这些SQL的基础知识以及高级技巧对于面试中的表现至关重要。实际的面试可能还会包括性能优化、存储过程、触发器及索引等更复杂的问题,所以持续学习并实践是必要的。
全部评论 (0)


