SQL入门完整指南

从零掌握 SELECT / INSERT / UPDATE / DELETE / JOIN 五大核心操作

📅 2026年4月6日 · 阅读约8分钟 · 数据库SQL后端开发

SQL(Structured Query Language,结构化查询语言)是与关系型数据库交互的标准语言。无论你是前端开发者想了解后端,还是后端工程师需要深入数据库,SQL都是必须掌握的基础技能。本指南将系统性地讲解SQL的五大核心操作:SELECT、INSERT、UPDATE、DELETE和JOIN,帮助你从零建立完整的SQL知识体系。

一、什么是SQL

SQL诞生于1970年代,由IBM的研究员基于E.F. Codd的关系模型理论开发。经过50多年的发展,SQL已成为数据库领域的通用语言,几乎所有主流关系型数据库(MySQL、PostgreSQL、SQL Server、Oracle、SQLite)都支持SQL标准。

SQL的核心价值在于:用声明式的方式告诉数据库"你要什么",而不是"怎么获取"。你只需要描述结果的结构和条件,数据库引擎会自动选择最优的执行路径。

二、SELECT — 数据查询

SELECT是SQL中使用最频繁的语句,用于从数据库表中检索数据。它是数据分析、报表生成和业务逻辑的基础。

2.1 基础查询

-- 查询所有列
SELECT * FROM users;

-- 查询指定列
SELECT name, email, created_at FROM users;

-- 使用别名
SELECT name AS 用户名, email AS 邮箱 FROM users;

2.2 WHERE条件过滤

-- 精确匹配
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';

2.3 排序与分页

-- 按价格降序排列
SELECT * FROM products ORDER BY price DESC;

-- 分页查询(每页10条,取第2页)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;

2.4 聚合函数与分组

-- 统计各状态订单数量
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;
💡 小贴士:WHERE在分组前过滤行,HAVING在分组后过滤组。执行顺序是:WHERE → GROUP BY → HAVING。

三、INSERT — 数据插入

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';
⚠️ 注意:INSERT操作是不可逆的(除非使用事务),执行前务必确认数据正确。

四、UPDATE — 数据更新

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';
🛡️ 安全建议:执行UPDATE前,先用相同WHERE条件执行SELECT,确认影响范围。对于关键操作,使用事务包裹:BEGIN; UPDATE ...; -- 确认无误后 COMMIT; 或 ROLLBACK;

五、DELETE — 数据删除

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 vs TRUNCATE

特性DELETETRUNCATE
速度逐行删除,较慢整表清空,极快
WHERE条件支持不支持
事务回滚支持大多数数据库不支持
自增ID重置不重置重置
触发器触发不触发

六、JOIN — 表连接查询

JOIN是SQL中最强大的功能之一,用于从多个关联表中组合数据。理解JOIN是写出高效查询的关键。

6.1 INNER JOIN(内连接)

只返回两个表中匹配的行。这是最常用的连接类型。

-- 查询订单及其对应的用户信息
SELECT o.id, o.amount, u.name, u.email
FROM orders o
INNER JOIN users u ON o.user_id = u.id;

6.2 LEFT JOIN(左连接)

返回左表所有行,右表无匹配时填充NULL。适合查找"缺失关联"的场景。

-- 查找没有下过订单的用户
SELECT u.name, u.email
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;

6.3 RIGHT JOIN(右连接)

与LEFT JOIN相反,保留右表所有行。实际开发中使用较少。

6.4 FULL OUTER JOIN(全外连接)

返回两个表的所有行,无匹配处填充NULL。MySQL不支持,需用UNION模拟。

6.5 多表连接

-- 订单 + 用户 + 商品 三表关联
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的执行顺序有助于编写正确的查询:

  1. FROM — 确定数据源(表/连接)
  2. WHERE — 行级过滤
  3. GROUP BY — 分组
  4. HAVING — 组级过滤
  5. SELECT — 选择列
  6. DISTINCT — 去重
  7. ORDER BY — 排序
  8. LIMIT/OFFSET — 分页

八、性能优化建议

🛠️ 在线SQL工具推荐

想在线练习SQL?试试我们的 SQL格式化工具,支持SQL美化、压缩和语法高亮。

常见问题(FAQ)

SQL中最常用的语句有哪些?

SQL中最常用的语句是SELECT(查询)、INSERT(插入)、UPDATE(更新)和DELETE(删除),这四条语句被称为CRUD操作,是数据库交互的基础。

JOIN有哪几种类型?

JOIN主要分为INNER JOIN(内连接,只返回匹配的行)、LEFT JOIN(左连接,保留左表所有行)、RIGHT JOIN(右连接,保留右表所有行)和FULL OUTER JOIN(全外连接,保留所有行)。

初学者应该先学MySQL还是PostgreSQL?

两者都支持标准SQL,初学者选择MySQL入门更简单(社区资源多、配置简单),而PostgreSQL在高级功能和标准合规性方面更强,适合有一定基础后深入学习。

如何防止SQL注入攻击?

防止SQL注入的最佳方法是使用参数化查询(预编译语句),避免直接拼接用户输入到SQL语句中。此外还应使用最小权限原则、输入验证和ORM框架。

WHERE和HAVING有什么区别?

WHERE在分组前过滤行,不能使用聚合函数;HAVING在GROUP BY分组后过滤组,可以使用SUM、COUNT等聚合函数。执行顺序是WHERE先于GROUP BY先于HAVING。