SQL语法基础知识总结
语法是表达查询意图的骨架。把 SELECT-FROM-WHERE-GROUP-HAVING-ORDER 链条练熟,复杂 SQL 才能拆解。 查询骨架1234567SELECT col1, COUNT(*) AS cntFROM ordersWHERE status = 'PAID'GROUP BY col1HAVING cnt > 10ORDER BY cnt DESCLIMIT 20; 连接类型INNER JOIN 取交集;LEFT JOIN 保左表全部行;注意 JOIN 条件与过滤条件放 WHERE 还是 ON 的语义差异。 聚合与 NULLCOUNT(*) 计行;COUNT(col) 不计 NULL;AVG 忽略 NULL。GROUP BY 列需与 SELECT 非聚合列一致(ONLY_FULL_GROUP_BY)。 DML 安全UPDATE/DELETE 必带 WHERE;先用 SELECT 验证;事务包裹批量变更。 约束与完整性PRIMARY KEY、UNIQUE、NOT NULL、CHECK、FOREIGN KEY 在 DDL...
SQL常见面试题总结(1)
第一部分面试题聚焦「会不会写基础查询」。关键是理解 NULL、DISTINCT 与 LIMIT 的语义边界。 高频基础点 DISTINCT 去重全行组合,不是单列魔法。 ORDER BY 可对别名排序;NULL 默认放最前/最后因 DB 而异。 LIMIT offset, count 大 offset 性能差,改 keyset pagination。 12SELECT DISTINCT user_id FROM login_log WHERE dt = '2026-09-01';SELECT * FROM product ORDER BY price DESC, id ASC LIMIT 10; NULL 处理IS NULL / IS NOT NULL;COALESCE(col, 0) 给默认值;注意 NULL = NULL 为 UNKNOWN。 实践建议手写 10 道基础题不看答案;对照 EXPLAIN 看是否走索引。 分页模式Keyset: WHERE id > ? ORDER BY id LIMIT 20 利用索引;of...
字符集详解:字符集是什么?怎么用?
乱码和 emoji 存不进去,根因往往在字符集链路某一段不一致。搞清「字符集 vs 编码」比背命令更重要。 核心概念字符集是字符集合;编码是字符与字节的映射规则。计算机只认字节,显示什么取决于解码规则是否一致。ASCII 用 7 位有效位;中文体系经历 GB2312/GBK/GB18030;Unicode 统一码点,UTF-8/UTF-16 是常见编码实现。 MySQL 里的 utf8 陷阱MySQL 的 utf8 实际是阉割版 UTF-8,最多三字节,无法存 emoji 与部分生僻字。生产应默认 utf8mb4,并在表、列、连接层保持一致。 12CREATE DATABASE app DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;SET NAMES utf8mb4; 全链路一致客户端、连接、服务器、库、表、列六级字符集任一不一致都可能乱码。排查时从 SHOW VARIABLES LIKE 'character%' 与 SHOW CREATE TABLE 入手,...
SQL 专题:语法基础、查询、聚合、连接、子查询与常见面试题
SQL 是关系型世界的通用语言。掌握声明式查询思维,比记忆方言细节更能迁移到不同数据库。 学习路径 DDL/DML 基础与约束 过滤、排序、聚合、分组 多表连接(INNER/LEFT/RIGHT) 子查询与 EXISTS 窗口函数与常见面试题 与 MySQL 的关系SQL 是标准语言,MySQL 是具体实现。执行计划、索引、锁在 MySQL 层展开,但查询语义先按 SQL 理解。 实践建议用 small dataset 手写查询再 EXPLAIN;复杂报表优先 CTE(8.0+)提升可读性。 方言差异LIMIT/OFFSET、窗口函数、CTE 在不同数据库支持度不同。写 portable SQL 避免专有 hint。 安全参数化查询防注入;最小权限 DB 账号。 实践复习清单DDL/DML/查询/连接/窗口函数模块自检; portable SQL 意识;注入防护;复杂 SQL 先 CTE 拆解;对照 MySQL 8 特性。 常见坑 只会 ORM 不会写 JOIN。 把 HAVING 当 WHER...
数据库知识体系:SQL、MySQL、Redis、MongoDB 与 Elasticsearch
后端工程师的数据库能力往往决定系统上限。本文把关系型、缓存与 NoSQL 串成一条可执行的学习主线。 学习主线怎么排建议按「通用概念 → SQL 基本功 → MySQL 内核 → Redis 工程化 → 按需补 NoSQL」推进。先搞清 ACID、范式、索引与事务,再进入执行计划与日志;缓存部分重点理解穿透/击穿/雪崩与一致性策略,而不是死记命令。 各模块要抓什么 SQL:会写不等于会优化,连接、子查询与聚合的语义要能和执行计划对应。 MySQL:索引、隔离级别、MVCC、redo/undo/binlog 是一条链,慢 SQL 排查从这里串。 Redis:数据结构选型、持久化、阻塞排查、集群分片是面试与线上并重的高频区。 MongoDB/ES:按岗位补充,文档模型与倒排索引各自解决不同检索场景。 实践建议每学一个主题,用一个小例子验证:建表加索引看 EXPLAIN;开两个会话验证隔离级别;用 Redis 实现缓存并故意制造击穿场景。只看不练,面试和排障都容易卡壳。 常见误区 把「会用 ORM」当成「懂数据库」。 索引越多越好...
数据库基础常见面试题总结
数据库面试的第一层考的是概念是否清晰:数据、管理系统、事务与模型边界搞混,后面 MySQL 细节很难串起来。 四个层次别混用DB 是存数据的集合;DBMS 是管理数据的软件(MySQL、PostgreSQL);DBS 是硬件+软件+人+应用的系统;DBA 负责设计、备份、权限与性能。日常说「连 MySQL」其实连的是 DBMS,里面可以托管多个逻辑库。 DBMS 在干什么四大职能可以记成「定义—操作—控制—维护」:DDL 管结构,DML 管 CRUD,并发/事务/权限管正确性与安全,导入导出与备份管生命周期。SQL 只是对外接口,底层还有缓冲池、锁、日志等机制。 关系型 vs NoSQL 怎么选关系型擅长结构化数据与强一致事务;NoSQL 在水平扩展、灵活 schema、特定访问模式上更顺手。选型看访问模式与一致性要求,而不是流行度。 事务 ACID 要点原子性靠 undo,持久性靠 redo+binlog,隔离性靠锁与 MVCC,一致性是最终目标。并发下脏读、不可重复读、幻读分别对应不同隔离级别权衡。 数据模型与范式概念模型(ER)到逻辑模型(表)再到物...
动态规划面试题总结:状态转移、背包、子序列与 Java 模板
动态规划适合具有重叠子问题和最优子结构的问题。它把递归搜索中的重复状态保存下来,使每个状态只求一次。关键不在背公式,而在定义 dp 的含义:它必须足以描述后续决策所需的信息。 标准步骤是:确定状态;列出选择;写转移方程;设置边界;决定遍历顺序;判断是否能压缩空间。以台阶计数为例,若每次走一或两级,dp[i] 表示到达第 i 级的方法数,则最后一步来自 i-1 或 i-2,所以 dp[i]=dp[i-1]+dp[i-2]。 背包问题尤其依赖顺序。0/1 背包中每件物品只能使用一次,一维数组的容量必须倒序遍历,避免当前物品被重复读取;完全背包允许重复使用,容量通常正序。子序列问题常把 dp[i] 或 dp[i][j] 定义为以某位置结尾或两个前缀上的答案。 若有 S 个状态、每个状态枚举 T 个选择,时间通常为 O(ST),空间为状态表大小。记忆化搜索与自底向上 DP 在渐近复杂度上常相同:前者接近自然递归且只访问可达状态,后者无栈开销且遍历可控。 误区包括状态含义含糊、初始化与定义冲突、只写方程不说明遍历依赖、盲目空间压缩覆盖尚未使用的值,以及把所有最优化问题都套 D...
双指针与滑动窗口面试题总结:数组、链表、字符串高频模板
双指针通过两个位置共同描述搜索范围。相向指针常用于有序数组求和与回文判断;同向快慢指针适合原地去重、链表环和写入压缩;滑动窗口则维护一段连续区间及其统计量。 滑动窗口的通用步骤是右端不断纳入元素并更新计数,当窗口违反约束时移动左端并撤销影响,恢复合法后记录答案。求最短满足窗口时,合法后应尽可能收缩;求最长合法窗口时,通常在恢复合法后更新最大长度。 123456left = 0for right in [0..n): add(a[right]) while window invalid: remove(a[left]); left++ update answer with [left,right] 算法高效的原因不是只有一层循环,而是左右指针都只单调前进,最多各走 n 次,所以总时间 O(n)。窗口统计可用整数、哈希表或定长频次数组,空间由字符集或键数量决定。若元素含负数,“窗口和过大就缩小”的单调性可能消失,此时需要前缀和、单调队列等方案。 有序两数之和中,和偏小就移动左指针,偏大就移动右指针,因为有序性保证被排除位置不可能产生答案。三数之和可先排序,固定一个元...
Top K 问题面试题总结:堆、快排分区、桶计数与数据流
Top K 不是固定算法,而是“从大量元素中保留最大或最小的 K 个”。直接排序简单,时间 O(n log n);当 K 远小于 n,维护大小为 K 的堆通常更合适。 求最大的 K 个元素时使用小顶堆:先把元素加入堆,超过 K 个就弹出堆顶。堆顶始终是当前入选集合中最小者,新元素只有更大才有保留价值。每次调整 O(log K),总时间 O(n log K)、空间 O(K),并且适合数据流,因为无须保存全部输入。 快速选择利用快排分区:枢轴归位后,根据其位置只处理包含第 K 个边界的一侧。平均时间 O(n)、最坏 O(n²),随机枢轴可降低退化风险;它会修改数组,且只保证分区,不保证 Top K 内部有序。若还要求输出顺序,可再排序 K 个结果。 当值域或频次范围有限,可计数后从高到低收集,成本约 O(n+R);高频元素问题也可按频次建桶。多机海量数据可先分片求局部 Top K,再合并候选,但分片规则与热点倾斜需要额外设计。 常见误区是求最大 K 却建最大堆导致保留方向错误、默认快速选择稳定、忽略重复值及 K 越界,以及把“第 K 大”和“前 K 大且有序”混为同一输出。小结:...
剑指offer部分编程题
面试题训练的重点是把约束转换成结构。二维有序矩阵可从右上角开始:目标更小就左移,更大就下移,每一步排除一行或一列,时间 O(m+n)。链表反转维护三个指针;树的重建依靠前序确定根、中序划分左右子树。 数组旋转最小值可利用局部单调性二分,但重复值会让边界判断失去方向,此时只能保守缩小区间。栈的压入弹出序列验证,可用辅助栈模拟:按压入顺序推进,每次栈顶等于当前弹出值就持续弹出,最终全部匹配才合法。连续子数组最大和可维护“以当前位置结尾的最大和”,转移为继续累加或从当前数重新开始。 复杂度表达应对应机制:矩阵搜索不访问每个格子,而是最多移动行列之和;树重建若每次在线性查中序根会到 O(n²),用哈希表记录下标可降为 O(n);辅助栈验证为 O(n) 时间和 O(n) 空间。 解题时先复述输入、输出及空值约定,再给暴力基线,随后指出利用的有序性、重复状态或数据结构。写完应测试空输入、单元素、重复值、全负数、退化树和整数溢出。若题目允许修改输入,也要主动说明。 误区是背住某道题的代码,却无法解释边界为何移动;或者只报最终复杂度,不交代隐藏的库调用。小结:题目集合并非知识点清单,真正要练...