从零掌握 SELECT / INSERT / UPDATE / DELETE / JOIN 五大核心操作
SQL(Structured Query Language,结构化查询语言)是与关系型数据库交互的标准语言。无论你是前端开发者想了解后端,还是后端工程师需要深入数据库,SQL都是必须掌握的基础技能。本指南将系统性地讲解SQL的五大核心操作:SELECT、INSERT、UPDATE、DELETE和JOIN,帮助你从零建立完整的SQL知识体系。
SQL诞生于1970年代,由IBM的研究员基于E.F. Codd的关系模型理论开发。经过50多年的发展,SQL已成为数据库领域的通用语言,几乎所有主流关系型数据库(MySQL、PostgreSQL、SQL Server、Oracle、SQLite)都支持SQL标准。
SQL的核心价值在于:用声明式的方式告诉数据库"你要什么",而不是"怎么获取"。你只需要描述结果的结构和条件,数据库引擎会自动选择最优的执行路径。
SELECT是SQL中使用最频繁的语句,用于从数据库表中检索数据。它是数据分析、报表生成和业务逻辑的基础。
-- 查询所有列
SELECT * FROM users;
-- 查询指定列
SELECT name, email, created_at FROM users;
-- 使用别名
SELECT name AS 用户名, email AS 邮箱 FROM users;
-- 精确匹配
SELECT * FROM users WHERE status = 'active';
-- 多条件组合
SELECT * FROM orders
WHERE amount > 100 AND status = 'completed';
-- 模糊匹配
SELECT * FROM products WHERE name LIKE '%手机%';
-- 范围查询
SELECT * FROM orders WHERE created_at BETWEEN '2026-01-01' AND '2026-03-31';
-- 按价格降序排列
SELECT * FROM products ORDER BY price DESC;
-- 分页查询(每页10条,取第2页)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;
-- 统计各状态订单数量
SELECT status, COUNT(*) AS order_count
FROM orders
GROUP BY status;
-- 统计各用户总消费,只看消费超1000的用户
SELECT user_id, SUM(amount) AS total_spent
FROM orders
GROUP BY user_id
HAVING SUM(amount) > 1000;
INSERT语句用于向表中添加新数据行,是数据持久化的第一步。
-- 插入完整行
INSERT INTO users (name, email, age, status)
VALUES ('张三', 'zhangsan@example.com', 28, 'active');
-- 批量插入
INSERT INTO products (name, price, stock) VALUES
('商品A', 99.9, 100),
('商品B', 199.9, 50),
('商品C', 299.9, 30);
-- 从查询结果插入
INSERT INTO archived_orders (user_id, amount, created_at)
SELECT user_id, amount, created_at
FROM orders
WHERE created_at < '2025-01-01';
UPDATE语句用于修改表中已存在的数据。使用时一定要小心,忘记WHERE条件会导致全表更新。
-- 更新单个字段
UPDATE users SET status = 'inactive' WHERE id = 42;
-- 更新多个字段
UPDATE products
SET price = 89.9, stock = stock - 1
WHERE id = 100;
-- 基于条件批量更新
UPDATE orders
SET status = 'expired'
WHERE status = 'pending'
AND created_at < '2026-01-01';
DELETE语句用于从表中删除数据行。与UPDATE一样,WHERE条件至关重要。
-- 删除指定行
DELETE FROM users WHERE id = 42;
-- 条件批量删除
DELETE FROM logs
WHERE created_at < '2025-01-01'
AND level = 'debug';
-- 删除重复数据(保留id最小的)
DELETE FROM products
WHERE id NOT IN (
SELECT min_id FROM (
SELECT MIN(id) AS min_id FROM products GROUP BY name
) tmp
);
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 速度 | 逐行删除,较慢 | 整表清空,极快 |
| WHERE条件 | 支持 | 不支持 |
| 事务回滚 | 支持 | 大多数数据库不支持 |
| 自增ID重置 | 不重置 | 重置 |
| 触发器 | 触发 | 不触发 |
JOIN是SQL中最强大的功能之一,用于从多个关联表中组合数据。理解JOIN是写出高效查询的关键。
只返回两个表中匹配的行。这是最常用的连接类型。
-- 查询订单及其对应的用户信息
SELECT o.id, o.amount, u.name, u.email
FROM orders o
INNER JOIN users u ON o.user_id = u.id;
返回左表所有行,右表无匹配时填充NULL。适合查找"缺失关联"的场景。
-- 查找没有下过订单的用户
SELECT u.name, u.email
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
与LEFT JOIN相反,保留右表所有行。实际开发中使用较少。
返回两个表的所有行,无匹配处填充NULL。MySQL不支持,需用UNION模拟。
-- 订单 + 用户 + 商品 三表关联
SELECT o.id AS order_id,
u.name AS user_name,
p.name AS product_name,
o.amount
FROM orders o
INNER JOIN users u ON o.user_id = u.id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.status = 'completed'
ORDER BY o.created_at DESC
LIMIT 20;
理解SQL的执行顺序有助于编写正确的查询:
想在线练习SQL?试试我们的 SQL格式化工具,支持SQL美化、压缩和语法高亮。
SQL中最常用的语句是SELECT(查询)、INSERT(插入)、UPDATE(更新)和DELETE(删除),这四条语句被称为CRUD操作,是数据库交互的基础。
JOIN主要分为INNER JOIN(内连接,只返回匹配的行)、LEFT JOIN(左连接,保留左表所有行)、RIGHT JOIN(右连接,保留右表所有行)和FULL OUTER JOIN(全外连接,保留所有行)。
两者都支持标准SQL,初学者选择MySQL入门更简单(社区资源多、配置简单),而PostgreSQL在高级功能和标准合规性方面更强,适合有一定基础后深入学习。
防止SQL注入的最佳方法是使用参数化查询(预编译语句),避免直接拼接用户输入到SQL语句中。此外还应使用最小权限原则、输入验证和ORM框架。
WHERE在分组前过滤行,不能使用聚合函数;HAVING在GROUP BY分组后过滤组,可以使用SUM、COUNT等聚合函数。执行顺序是WHERE先于GROUP BY先于HAVING。