常用 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)来优化。

相关教程

相关文章

官方资料来源