【数据库】模块二:SQL 语句、高级特性与优化

一、 SQL 语言四大分类 (Data Language Classification)

银行笔试常以"下列哪个命令属于 DDL/DCL?"的形式进行概念考查。必须熟练掌握下表的归类:

分类 全称 核心职能 常用关键字 / 命令 笔试避坑点
DDL Data Definition Language 数据定义语言 操纵表结构、索引、视图等元数据(不触及具体行数据)。 CREATE, DROP, ALTER, TRUNCATE TRUNCATE 属于 DDL 。它通过释放存储页来清空全表,速度极快,不走事务日志,无法回滚。
DML Data Manipulation Language 数据操作语言 对表内的具体行数据进行增、删、改。 INSERT, UPDATE, DELETE DELETE 属于 DML 。它逐行删除,会写入事务日志(Redo/Undo Log),可以回滚。
DQL Data Query Language 数据查询语言 从数据库中检索、查询数据。 SELECT 数据库中使用频率最高、也是笔试算法/编写题的核心。
DCL Data Control Language 数据控制语言 管理数据库用户权限、安全级别与访问控制。 GRANT (赋权), REVOKE (回收权限) 银行项目上线或外包人员进场时,权限严格管控必用 DCL。

二、 数据库高级特性:视图与索引

1. 视图 (View) --- 虚拟表

  • 定义 :视图是一张虚拟表 ,其自身并不在磁盘上存储真实数据。它仅在系统字典中保存一段 SELECT 语句的定义,数据在运行时动态生成。

  • 核心作用(银行应用场景):

    • 安全性(字段隔离):隐藏敏感数据。例如,前台柜员只能访问包含"客户姓名、尾号、余额"的视图,而屏蔽包含"密码哈希、身份证号"的原表字段。

    • 简化查询 :将涉及十几张表、上百行关联条件的复杂 JOIN 语句封装为视图,后续开发只需 SELECT * FROM view_name。

2. 索引 (Index) --- 数据目录

  • 定义 :索引是一种排好序的高效获取数据的数据结构 (在 InnoDB 中主要是 B+ 树)。

  • 代价 :空间换时间。

    • 优势:大幅提升数据检索(SELECT)和排序(ORDER BY)的性能。

    • 劣势:降低了写(INSERT / UPDATE / DELETE)的效率,因为每次数据变动都需要动态调整 B+ 树结构;同时会占用额外的磁盘空间。

三、 多表连接查询 (SQL JOINS)

多表联查是银行笔试中 SQL 编写题和结果集判断题的必考点。

1. 内连接 (INNER JOIN)

  • 机制 :只返回两张表中完全满足连接条件的交集记录。

  • 特点:如果左表的某条记录在右表中找不到匹配项(或反之),该记录直接被过滤。

2. 左外连接 (LEFT JOIN / LEFT OUTER JOIN)

  • 机制 :以左表为基准,完整返回左表的所有记录。

  • 特点 :如果右表没有匹配的记录,则结果集中属于右表的字段全部填充为 NULL。

  • 银行常考场景 :查询"开户后从未办理过网银业务的客户列表"(WHERE 右表.id IS NULL)。

3. 右外连接 (RIGHT JOIN)

  • 机制 :与左外连接对称,以右表为基准 ,完整返回右表所有记录,左表未匹配处补 NULL。

4. 全外连接 (FULL JOIN)

  • 机制 :返回左右两表的所有记录。匹配成功的合并同行,匹配失败的单侧补 NULL。

  • 注 :MySQL 原生不支持 FULL JOIN,笔试中若需实现,通常采用 LEFT JOIN ... UNION ... RIGHT JOIN 的组合拳。

四、 SQL 性能优化:索引失效的"六大毒瘤"

在海量金融交易场景下,SQL 优化直接决定系统生死。笔试最爱考"下列哪个操作会导致全表扫描(索引失效)"。

⚠️ 金科玉律:只要对索引列进行了"加工"或"破坏了其物理顺序",索引即告失效!

1. 违背最左前缀法则

  • 场景 :建立了复合索引 (a, b, c)。

  • 失效 :查询条件中跳过了前缀。如 WHERE b = 1 或 WHERE c = 2(索引完全失效);WHERE a = 1 AND c = 2(仅 a 走索引,c 不走)。

2. 在索引列上进行运算或调用函数

  • ❌ 错误(失效) :WHERE YEAR(create_time) = 2026; 或 WHERE age - 1 = 29;

    • 正确(有效) :WHERE create_time >= '2026-01-01' AND create_time <= '2026-12-31';

3. 隐式类型转换(类型不匹配)

  • 场景 :银行卡号 card_no 字段在设计时为字符串类型(VARCHAR)。

  • ❌ 错误(失效) :WHERE card_no = 62220212345678; (传入了数值型,数据库底层会自动调用函数对列进行转换)

    • 正确(有效) :WHERE card_no = '62220212345678';

4. 模糊查询中通配符 % 开头

  • ❌ 错误(失效) :WHERE name LIKE '%明'; 或 WHERE name LIKE '%明%'; (无法利用 B+ 树的有序性,必走全表扫描)

    • 正确(有效) :WHERE name LIKE '张%'; (属于范围查询,索引有效)

5. 在 WHERE 子句中使用 OR 连接未索引列

  • 场景 :age 有索引,但 phone 没有索引。

  • ❌ 错误(失效) :WHERE age = 18 OR phone = '13800000000'; (由于 phone 必须全表扫描,引擎会直接放弃 age 的索引,整体变更为全表扫描)

6. 使用不等于判断 (!= 或 <>)

  • ❌ 错误(一般失效) :WHERE status != 'CLOSED'; (不等于操作符会让优化器大概率认为扫描全表的代价比走索引更低,从而放弃索引)
相关推荐
这个DBA有点耶4 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G4 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备4 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远4 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
2601_962218614 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren4 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安4 天前
MySQL-触发器
数据库·mysql
白远山4 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro4 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理
2603_965148114 天前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