作为 Java 后端开发,我们每天都在和数据库打交道。无论是构建业务逻辑还是进行性能调优,扎实的 SQL 基础都是不可或缺的。本系列博客会把重心放在有深度的技术点上,记录对开发落地真正有价值的内容。
本文将提炼 MySQL 的基础语法体系,并重点剖析日常开发和面试中最常遇到的数据查询(DQL)逻辑与核心函数。
1. DDL:数据定义与类型选择
DDL (Data Definition Language) 主要用于定义或修改数据库的结构。在创建表时,合理选择数据类型是后端开发的基本功。
核心建表语法
在实际业务开发中,几乎每一张业务表都必须具备主键。建议在建表时直接将主键与自增属性作为标准骨架:
CREATE TABLE [IF NOT EXISTS] table_name (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
column_name1 data_type [COMMENT column_options],
column_name2 data_type [COMMENT column_options],
...
) [COMMENT table_options];
数据类型选择
在实际业务开发中,数据类型的选择直接影响查询性能与存储空间:
-
字符串选择:
- CHAR:定长字符串。不会根据内容计算空间,适合存储长度固定的数据,查询效率高。
- VARCHAR:变长字符串。根据内容计算所需空间,属于“时间换空间”的做法,适合存储长度不固定的文本。
-
数值选择:
- 优先使用合适的整型(TINYINT, INT, BIGINT)。
- 如果是货币金额等需要精确计算的字段,坚决不能使用 FLOAT 或 DOUBLE,必须使用 DECIMAL 定点数类型。
-
时间选择:
- DATETIME(YYYY-MM-DD HH:MM:SS)与 TIMESTAMP 是最常用的时间类型,TIMESTAMP 会跟随系统时区自动转换。
数据类型避坑
- VARCHAR(N) 的 N 代表什么?
- N 代表的是字符数,而不是字节数(在 MySQL 5.0 之后)。这意味着不管是字母 a 还是汉字中,都只算 1 个字符。
- INT(11)中的 11 有意义吗?
- 毫无意义(在不加 ZEROFILL 属性的情况下)。INT 类型在底层永远固定占用 4 个字节,其存储的数值范围是固定的。11 仅仅代表“最大显示宽度”,不影响它实际能存储的数值大小
2. DML:数据操纵语言
DML (Data Manipulation Language) 负责对表中的数据进行增删改。
重点关注:批量插入
在处理大批量数据入库时,单条 INSERT 效率极低,推荐使用批量插入语法(注意字段顺序必须一一对应):
INSERT INTO table_name (column1, column2, ...)
VALUES
(value1, value2, ...),
(value3, value4, ...);
更新与删除的安全红线
执行 UPDATE 和 DELETE 时,务必携带 WHERE 条件,否则会导致全表数据被修改或清空:
UPDATE table_name SET column1 = value1 WHERE condition;
DELETE FROM table_name WHERE condition;
3. DQL:数据查询语言(核心重点)
DQL (Data Query Language) 是后端开发编写最多的 SQL 语句。熟练掌握查询语法的执行顺序,是写出高效 SQL 的前提。
DQL 完整语法骨架
SELECT
column1, column2, ...
FROM
table_name
[WHERE condition]
[GROUP BY column1, column2, ...]
[HAVING condition]
[ORDER BY column1 [ASC|DESC], ...]
[LIMIT offset, row_count];
核心考点:SQL 的执行顺序
我们在书写 SQL 时是从 SELECT 开始,但 MySQL 引擎底层的真实执行顺序却是:
WHERE 与 HAVING 的本质区别
这是面试中极度高频的问题:
- 执行时机:WHERE 在分组前执行,HAVING 在分组后执行。
- 条件限制:WHERE 中不能使用聚合函数,而 HAVING 中可以使用聚合函数对分组结果进行筛选。
4. 核心函数速查
在复杂业务报表和数据清洗中,熟练使用内置函数可以大幅减少 Java 代码中的逻辑处理。
字符串与日期函数
- CONCAT(str1, str2, …):字符串拼接。
- SUBSTRING(str, pos, len):截取字符串(注意:MySQL中 pos 从 1 开始,而不是 0)。
- DATE_ADD(date, INTERVAL expr unit):时间推算,常用于统计“过去7天”等业务场景。
流程控制函数(进阶必会)
在做数据统计时,这几个函数极其好用:
- 空值处理:IFNULL(value, default_value),若 value 为 NULL,则返回默认值。
- 条件判断:IF(value, true_result, false_result),类似于 Java 的三元运算符。
- 多重分支(CASE WHEN):
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result3
END
5. DCL:数据控制语言
DCL (Data Control Language) 用于管理数据库的用户和权限(通常由 DBA 负责,后端开发了解即可)。
- 创建用户:CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';(localhost 限制本地登录,% 允许远程登录)。
- 授予权限:GRANT ALL PRIVILEGES ON database_name.table_name TO 'username'@'localhost';
- 撤销权限:REVOKE ALL PRIVILEGES ON database_name.table_name FROM 'username'@'localhost';





