大数据开发面试必背:Oracle高频面试题(核心21问·完结篇)

本文聚焦Oracle面试最后6大高频考点,涵盖同比/环比计算、逻辑运算符、删除语句区别、SQL命令分类、权限管理、大数据量删除优化,结合代码示例+图形对比+实战场景,帮你吃透面试核心考点。

一、面试高频:同比&环比(计算+区别+场景)

这是数据岗/Oracle面试的经典题,需掌握定义、SQL实现、区别及适用场景,是数据分析的核心技能。

1. 核心定义与公式(面试必背)

指标定义计算公式核心作用
环比相邻上一个周期比较(如本月vs上月、本季度vs上季度)环比增长率 = (本期值 - 上期值) / 上期值 × 100%分析短期趋势(如月度销售波动)
同比去年同期比较(如2024年3月vs2023年3月、2024Q1vs2023Q1)同比增长率 = (本期值 - 去年同期值) / 去年同期值 × 100%分析长期趋势(如年度业务增长)

2. SQL实现(基于LAG函数,面试必考)

以「2010-2023年咖啡价格数据」为例(表名:COFFEE_PRICE,字段:year、month、price):

-- 第一步:准备测试数据(模拟月度咖啡价格)
CREATE TABLE COFFEE_PRICE (
  year NUMBER(4),
  month NUMBER(2),
  price NUMBER(5,2) -- 咖啡价格(美元/磅)
);
INSERT INTO COFFEE_PRICE VALUES (2023, 1, 1.2);
INSERT INTO COFFEE_PRICE VALUES (2023, 2, 1.3);
INSERT INTO COFFEE_PRICE VALUES (2023, 3, 1.25);
INSERT INTO COFFEE_PRICE VALUES (2024, 1, 1.4);
INSERT INTO COFFEE_PRICE VALUES (2024, 2, 1.5);
INSERT INTO COFFEE_PRICE VALUES (2024, 3, 1.45);

-- 第二步:计算环比+同比增长率
SELECT 
  year,
  month,
  price,
  -- 环比:取上一个月的价格(LAG偏移1)
  LAG(price, 1) OVER(ORDER BY year, month) AS last_month_price,
  ROUND((price - LAG(price, 1) OVER(ORDER BY year, month)) / LAG(price, 1) OVER(ORDER BY year, month) * 100, 2) AS mom_growth, -- 环比增长率
  -- 同比:取去年同月的价格(LAG偏移12)
  LAG(price, 12) OVER(ORDER BY year, month) AS last_year_price,
  ROUND((price - LAG(price, 12) OVER(ORDER BY year, month)) / LAG(price, 12) OVER(ORDER BY year, month) * 100, 2) AS yoy_growth -- 同比增长率
FROM COFFEE_PRICE
ORDER BY year, month;

3. 可视化对比(环比vs同比趋势)

基于上述SQL结果,用Matplotlib绘制趋势图,直观展示差异:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sqlalchemy import create_engine

# 连接Oracle
engine = create_engine("oracle+cx_oracle://scott:tiger@localhost:1521/ORCL")

# 读取SQL结果
sql = """
SELECT 
  year,
  month,
  price,
  LAG(price, 1) OVER(ORDER BY year, month) AS last_month_price,
  ROUND((price - LAG(price, 1) OVER(ORDER BY year, month)) / LAG(price, 1) OVER(ORDER BY year, month) * 100, 2) AS mom_growth,
  LAG(price, 12) OVER(ORDER BY year, month) AS last_year_price,
  ROUND((price - LAG(price, 12) OVER(ORDER BY year, month)) / LAG(price, 12) OVER(ORDER BY year, month) * 100, 2) AS yoy_growth
FROM COFFEE_PRICE
ORDER BY year, month;
"""
df = pd.read_sql(sql, engine)

# 数据处理(填充空值)
df["mom_growth"].fillna(0, inplace=True)
df["yoy_growth"].fillna(0, inplace=True)
# 生成时间标签
df["date"] = df["year"].astype(str) + "-" + df["month"].astype(str).str.zfill(2)

