大数据开发面试必背:Oracle高频面试题
·
大数据开发面试必背: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面试最高频的对比题,需从执行速度、操作类型、可回滚性等维度掌握:
| 维度 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 操作类型 | 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大类,需掌握分类及核心命令:
| 命令类型 | 英文缩写 | 核心命令 | 作用 |
|---|---|---|---|
| 数据定义语言 | DDL | CREATE/ALTER/DROP | 创建/修改/删除数据库对象(表、索引、视图) |
| 数据操纵语言 | DML | INSERT/UPDATE/DELETE | 增删改表中数据 |
| 数据查询语言 | DQL | SELECT + ORDER BY/GROUP BY | 查询数据(数据分析核心) |
| 事务控制语言 | TCL | COMMIT/ROLLBACK | 提交/回滚事务(保证数据一致性) |
| 数据控制语言 | DCL | GRANT/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(权限)。
更多推荐
所有评论(0)