MySQL: SQL基础语法入门与分类详解
最后更新:2026-08-26
SQL 是操作数据库的通用语言——学会它,你就掌握了所有关系型数据库的钥匙。
本课系统介绍 SQL 的分类和基础语法,为后续学习打下坚实基础。
1. 你将学到
- SQL 的五大分类及用途
- SELECT 基本查询语法
- SQL 注释的两种写法
- 关键字与保留字的区别
- 标识符命名规范
2. 一个分析师的真实故事
(1) 痛点:换个数据库就不会了
一个数据分析师在公司用 Oracle,跳槽后新公司用 MySQL:
"我写了 3 年 Oracle SQL,换到 MySQL 后发现有些语法不一样——ROWNUM 变成 LIMIT,SYSDATE 变成 NOW()。难道要重新学?"
其实不用——SQL 核心语法是通用的,差异只占 5%。
(2) SQL 标准的解法
SQL 是国际标准(ISO/IEC 9075),所有关系型数据库都遵循:
SQL
-- 这条 SQL 在 MySQL、PostgreSQL、Oracle、SQL Server 中都能运行
SELECT 1 + 1 AS result;
收益: 学会 SQL 标准语法,换数据库只需学 5% 的差异。
| 数据库 | 相同语法 | 差异语法 |
|---|---|---|
| MySQL | 95% | LIMIT、AUTO_INCREMENT |
| PostgreSQL | 95% | SERIAL、ILIKE |
| Oracle | 95% | ROWNUM、SYSDATE |
| SQL Server | 95% | TOP、GETDATE() |
3. SQL 五大分类
graph TB
A[SQL 语言] --> B[DDL 数据定义]
A --> C[DML 数据操作]
A --> D[DQL 数据查询]
A --> E[DCL 数据控制]
A --> F[TCL 事务控制]
B --> B1[CREATE]
B --> B2[ALTER]
B --> B3[DROP]
C --> C1[INSERT]
C --> C2[UPDATE]
C --> C3[DELETE]
D --> D1[SELECT]
E --> E1[GRANT]
E --> E2[REVOKE]
F --> F1[COMMIT]
F --> F2[ROLLBACK]
| 分类 | 全称 | 关键字 | 用途 | 危险程度 |
|---|---|---|---|---|
| DDL | Data Definition Language | CREATE/ALTER/DROP/TRUNCATE | 定义数据库结构 | ⚠️ 中 |
| DML | Data Manipulation Language | INSERT/UPDATE/DELETE | 增删改数据 | ⚠️ 中 |
| DQL | Data Query Language | SELECT | 查询数据 | ✅ 安全 |
| DCL | Data Control Language | GRANT/REVOKE | 权限管理 | 🔴 高 |
| TCL | Transaction Control Language | COMMIT/ROLLBACK/SAVEPOINT | 事务控制 | ⚠️ 中 |
(1) DDL — 数据定义语言
定义数据库的结构(库、表、索引)。
SQL
-- 创建数据库
CREATE DATABASE mydb;
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 修改表结构
ALTER TABLE users ADD COLUMN email VARCHAR(100);
-- 删除表
DROP TABLE users;
-- 清空表数据(保留结构)
TRUNCATE TABLE users;
(2) DML — 数据操作语言
操作表中的数据(增、删、改)。
SQL
-- 插入数据
INSERT INTO users (id, name) VALUES (1, 'Alice');
-- 更新数据
UPDATE users SET name = 'Bob' WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 1;
(3) DQL — 数据查询语言
从表中查询数据。
SQL
-- 查询所有字段
SELECT * FROM users;
-- 条件查询
SELECT name, email FROM users WHERE id > 10;
-- 排序查询
SELECT * FROM users ORDER BY created_at DESC;
-- 限制结果
SELECT * FROM users LIMIT 10;
(4) DCL — 数据控制语言
管理用户权限。
SQL
-- 授予权限
GRANT SELECT, INSERT ON mydb.* TO 'user'@'localhost';
-- 撤销权限
REVOKE INSERT ON mydb.* FROM 'user'@'localhost';
(5) TCL — 事务控制语言
管理事务的提交和回滚。
SQL
-- 开始事务
START TRANSACTION;
-- 执行操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 提交事务
COMMIT;
-- 或回滚事务
ROLLBACK;
4. SELECT 基础语法
(1) SELECT 完整语法结构
SQL
SELECT [DISTINCT] column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column [ASC|DESC]]
[LIMIT offset, count];
▶ 示例:基本查询
SQL
-- 查询所有字段
SELECT * FROM employees;
-- 查询指定字段
SELECT first_name, last_name, salary FROM employees;
-- 使用别名
SELECT first_name AS 名, last_name AS 姓, salary AS 薪资 FROM employees;
-- 去重查询
SELECT DISTINCT department FROM employees;
输出:
TEXT
📖 仅展示
+------+--------+---------+
| 名 | 姓 | 薪资 |
+------+--------+---------+
| John | Smith | 5000.00 |
| Jane | Doe | 6000.00 |
+------+--------+---------+
▶ 示例:条件查询
SQL
-- 等值查询
SELECT * FROM employees WHERE department = 'Engineering';
-- 范围查询
SELECT * FROM employees WHERE salary BETWEEN 4000 AND 8000;
-- 列表查询
SELECT * FROM employees WHERE department IN ('Sales', 'Marketing');
-- 模糊查询
SELECT * FROM employees WHERE first_name LIKE 'J%';
-- 空值查询
SELECT * FROM employees WHERE manager_id IS NULL;
输出:
TEXT
📖 仅展示
+-------------+-----------+--------+-------------+
| first_name | last_name | salary | department |
+-------------+-----------+--------+-------------+
| John | Smith | 5000.00| Engineering |
| Jane | Doe | 6000.00| Engineering |
+-------------+-----------+--------+-------------+
5. SQL 注释
(1) 单行注释
SQL
-- 这是单行注释(标准写法)
SELECT * FROM users; -- 查询所有用户
# 这也是单行注释(MySQL 特有)
SELECT * FROM users;
(2) 多行注释
SQL
/*
这是多行注释
可以跨越多行
常用于说明复杂查询
*/
SELECT * FROM users
WHERE status = 'active';
▶ 示例:注释的实际应用
SQL
/*
功能:查询活跃用户的统计信息
作者:Alice
日期:2026-07-03
修改记录:
- 2026-07-02 添加 email_verified 条件
- 2026-07-03 添加注册时间筛选
*/
SELECT
COUNT(*) AS total_users, -- 用户总数
AVG(age) AS avg_age, -- 平均年龄
MIN(created_at) AS earliest_reg -- 最早注册时间
FROM users
WHERE status = 'active' -- 只统计活跃用户
AND email_verified = TRUE -- 邮箱已验证
AND created_at >= '2025-01-01'; -- 2025年后注册
6. 关键字与保留字
(1) 什么是关键字
关键字是 SQL 中有特殊含义的词,如 SELECT、FROM、WHERE。
| 类型 | 说明 | 示例 |
|---|---|---|
| 关键字 | 有特殊含义,但可用作标识符(需加反引号) | order、group |
| 保留字 | 禁止用作标识符(即使加反引号也不推荐) | SELECT、TABLE |
▶ 示例:关键字冲突处理
SQL
-- 错误:order 是关键字
CREATE TABLE order (id INT);
-- 正确:使用反引号包裹
CREATE TABLE `order` (id INT);
-- 更好:避免使用关键字作为表名
CREATE TABLE orders (id INT);
7. 标识符命名规范
(1) 命名规则
| 规则 | 说明 | 示例 |
|---|---|---|
| 字符范围 | 字母、数字、下划线 | user_name ✅ |
| 首字符 | 必须是字母或下划线 | 1user ❌ |
| 长度限制 | 最长 64 个字符 | — |
| 大小写 | Windows 不敏感,Linux 敏感 | Users ≠ users(Linux) |
| 保留字 | 避免使用 | order ❌ → orders ✅ |
(2) 推荐命名风格
| 风格 | 示例 | 推荐度 |
|---|---|---|
| snake_case | user_name, order_id |
⭐⭐⭐ |
| camelCase | userName, orderId |
⭐⭐ |
| PascalCase | UserName, OrderId |
⭐ |
💡 提示: MySQL 社区推荐使用
snake_case,与官方文档风格一致。
▶ 示例:良好的命名实践
SQL
-- 好的命名
CREATE TABLE user_orders (
id INT PRIMARY KEY,
user_id INT,
order_number VARCHAR(20),
total_amount DECIMAL(10,2),
created_at TIMESTAMP
);
-- 不好的命名
CREATE TABLE t1 (
c1 INT,
c2 VARCHAR(20),
c3 DECIMAL(10,2)
);
8. SQL 语句书写规范
(1) 格式规范
SQL
-- 推荐格式:关键字大写,每行一个字段
SELECT
first_name,
last_name,
salary
FROM employees
WHERE department = 'Engineering'
ORDER BY salary DESC
LIMIT 10;
(2) 分号的重要性
SQL
-- 分号是语句结束符
SELECT * FROM users; -- 语句1
SELECT * FROM orders; -- 语句2
-- 多条语句执行时必须有分号
❓ 常见问题
Q SQL 语句必须大写吗?
A 不是必须的,但推荐关键字大写(SELECT/FROM/WHERE),提高可读性。MySQL 不区分大小写。
Q
* 和指定字段哪个好?A 生产环境推荐指定字段(性能更好、语义清晰)。学习阶段可以用
*。Q SQL 注释会影响性能吗?
A 不会。MySQL 解析器会忽略注释,注释不会执行。
Q 中文可以做表名/字段名吗?
A 技术上可以(需反引号),但强烈不推荐。用英文
user_name 而不是 用户名。Q DDL 和 DML 哪个更危险?
A DDL(DROP/ALTER)更危险——删表数据全没,改表结构可能影响应用。操作前务必备份。
📖 小节
- SQL 是操作关系型数据库的标准语言,分为 DDL/DML/DQL/DCL/TCL 五类
- DDL 定义结构(CREATE/ALTER/DROP),DML 操作数据(INSERT/UPDATE/DELETE)
- DQL 查询数据(SELECT),DCL 管理权限(GRANT/REVOKE),TCL 控制事务(COMMIT/ROLLBACK)
- SQL 注释有两种:
--单行注释和/* */多行注释 - 标识符推荐使用
snake_case,避免使用关键字 - SQL 语句以分号
;结束
📝 作业
-
基础题(难度⭐):写出创建
students表的 DDL 语句,包含 id(主键)、name(非空)、age、grade 字段。 -
进阶题(难度⭐⭐):编写一条 SELECT 语句,从 employees 表中查询工资高于 5000 且部门为 'Sales' 的员工,按工资降序排列,只显示前 5 条。
-
挑战题(难度⭐⭐⭐):编写一个完整的事务:从账户 A 转账 100 元到账户 B,包含开始事务、两条 UPDATE、提交或回滚。