# 绘图
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(12, 6))

# 绘制环比、同比增长率折线
x = np.arange(len(df["date"]))
plt.plot(x, df["mom_growth"], label="环比增长率(%)", color="red", marker="o")
plt.plot(x, df["yoy_growth"], label="同比增长率(%)", color="blue", marker="s")

# 美化
plt.xlabel("时间")
plt.ylabel("增长率(%)")
plt.title("咖啡价格环比vs同比增长率对比")
plt.xticks(x, df["date"], rotation=15)
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig("mom_yoy_growth.png", dpi=300, bbox_inches="tight")
plt.show()

图形说明:环比曲线波动大(反映短期价格变化),同比曲线更平稳(反映长期价格趋势),2024年1月同比增长率显著高于环比(因2024年1月价格对比2023年1月涨幅大,对比2023年12月涨幅小)。

4. 区别与适用场景(面试必答)

维度环比同比
对比周期相邻周期(月/周/季度)去年同期(月/季度/年)
数据特征波动大,反映短期变化波动小,反映长期趋势
适用场景月度销售监控、短期策略调整(如咖啡月度定价)年度业绩评估、长期战略规划(如咖啡年度产销计划)
优势及时发现短期异常(如某月份价格暴跌)规避季节因素干扰(如咖啡旺季/淡季)

二、面试基础:逻辑运算符执行顺序

1. 优先级(面试必背)

NOT(非) > AND(与) > OR(或)

面试坑点:若未掌握优先级,易写出逻辑错误的SQL,需用括号显式指定执行顺序!

2. 用法+示例

-- 1. NOT:取反(常搭配IS NULL/IS NOT NULL)
SELECT * FROM COFFEE_PRICE WHERE price IS NOT NULL; -- 筛选价格非空的数据

-- 2. AND:多条件同时成立
SELECT * FROM COFFEE_PRICE WHERE year = 2024 AND month = 3; -- 2024年3月数据

-- 3. OR:至少一个条件成立
SELECT * FROM COFFEE_PRICE WHERE month = 1 OR month = 12; -- 1月或12月数据

-- 优先级示例(易错点)
-- 未加括号:先执行AND,再执行OR → 2024年所有数据 + 2023年3月数据
SELECT * FROM COFFEE_PRICE WHERE year = 2024 OR year = 2023 AND month = 3;
-- 加括号:先执行OR,再执行AND → 2024/2023年3月数据
SELECT * FROM COFFEE_PRICE WHERE (year = 2024 OR year = 2023) AND month = 3;

三、面试核心:Delete/Truncate/Drop 区别

这是Oracle面试最高频的对比题,需从执行速度、操作类型、可回滚性等维度掌握:

维度DELETETRUNCATEDROP
操作类型DML(数据操纵语言)DDL(数据定义语言)DDL(数据定义语言)
执行速度慢(逐行删除,记录日志)快(清空表,不记录行日志)最快(删除整个对象)
可回滚性可回滚(事务未提交时)不可回滚(立即释放空间)不可回滚(彻底删除)
操作对象表中指定行(可加WHERE)表中所有行(清空表)表/视图/索引等对象(删除结构+数据)
自增序列不重置重置(Oracle需配合序列)序列随表删除
触发器触发不触发触发器随表删除
适用场景删除指定行(如删除2020年之前的价格数据)清空整表(如重置测试数据)删除整个表(如废弃的历史表)

代码示例

-- 1. DELETE:删除2020年之前的数据(可回滚)
DELETE FROM COFFEE_PRICE WHERE year < 2020;
ROLLBACK; -- 可恢复删除的数据

-- 2. TRUNCATE:清空整表(不可回滚)
TRUNCATE TABLE COFFEE_PRICE;

-- 3. DROP:删除表(不可回滚)
DROP TABLE COFFEE_PRICE;

四、面试基础:Oracle SQL命令分类

Oracle SQL按功能分为5大类,需掌握分类及核心命令:

