在数据仓库与大数据时代,掌握 SQL 是成为进入数据开发岗位的基础技能。数据仓库(Data Warehouse)是一种专门用于存储大量历史数据以支持分析的系统,而 SQL(Structured Query Language)则是与数据库对话的标准语言,用于查询、插入、更新和删除数据。对于从事数仓、数据开发的工程师来说,熟练使用 SQL 很重要,是开展工作的必备工具。
本文围绕 SQL 基础知识和数据库基本概念展开,总结常见考点和实用技巧,帮助读者在校招面试和日常开发中快速查阅、温故知新。
一、数据库与SQL基本概念
- 数据库(Database):数据的有序集合,是由数据库管理系统(DBMS)加以管理的数据容器。常见的关系型数据库包括 MySQL、Oracle、SQL Server 等,它们以表的形式组织数据。
- 数据库管理系统(DBMS):用于建立、使用和维护数据库的大型软件系统,为用户提供数据定义、查询、更新和控制等功能,帮助管理数据的存储和访问。
- 关系型数据库:基于关系模型的数据库,通过二维表(行和列)来存储数据。表(Table)是数据存储的基本结构,由若干列组成,每一行(元组)代表一条记录,每列(属性)代表记录的一个特征。表与表之间可以通过键建立关联关系(如一对多、多对多等)。
- 主键(Primary Key):用于唯一标识表中一条记录的字段或字段组合,具有非空、唯一的特性。每个表应有且仅有一个主键,可采用自增整数等方式实现唯一性。
- 外键(Foreign Key):用于建立两表之间关联关系的字段,在子表中存储着父表主键的值。外键可以重复且允许为空,一个表可以有多个外键。通过主键-外键关联,SQL 查询能够将多张表JOIN连接起来获取更多信息。
- 事务(Transaction):数据库执行操作序列的基本单位,满足 ACID 四大特性(⭐️ 面试高频):原子性 – 要么全部执行要么全不执行;一致性 – 事务前后数据库满足所有完整性约束;隔离性 – 并发事务互不干扰;持久性 – 事务一旦提交,对数据的修改就是永久的。事务通常用于保证一组数据库操作的完整性,如银行转账操作等。
- 数据库范式(Normalization):良好的数据库设计应满足一定范式以减少冗余和异常。常见的范式有三种:
- 第一范式(1NF)要求属性不可再分割,每个字段原子性不可拆分;
- 第二范式(2NF)要求在 1NF 基础上消除非主属性对主键的一部分依赖,确保每个非主属性完全依赖主键;
- 第三范式(3NF)进一步要求消除非主属性对主键的传递依赖,从而避免数据冗余和更新、删除异常。一般业务库的表设计达到 3NF 即被认为设计合理。
📝 说明:以上概念是学习 SQL 和数据库的基础术语,理解这些概念有助于和团队沟通数据库方案,也有助于后续对索引、查询优化等进阶主题的理解。
二、SQL 语言分类
SQL 作为数据库操作语言,按照功能大致可分为以下几类fanruan.com:
- DQL(Data Query Language)查询语言:用于查询数据库中的记录,典型操作是
SELECT
查询语句。 - DDL(Data Definition Language)定义语言:用于定义数据库对象,例如创建或修改库、表、视图等结构,典型语句有
CREATE
、DROP
、ALTER
等。 - DML(Data Manipulation Language)数据操作语言:用于对数据库表中的数据进行增删改查操作,典型语句有
INSERT
、UPDATE
、DELETE
等。 - DCL(Data Control Language)数据控制语言:用于定义访问权限和安全级别,例如用户授权与权限收回,典型语句有
GRANT
、REVOKE
等。
🔹 Tip:有些资料中会单独将 SELECT
查询归为 DQL,以强调查询在 SQL 中的重要作用。面试中通常会问到上述分类以及对应的典型语句,建议熟记常用命令所属类型。
三、SQL 基本语法示例
下面通过一个简单示例演示 SQL 基本语法,包括创建表、插入/更新/删除数据,以及基本查询操作。为了直观起见,我们以一个学生信息表为例:
创建表 (DDL 示例):定义一个名为 Students
的表,包含学号、姓名和年龄字段,其中学号为主键。
CREATE TABLE
Students ( id INT PRIMARY
KEY, name VARCHAR(50
), age INT
);
插入数据 (DML 示例):向表中插入一条学生记录(学号、姓名、年龄)。
INSERT INTO
Students (id, name, age) VALUES (1, 'Alice', 20
);
更新数据 (DML 示例):将学号为 1 的学生年龄修改为 21。
UPDATE
Students SET age = 21
WHERE id = 1
;
删除数据 (DML 示例):删除学号为 1 的学生记录。
DELETE FROM
Students WHERE id = 1
;
查询数据 (DQL 示例):查询年龄大于等于 18 岁的学生姓名和年龄。
SELECT
name, age FROM
Students WHERE age >= 18
;
上述示例涵盖了 SQL 的核心操作:定义表结构(DDL)、增删改数据(DML)以及基本的查询(DQL)。在练习中,可以使用本地安装的 MySQL 或者在线 SQL 执行环境来运行这些语句,加深理解。
四、常用查询操作示例
实际工作中,数据查询(DQL)是 SQL 使用最频繁的部分。下面总结一些常用的查询操作和示例:
- 选择筛选(SELECT + WHERE):从表中筛选符合条件的记录。例如查询年龄大于 18 的学生:
SELECT * FROM Students WHERE age > 18;
- 投影列控制:只选取所需的列返回结果。例如查询学生的姓名和年龄:
SELECT name, age FROM Students;
- 消除重复(DISTINCT):去除查询结果中的重复值。例如获取所有不同的姓名:
SELECT DISTINCT name FROM Students;
- 排序(ORDER BY):按指定字段排序结果集,默认升序。例按年龄降序列出学生:
SELECT * FROM Students ORDER BY age DESC;
- 模糊查询(LIKE):使用通配符进行匹配查询。例查找姓名以 "A" 开头的学生:
SELECT * FROM Students WHERE name LIKE 'A%';
- 聚合计算(GROUP BY):按类别分组并对每组应用聚合函数。例统计不同年龄的人数:
SELECT age, COUNT(*) FROM Students GROUP BY age;
(可结合HAVING
子句筛选分组结果,如HAVING COUNT(*) > 1
筛选人数大于1的年龄组) - 多表连接(JOIN):将多个表按关联键合并查询。例假设有
Enrollments
(记录学生选课) 表,查询每个学生选课列表:SELECT
S.name, E.courseFROM
Students SJOIN
Enrollments EON S.id =
E.student_id;
上述为内连接(INNER JOIN)示例,只返回两表匹配的记录。左连接(LEFT JOIN)则会保留左表未匹配的记录、右连接(RIGHT JOIN)保留右表未匹配记录。 - 子查询(Subquery):在查询中嵌入另一查询结果。例查询选修了 "数学" 课程的学生名单(假设选课表中 course 列存课程名):
SELECT
nameFROM
StudentsWHERE id IN
(SELECT
student_idFROM
EnrollmentsWHERE course = '数学'
); - 分页限制(LIMIT):在结果集较大时,只取前 N 条或指定区间的记录。例获取前 10 条学生记录:
SELECT * FROM Students LIMIT 10;
(此为 MySQL 方言,在 Oracle 中可用ROWNUM
或 ANSI SQLFETCH FIRST N
实现)
⭐️ 说明:以上查询操作如连接查询、聚合分组等是面试与实战中的高频内容,尤其是 JOIN 连表查询 和 子查询 的应用需要重点掌握。建议读者在理解语法的基础上,多练习常见业务场景的 SQL 查询,如“查询每个班级的最高分学生”、“统计各部门员工数量”等,以应对笔试面试中可能的算法查询题。
五、面试高频问题速查
本节汇总一些数据库与 SQL 方向的高频面试问题,并给出要点提示,方便快速复习。面试时建议先给出定义或区别点,再结合实际场景简单说明。
1. 主键和外键有什么区别?(⭐️ 基础)
- **主键(Primary Key)**用于唯一标识表的一条记录,不可重复且不可为 NULL。一个表只能有一个主键,可以由单列或多列组合构成。
- **外键(Foreign Key)**用于引用另一张表的主键,表示表与表之间的关联关系。外键值可以重复,也可以为 NULL,一个表可以定义多个外键。外键约束可确保引用完整性(即子表中的值必须先在父表出现)。
面试关注点:主键侧重唯一性和约束性,外键侧重引用关系。在实际开发中,有些互联网公司出于性能和解耦考虑,会禁用数据库层的外键约束,转而在应用层保证数据一致。
2. DROP、TRUNCATE 和 DELETE 有何区别?(⭐️ 高频)
SQL 中三种删除操作的作用对象和特性不同,具体区别如下:
比较项 | DROP | TRUNCATE | DELETE |
---|---|---|---|
类别 | DDL (定义语言) | DDL (定义语言) | DML (操作语言)javaguide.cn |
操作范围 | 删除整张表(结构和数据) | 清空表数据,保留表结构 | 删除表中符合条件的行(可全删仅数据) |
是否可回滚 | 否(即刻生效,不可恢复) | 否(即刻生效,不可恢复) | 是(事务提交前可回滚) |
自增计数处理 | 不适用(表被删除) | 重置自增计数从头开始 | 不重置自增计数 |
触发器影响 | 不执行触发器 | 不执行触发器 | 会触发逐行的 DELETE 触发器 |
执行速度 | 最快(直接释放存储空间) | 较快(不记录日志)javaguide.cn | 相对最慢(逐行删除,记录日志) |
以上表格可见:DROP
和 TRUNCATE
属于 DDL 操作,执行后自动提交且不能回滚,也不会触发删除行的触发器;而 DELETE
是 DML 操作,需要显式提交事务才能生效,执行过程会记录日志(方便事后回滚),因此单次大量删除效率相对较低。不过在使用上,DELETE
可以按条件删除部分数据,而 TRUNCATE
只能清空整表数据,DROP
则用于删除整个表对象。实际应用中,应根据需求选择:删除特定记录用 DELETE,清空表数据用 TRUNCATE,删除表结构用 DROP。
3. 数据库为什么不建议使用外键与级联删除?(⭐️ 了解)
在大型项目中,出于性能和维护性的考虑,一些规范(例如阿里巴巴开发手册)不推荐使用数据库外键约束和级联删除。主要原因包括:
- 性能因素:外键约束会在插入、更新、删除时检查关联完整性,在高并发场景下可能成为性能瓶颈。级联删除会放大删除操作影响范围,可能拖慢删除速度。
- 解耦考虑:依赖外键的级联操作隐式地耦合了表与表之间的逻辑。当删除操作跨越多个表时,不易控制和追踪,给维护带来困难。取消数据库层面的级联,由应用程序显式控制删除流程,可以使业务逻辑更清晰。
- 迁移扩展:没有外键约束的数据库在做数据迁移、分库分表时更灵活,避免复杂的约束关系阻碍拆分。
面试关注点:此问题考察的是对实际开发中设计取舍的理解。回答时可以先解释外键/级联的作用,再说明大型系统中为何出于性能和维护考虑选择在程序而非数据库层面保证数据一致性。
4. 什么是存储过程?有什么优缺点?(✅ 扩展)
存储过程是预先编译并存储在数据库中的一组 SQL 语句的集合,相当于数据库端的函数。开发者可以调用存储过程来执行复杂操作,避免多次发送单条 SQL 语句,实现逻辑重用和封装。例如,一个银行转账存储过程可包含扣款和存款两个步骤,确保两个操作要么都成功要么都失败。
- 优点:减少网络传输(一次调用执行多条语句)、提高执行性能(预编译优化)、封装复杂逻辑、提高安全性(可赋予过程权限控制对表的操作)。
- 缺点:可移植性差(不同数据库语法差异)、调试困难、过度使用可能导致业务逻辑下移到数据库造成维护复杂。
面试关注点:存储过程并非初级开发必须掌握,但了解其概念有助于展示知识深度。可简单提及其作用及适用场景,例如批量数据处理、复杂业务逻辑运算等。
六、进阶拓展学习建议
基础打牢后,可进一步拓展数据库和 SQL 的知识广度与深度,以下方向值得继续学习:
- ✅ 索引与优化:深入理解数据库索引结构(B+树等)和优化查询的方法。索引能大幅提升查询性能,是面试常考点,建议掌握索引的原理、类型及使用场景,并了解慢查询优化、执行计划 (
EXPLAIN
) 分析等技巧。 - ✅ SQL 高级特性:学习窗口函数(Window Function)、公用表表达式(CTE)、视图和触发器等高级用法。这些特性在复杂报表和数据分析中非常实用,掌握后能编写更简洁高效的 SQL 查询。
- ✅ 事务与锁机制:在理解 ACID 基础上,进一步学习事务的隔离级别(READ COMMITTED 等)以及数据库的锁机制(行锁、表锁、乐观锁/悲观锁)。这些概念在保证并发一致性和性能调优中非常关键,也是大型应用不可回避的话题。
- ✅ 数据库设计与范式优化:学习更高级的数据库范式(BCNF, 4NF)以及在实际中如何灵活运用范式和反范式。掌握数据库设计步骤(需求分析→概念模型→逻辑模型→物理实现),并结合实际考虑分区、分库分表、中间表等设计手段来应对海量数据。
- ✅ 了解新型数据库:在掌握关系型数据库的基础上,可拓展了解 NoSQL 数据库(如 Redis、MongoDB)和 NewSQL 技术,以及分布式数据库框架。这有助于扩大技术视野,在面试中展示对不同数据存储方案的理解。
- ✅ 项目实战与刷题:最后,多进行项目实践和题目练习。比如参与实际的数据分析或后端项目,编写 SQL 报表;使用 LeetCode、牛客等平台的 SQL 题目进行练习。实战经验能够将理论转化为解决问题的能力,帮助在面试编程题中脱颖而出。
希望这篇总结能够帮助你夯实 SQL 和数据库的入门基础。在求职面试中,既要熟练掌握常用语法和概念,也要理解其背后的原理和实际应用场景。祝愿大家学有所成,顺利踏上数据库与大数据开发的职业之路!
**参考资料:**
SQL 基础教程、
JavaGuide 数据库知识总结、
CSDN 博客等公开内容。
Comments