《SQL面试常见题》是一本专为数据库工程师和求职者设计的学习指南,汇集了面试中最常遇到的问题及其解答,帮助读者深入理解SQL语言并顺利通过技术面试。
在SQL面试中,掌握核心概念并能够解决复杂问题至关重要。以下是一些常见的SQL面试题及其解答,涉及了数据查询、去重、联接、子查询以及数据转换等多个方面:
1. **查询每门课都大于80分的学生**:
```sql
SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT DISTINCT name FROM table WHERE fenshu <= 80)
```
此查询使用了`DISTINCT`关键字去除重复的名字,并通过`NOT IN`子查询找出至少有一门课程分数低于或等于80分的学生。
2. **删除冗余信息**:
```sql
DELETE FROM tablename WHERE 自动编号 NOT IN (SELECT MIN(自动编号) FROM tablename GROUP BY 学号, 姓名, 课程编号, 课程名称, 分数)
```
这里通过`GROUP BY`和`MIN`函数删除了除了自动编号外其他字段都相同的行。
3. **比赛组合查询**:
```sql
SELECT a.name, b.name FROM team a, team b WHERE a.name < b.name
```
此查询通过自连接团队表来生成所有可能的匹配组合,确保没有重复且a队总是小于b队。
4. **查询发生额高于特定科目的科目**:
```sql
SELECT a.* FROM TestDB a, (SELECT Occmonth, MAX(DebitOccur) Debit101ccur FROM TestDB WHERE AccID=101 GROUP BY Occmonth) b
WHERE a.Occmonth = b.Occmonth AND a.DebitOccur > b.Debit101ccur
```
此查询首先找到科目101每个月的最大发生额,然后与所有科目进行比较,找出每个月发生额更高的记录。
5. **数据格式转换**:
```sql
-- Oracle 解决方案
SELECT year,
MAX(CASE WHEN month = 1 THEN amount END) AS m1,
MAX(CASE WHEN month = 2 THEN amount END) AS m2,
MAX(CASE WHEN month = 3 THEN amount END) AS m3,
MAX(CASE WHEN month = 4 THEN amount END) AS m4
FROM aaa
GROUP BY year
-- 或者使用窗口函数
SELECT year,
MAX(CASE WHEN rn = 1 THEN amount END) AS m1,
MAX(CASE WHEN rn = 2 THEN amount END) AS m2,
MAX(CASE WHEN rn = 3 THEN amount END) AS m3,
MAX(CASE WHEN rn = 4 THEN amount END) AS m4
FROM (
SELECT year, amount, ROW_NUMBER() OVER(PARTITION BY year ORDER BY month) AS rn
FROM aaa
) subquery
GROUP BY year
```
这些查询将数据转换为指定的格式,每个年份对应4个月份的金额。使用了`CASE WHEN`和`GROUP BY`或窗口函数`ROW_NUMBER()`。
在准备SQL面试时,理解这些基本查询技巧以及如何在不同场景下应用它们非常重要。此外,熟悉各种数据库系统的特性和语法差异(如Oracle、MySQL、SQL Server等),也会大大增加你的竞争力。同时,练习编写高效且可读性强的SQL代码对于优化数据库性能和解决实际问题至关重要。