命令类型英文缩写核心命令作用
数据定义语言DDLCREATE/ALTER/DROP创建/修改/删除数据库对象(表、索引、视图)
数据操纵语言DMLINSERT/UPDATE/DELETE增删改表中数据
数据查询语言DQLSELECT + ORDER BY/GROUP BY查询数据(数据分析核心)
事务控制语言TCLCOMMIT/ROLLBACK提交/回滚事务(保证数据一致性)
数据控制语言DCLGRANT/REVOKE授予/回收用户权限

示例

-- DDL:创建表
CREATE TABLE COFFEE_PRICE (year NUMBER(4), month NUMBER(2), price NUMBER(5,2));
-- DML:插入数据
INSERT INTO COFFEE_PRICE VALUES (2024, 3, 1.45);
-- DQL:查询数据
SELECT * FROM COFFEE_PRICE WHERE year = 2024;
-- TCL:提交事务
COMMIT;
-- DCL:授予权限
GRANT CONNECT TO test_user;

五、面试高频:Oracle权限管理(授予/回收)

1. 核心权限集合(面试必背)

  • CONNECT:基本连接权限(登录数据库)
  • RESOURCE:程序开发权限(创建表、索引等)
  • DBA:数据库管理权限(最高权限,慎用)

2. 授予/回收权限(代码示例)

-- 1. 创建用户(前置操作)
CREATE USER test_user IDENTIFIED BY 123456;

-- 2. 授予权限
GRANT CONNECT, RESOURCE TO test_user; -- 授予连接+开发权限
GRANT SELECT ON COFFEE_PRICE TO test_user; -- 授予查询指定表的权限

-- 3. 回收权限
REVOKE RESOURCE FROM test_user; -- 回收开发权限
REVOKE SELECT ON COFFEE_PRICE FROM test_user; -- 回收表查询权限

六、面试重难点:Oracle大数据量删除优化

当表数据量达百万/千万级时,直接DELETE会导致锁表、性能卡顿,需掌握以下优化方案:

优化方案操作方式适用场景代码示例
优先用TRUNCATE替代DELETE清空整表需删除全表数据TRUNCATE TABLE COFFEE_PRICE;
加WHERE+索引精准筛选删除行,利用索引加速仅删除部分数据CREATE INDEX idx_year ON COFFEE_PRICE(year);
DELETE FROM COFFEE_PRICE WHERE year < 2020;
分批删除每次删除少量数据,释放锁资源需删除大量数据(如千万级)```sql
DECLARE
v_rows NUMBER := 10000; – 每次删除1万行
BEGIN
WHILE v_rows = 10000 LOOP
DELETE FROM COFFEE_PRICE WHERE year < 2020 AND ROWNUM <= 10000;
v_rows := SQL%ROWCOUNT;
COMMIT; -- 每批提交

END LOOP;
END;
/

| 非高峰期执行 | 避开业务高峰(如凌晨) | 核心业务表删除 | 结合定时任务(DBMS_JOB)执行删除脚本 |
| 先备份后删除 | 备份待删除数据到临时表 | 重要数据删除 | `CREATE TABLE COFFEE_PRICE_2020_BACKUP AS SELECT * FROM COFFEE_PRICE WHERE year < 2020;` |

### 优化核心原则(面试必答)
1. 避免全表扫描:通过索引缩小删除范围;
2. 减少锁竞争:分批删除+及时提交;
3. 优先DDL(TRUNCATE):清空表时比DML(DELETE)快10倍以上;
4. 数据安全:重要数据删除前必须备份。

## 总结
1. 同比/环比是数据岗核心考点:环比用LAG偏移1,同比用LAG偏移12,环比看短期、同比看长期;
2. Oracle删除操作:DELETE(可回滚)、TRUNCATE(清空表)、DROP(删对象),速度:DROP > TRUNCATE > DELETE;
3. 大数据量删除优化:优先TRUNCATE,分批删除,加索引,非高峰期执行;
4. SQL命令分5类:DDL(建表)、DML(改数据)、DQL(查数据)、TCL(事务)、DCL(权限)。

更多推荐