4. SQL基础回顾:SELECT、WHERE、JOIN、GROUP BY、HAVING、ORDER BY 等核心语法在金融数据上的应用
在构建金融知识图谱并进行回放对比分析之前,扎实的SQL基础是必不可少的。金融数据具有高精度、强关联、时间敏感等特点,SQL作为数据查询与处理的通用语言,能够高效地从关系型数据库中提取、过滤、聚合和排序数据,为后续的知识图谱构建提供干净、结构化的数据源。本节将结合金融业务场景,回顾SQL中最核心的六大语法模块。
4.1 数据查询与过滤:SELECT + WHERE
SELECT 用于指定要查询的字段,WHERE 用于按条件过滤行记录。在金融场景中,我们经常需要从交易流水表、客户信息表或账户余额表中提取特定时间窗口或特定状态的数据。
金融案例: 查询2024年1月所有单笔交易金额超过10,000元的交易记录,并显示交易ID、账户ID、交易金额和交易时间。
-- 查询大额交易记录
SELECT
trade_id,
account_id,
trade_amount,
trade_time
FROM trade_flow
WHERE trade_time >= '2024-01-01'
AND trade_time < '2024-02-01'
AND trade_amount > 10000.00
ORDER BY trade_amount DESC;
| 语法元素 | 金融应用说明 | 常见陷阱 |
|---|---|---|
| SELECT | 选择需要的字段,避免使用 SELECT * 以减少数据传输 |
金融表字段多,* 会拉取大量无用列,影响性能 |
| WHERE | 过滤条件,支持 =、>、<、IN、BETWEEN、LIKE 等 |
对金额字段使用 BETWEEN 时注意边界值,建议用 >= 和 < |
| AND / OR | 组合多个条件,注意运算符优先级 | 建议使用括号明确逻辑,避免歧义 |
提示: 金融数据中金额字段通常以
DECIMAL(18,2) 存储,避免使用 FLOAT 或 DOUBLE 以防止精度丢失。在 WHERE 条件中直接比较时,注意数据类型一致性。
4.2 多表关联:JOIN
金融知识图谱的核心在于实体之间的关联。SQL中的 JOIN 操作用于将多个表按照关联键合并,是打通客户、账户、交易、产品等不同维度数据的关键手段。
金融案例: 将交易流水表与客户信息表关联,查询每笔交易对应的客户姓名和客户等级。
-- 内连接:仅返回匹配成功的记录
SELECT
t.trade_id,
t.trade_amount,
c.customer_name,
c.customer_level
FROM trade_flow t
INNER JOIN customer_info c
ON t.customer_id = c.customer_id
WHERE t.trade_time >= '2024-01-01';
| JOIN 类型 | 语义 | 金融场景示例 |
|---|---|---|
| INNER JOIN | 只返回两表中匹配成功的行 | 查询有交易记录的客户及其交易详情 |
| LEFT JOIN | 返回左表所有行,右表无匹配时填充 NULL | 查询所有客户及其最近的交易记录(包括无交易的客户) |
| RIGHT JOIN | 返回右表所有行,左表无匹配时填充 NULL | 较少使用,通常可用 LEFT JOIN 调换表顺序替代 |
| FULL OUTER JOIN | 返回两表所有行,无匹配时填充 NULL | 对账场景:比对两套系统中的账户余额差异 |
注意: 多表 JOIN 时务必指定表别名,并在 ON 条件中明确关联键。金融表数据量大,缺少索引的 JOIN 会导致全表扫描,严重影响查询性能。建议在关联键上建立索引。
4.3 数据聚合与分组:GROUP BY + HAVING
GROUP BY 用于将数据按一个或多个字段分组,配合聚合函数(如 SUM、AVG、COUNT、MAX、MIN)进行统计。HAVING 用于对分组后的结果进行过滤,类似于 WHERE 但作用于聚合后的数据。
金融案例: 统计2024年第一季度每个客户的总交易金额和交易笔数,并筛选出总交易金额超过50,000元的客户。
-- 按客户分组聚合,并过滤分组结果
SELECT
customer_id,
COUNT(trade_id) AS trade_count,
SUM(trade_amount) AS total_amount,
AVG(trade_amount) AS avg_amount
FROM trade_flow
WHERE trade_time >= '2024-01-01'
AND trade_time < '2024-04-01'
GROUP BY customer_id
HAVING SUM(trade_amount) > 50000.00
ORDER BY total_amount DESC;
| 语法元素 | 作用 | 金融应用示例 |
|---|---|---|
| GROUP BY | 按指定列分组,常与聚合函数配合 | 按产品代码分组统计各产品总销量 |
| HAVING | 过滤分组后的聚合结果 | 筛选出日均交易额超过100万的账户 |
| COUNT(*) | 统计行数 | 统计每个客户当月的交易笔数 |
| SUM / AVG | 求和 / 求平均值 | 计算某支股票的总成交量与均价 |
提示: WHERE 在 GROUP BY 之前执行,用于过滤原始行;HAVING 在 GROUP BY 之后执行,用于过滤分组结果。两者不可混淆。在金融风控场景中,HAVING 常用于识别异常交易模式,如短时间内高频交易。
4.4 结果排序与限制:ORDER BY + LIMIT
ORDER BY 用于对查询结果按一个或多个字段进行升序(ASC)或降序(DESC)排列。LIMIT 用于限制返回的行数,在金融数据分页展示或取 Top-N 分析中非常实用。
金融案例: 查询2024年交易金额最高的前10笔交易,并显示交易ID、客户ID和交易金额。
-- 取 Top-N 记录
SELECT
trade_id,
customer_id,
trade_amount,
trade_time
FROM trade_flow
WHERE trade_time >= '2024-01-01'
AND trade_time < '2025-01-01'
ORDER BY trade_amount DESC
LIMIT 10;
| 语法元素 | 说明 | 金融场景 |
|---|---|---|
| ORDER BY | 指定排序字段和方向,支持多字段排序 | 按交易时间降序排列,查看最新交易 |
| ASC / DESC | 升序(默认)/ 降序 | DESC 常用于金额、时间等降序排列 |
| LIMIT | 限制返回行数,常与 ORDER BY 配合 | 分页查询:LIMIT 20 OFFSET 40 获取第3页数据 |
注意: 使用 LIMIT 进行分页时,如果数据量极大(如千万级),
OFFSET 越大性能越差。金融大数据场景建议使用游标或基于索引的键集分页(Keyset Pagination)来替代传统 OFFSET 分页。
4.5 综合实战:金融交易异常检测查询
将上述语法综合运用,构建一个金融交易异常检测的查询示例。该查询用于识别在短时间内从同一账户发起多笔大额交易的异常行为。
-- 综合查询:识别高频大额交易异常
SELECT
t.account_id,
a.customer_name,
COUNT(t.trade_id) AS trade_count_1h,
SUM(t.trade_amount) AS total_amount_1h,
MAX(t.trade_time) AS last_trade_time,
MIN(t.trade_time) AS first_trade_time
FROM trade_flow t
INNER JOIN account_info a
ON t.account_id = a.account_id
WHERE t.trade_time >= NOW() - INTERVAL '1 hour'
AND t.trade_amount > 5000.00
GROUP BY t.account_id, a.customer_name
HAVING COUNT(t.trade_id) >= 3
AND SUM(t.trade_amount) > 50000.00
ORDER BY total_amount_1h DESC
LIMIT 20;
4.6 核心语法对比速查表
| 语法 | 执行阶段 | 是否可使用聚合函数 | 金融典型用途 |
|---|---|---|---|
| WHERE | GROUP BY 之前 | 否 | 过滤特定时间范围、金额阈值、状态码 |
| HAVING | GROUP BY 之后 | 是 | 筛选聚合后的统计指标,如总交易额、交易笔数 |
| ORDER BY | SELECT 之后 | 是(对别名排序) | 按交易金额、时间、风险评分排序 |
| LIMIT | 最后阶段 | 否 | 分页展示、Top-N 分析 |
总结: 掌握 SELECT、WHERE、JOIN、GROUP BY、HAVING、ORDER BY 这六大核心语法,能够覆盖金融数据查询中超过 90% 的日常需求。在后续章节中,我们将基于这些基础语法,结合金融知识图谱的实体关系模型,进行更复杂的回放对比分析。建议读者在本机数据库环境中,使用真实的金融模拟数据反复练习,直到能够熟练组合使用这些语法。