快速掌握 MySQL 语法
示例表说明
user用户表:id(主键自增), username, phone, create_time, is_deletedorder_info订单表:id(主键自增), user_id, amount, goods_name, status, create_time
一、查询 SELECT
基础语法
sql
SELECT 字段列表
FROM 表名
[WHERE 条件]
[GROUP BY 分组字段]
[HAVING 聚合过滤条件]
[ORDER BY 排序字段 [ASC|DESC]]
[LIMIT 偏移量,条数];
DISTINCT:去重ASC:升序(默认),DESC:降序- LIMIT:
LIMIT 偏移量,条数,偏移从 0 开始
连表查询语法
sql
-- 内连接 INNER JOIN,两边匹配上才出结果
SELECT 字段
FROM 表1
INNER JOIN 表2 ON 关联条件;
SELECT u.username, o.amount
FROM user u
INNER JOIN order_info o ON u.id = o.user_id;
-- 左连接 LEFT JOIN,左表全部保留,右表匹配不到为NULLSELECT 字段
SELECT 字段
FROM 表1
LEFT JOIN 表2 ON 关联条件;
SELECT u.username, o.amount
FROM user u
LEFT JOIN order_info o ON u.id = o.user_id;
-- 右连接 和 左连接一样 只是把左边改成了右边 一般不使用这个
-- 有需要直接使用左连接 可读性更高
SELECT 字段
FROM 表1
RIGHT JOIN 表2 ON 关联条件;
条件查询 WHERE
sql
-- 比较运算
SELECT id, username
FROM user
WHERE id > 10;
-- IN:匹配列表中的任意值
SELECT id, username
FROM user
WHERE id IN (1, 2, 3);
-- BETWEEN:闭区间范围
SELECT id, amount
FROM order_info
WHERE amount BETWEEN 100 AND 500;
-- LIKE:模糊匹配,% 表示任意字符
SELECT id, username
FROM user
WHERE username LIKE '张%';
-- IS NULL / IS NOT NULL:判断空值
SELECT id, username
FROM user
WHERE phone IS NULL;
聚合与分组
sql
-- 常用聚合函数
SELECT COUNT(*) AS 总行数 FROM user;
SELECT MAX(amount) AS 最高金额 FROM order_info;
SELECT AVG(amount) AS 平均金额 FROM order_info;
-- GROUP BY:按字段分组统计
SELECT user_id, SUM(amount) AS 消费总额
FROM order_info
GROUP BY user_id;
-- HAVING:过滤分组后的结果(WHERE 过滤行,HAVING 过滤组)
SELECT user_id, COUNT(*) AS 订单数
FROM order_info
GROUP BY user_id
HAVING COUNT(*) >= 2;
-- 统计每个用户订单数量 total_money>200
SELECT
u.id,
u.username,
COUNT(o.id) AS order_count,
SUM(o.amount) AS total_money
FROM user u
LEFT JOIN order_info o ON u.id = o.user_id
GROUP BY u.id, u.username
HAVING SUM(o.amount) > 200;
排序与分页
sql
-- 按创建时间倒序
SELECT id, username, create_time
FROM user
ORDER BY create_time DESC;
-- 多字段排序
SELECT id, user_id, amount
FROM order_info
ORDER BY user_id ASC, amount DESC;
-- 分页:LIMIT 偏移量, 条数(偏移从 0 开始)
SELECT id, username
FROM user
ORDER BY id
LIMIT 0, 10; -- 第 1 页,每页 10 条
SELECT id, username
FROM user
ORDER BY id
LIMIT 10, 10; -- 第 2 页
子查询与合并
sql
-- 子查询:查询下单金额最高的用户名
SELECT username FROM user
WHERE id = (
SELECT user_id FROM order_info
ORDER BY amount DESC
LIMIT 1
);
-- UNION:合并两个结果集(去重),UNION ALL 不去重
SELECT username FROM user
UNION
SELECT goods_name FROM order_info;
二、新增 INSERT
单条插入
sql
-- 指定字段插入
INSERT INTO user (username, phone, create_time)
VALUES ('张三', '13800138000', NOW());
-- 全字段插入可省略字段列表(值的顺序必须与表结构一致)
INSERT INTO user
VALUES (NULL, '李四', '13900139000', NOW(), 0);
批量插入
sql
-- 一次插入多行,性能更好
INSERT INTO user (username, phone, create_time)
VALUES
('王五', '13700137000', NOW()),
('赵六', '13600136000', NOW());
-- 将查询结果插入另一张表
INSERT INTO backup_user (id, username, phone)
SELECT id, username, phone
FROM user
WHERE create_time >= '2026-01-01';
三、修改 UPDATE
基础语法
sql
UPDATE 表名
SET 字段1 = 值1, 字段2 = 值2
[WHERE 条件]
示例
sql
-- 修改单条记录:务必带 WHERE 没有WHERE会全表修改
UPDATE user
SET phone = '13500135000'
WHERE id = 1;
-- 批量修改
UPDATE user
SET phone = CONCAT(phone, '_old')
WHERE create_time < '2025-01-01';
-- 根据另一张表的数据更新
UPDATE order_info o
INNER JOIN user u ON o.user_id = u.id
SET o.status = 2
WHERE u.is_deleted = 1;
四、删除 DELETE
基础语法
sql
DELETE FROM 表名
[WHERE 条件]
示例
sql
-- 删除单条记录:务必带 WHERE
DELETE FROM user WHERE id = 100;
-- 按条件批量删除
DELETE FROM user
WHERE create_time < '2024-01-01';
- 不带
WHERE会删除整张表的数据,务必小心。 - 生产环境更推荐「逻辑删除」:用
UPDATE user SET is_deleted = 1 WHERE id = ?代替物理删除,数据可恢复、可审计。
关键字执行顺序
FROM → JOIN → WHERE → GROUP BY → 聚合计算 → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT