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

发布时间:2026/6/16 17:13:14
【数据库】模块二:SQL 语句、高级特性与优化 一、 SQL 语言四大分类 (Data Language Classification)银行笔试常以“下列哪个命令属于 DDL/DCL”的形式进行概念考查。必须熟练掌握下表的归类分类全称核心职能常用关键字 / 命令笔试避坑点DDLData Definition Language数据定义语言操纵表结构、索引、视图等元数据不触及具体行数据。CREATE,DROP,ALTER,TRUNCATETRUNCATE属于 DDL。它通过释放存储页来清空全表速度极快不走事务日志无法回滚。DMLData Manipulation Language数据操作语言对表内的具体行数据进行增、删、改。INSERT,UPDATE,DELETEDELETE属于 DML。它逐行删除会写入事务日志Redo/Undo Log可以回滚。DQLData Query Language数据查询语言从数据库中检索、查询数据。SELECT数据库中使用频率最高、也是笔试算法/编写题的核心。DCLData 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;不等于操作符会让优化器大概率认为扫描全表的代价比走索引更低从而放弃索引