常用 SQL 语句速查
更新于 2026年8月14日
适用人群:需要读写数据库、编写查询语句的站长与开发者。
核心概念
基础增删改查(CRUD)
-- 查
SELECT id, name FROM users WHERE status = 1 ORDER BY id DESC LIMIT 20 OFFSET 0;
-- 增
INSERT INTO users (name, email) VALUES ('张三', '[email protected]');
-- 改
UPDATE users SET status = 0 WHERE id = 10;
-- 删
DELETE FROM users WHERE id = 10;
条件与模糊匹配
| 需求 | 写法 |
|---|---|
| 范围 | WHERE age BETWEEN 18 AND 60 |
| 集合 | WHERE city IN ('北京','上海') |
| 模糊 | WHERE name LIKE '张%' |
| 空值 | WHERE deleted_at IS NULL |
实际示例
多表 JOIN
SELECT o.id, u.name, o.amount
FROM orders o
INNER JOIN users u ON u.id = o.user_id -- 内连接:两边都有
LEFT JOIN coupons c ON c.order_id = o.id -- 左连接:保留左表
WHERE o.created_at >= '2026-01-01';
聚合与分组
SELECT user_id, COUNT(*) AS cnt, SUM(amount) AS total
FROM orders
GROUP BY user_id
HAVING SUM(amount) > 1000 -- 分组后过滤用 HAVING
ORDER BY total DESC;
索引与事务
-- 为高频查询列建索引
CREATE INDEX idx_orders_user ON orders(user_id);
-- 事务(要么全成功要么全回滚)
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 出错时用 ROLLBACK;
常见错误
- ⚠️`WHERE` 条件里对索引列使用函数或前置通配 `LIKE '%x'`,导致索引失效、全表扫描
- ⚠️`UPDATE` / `DELETE` 忘写 `WHERE`,一次性改 / 删全表数据
- ⚠️把过滤条件写进 `HAVING` 而非 `WHERE`,聚合前该过滤的没过滤,性能变差
对应工具
常见问题
WHERE 和 HAVING 有什么区别?
`WHERE` 在分组聚合之前对原始行过滤;`HAVING` 在 `GROUP BY` 聚合之后对分组结果过滤,通常配合聚合函数使用。
LIMIT 分页数据量大时很慢怎么办?
深分页(大 OFFSET)会扫描并丢弃大量行,可改用“基于上一页最后一个 id 的游标分页”(WHERE id < 上次最小 id LIMIT n)来优化。
相关教程
相关文章
官方资料来源