SQL 语法全景图:从增删改查到高级查询实战指南
SQL(Structured Query Language)是操作关系型数据库的标准语言。无论你使用的是 MySQL、PostgreSQL、Oracle 还是 SQL Server,掌握核心 SQL 语法都是后端开发、数据分析甚至运维工程师的必备技能。
本文将带你系统梳理 SQL 的常用语法,从基础 CRUD 到高级查询技巧,助你写出高效、可维护的数据库操作语句。
一、DDL:定义数据库结构
DDL(Data Definition Language)用于定义或修改数据库对象(表、索引、视图等)。
-- 创建表
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 修改表(添加字段)
ALTER TABLE users ADD COLUMN age INT;
-- 删除表
DROP TABLE users;
建议:生产环境避免直接 DROP,可先 RENAME 备份。
二、DML:操作数据记录
DML(Data Manipulation Language)用于对表中数据进行增、删、改。
- 插入数据(INSERT)
-- 插入指定字段
INSERT INTO users (name, email, age) VALUES ('张三', 'zhangsan@example.com', 25);
-- 批量插入
INSERT INTO users (name, email) VALUES
('李四', 'lisi@example.com'),
('王五', 'wangwu@example.com');
-
更新数据(UPDATE)
-- 注意加 WHERE,否则全表更新!
UPDATE users SET age = 26 WHERE name = '张三'; -
删除数据(DELETE)
-- 软删除更安全(推荐用 status 字段标记)
DELETE FROM users WHERE id = 1;
-- 清空表(保留结构)
TRUNCATE TABLE users; -- 比 DELETE 快,但不可回滚
三、DQL:查询数据(最常用!)
DQL(Data Query Language)以 SELECT 为核心,支持复杂条件筛选与聚合分析。
- 基础查询
-- 查询所有字段
SELECT * FROM users;
-- 查询指定字段 + 别名
SELECT id, name AS username FROM users;
-
条件过滤(WHERE)
SELECT * FROM users
WHERE age > 18 AND email LIKE '%@example.com'; -
排序与分页
-- 排序(DESC 降序)
SELECT * FROM users ORDER BY created_at DESC;
-- 分页(MySQL 语法)
SELECT * FROM users LIMIT 10 OFFSET 20; -- 第3页,每页10条
-
聚合函数
SELECT
COUNT(*) AS total_users,
AVG(age) AS avg_age,
MAX(created_at) AS latest_user
FROM users; -
分组统计(GROUP BY)
-- 统计各年龄段人数
SELECT age, COUNT(*) AS count
FROM users
GROUP BY age
HAVING count > 1; -- HAVING 过滤分组结果
注意:WHERE 过滤原始行,HAVING 过滤分组后的结果。
四、多表关联查询
当数据分散在多个表中时,需通过 JOIN 关联查询。
示例:用户表(users) + 订单表(orders)
-- 内连接:只返回匹配的记录
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接:保留左表所有记录
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id; -- 即使无订单也显示用户
-- 子查询:查询有订单的用户
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders);
建议:优先使用 JOIN 而非子查询,性能通常更好。
五、高级技巧:提升查询效率
-
索引优化
-- 为高频查询字段建索引
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_name_age ON users(name, age); -- 联合索引
遵循最左前缀原则:(name, age) 索引支持 WHERE name=... 或 WHERE name=... AND age=...,但不支持 WHERE age=...。 -
避免 SELECT *
只查需要的字段,减少网络传输和内存占用。 -
使用 EXPLAIN 分析执行计划
EXPLAIN SELECT * FROM users WHERE email = 'xxx';
查看是否命中索引(type=ref 或 range 为佳),避免 ALL(全表扫描)。
六、事务控制(ACID 保障)
确保一组操作要么全部成功,要么全部失败。
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
-- 若中间出错,执行 ROLLBACK
-- 否则提交
COMMIT;
默认情况下,MySQL 的 InnoDB 引擎支持事务;MyISAM 不支持。
结语
SQL 看似简单,但写好并不容易。
一条低效的查询可能拖垮整个系统,而一个合理的索引或 JOIN 策略却能让性能提升十倍。
建议:
开发时开启慢查询日志;
复杂查询先用 EXPLAIN 分析;
避免在代码中拼接 SQL(防注入),优先使用预编译(如 MyBatis 的 #{})。
掌握这些核心语法,你不仅能完成日常 CRUD,更能写出高性能、可维护的数据库操作逻辑。

浙公网安备 33010602011771号