快速掌握 MySQL 语法

快速掌握 MySQL 语法

示例表说明

  • user 用户表:id(主键自增), username, phone, create_time, is_deleted
  • order_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

相关推荐
数字新视界3 小时前
一体化机柜在数据中心运维中的创新应用与优势分析
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
IT_陈寒3 小时前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
SelectDB3 小时前
从 StarRocks 走向 Apache Doris:如何实现引擎平滑替换与架构升级?
大数据·数据库·数据分析
步行cgn3 小时前
Thymeleaf 编辑表单详解:从字段回填到模拟 PUT 请求
后端
为思念酝酿的痛3 小时前
MySQL的操作
数据库·mysql
猫咪很可爱4 小时前
Oracle ORA-4031 错误分析与处理:SGA 内存不足导致 update/exp/expdp 失败
数据库·oracle
Song_RsHt4 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
小豆庄4 小时前
视频素材处理时的隐私盲区:云处理与本地处理的边界在哪
数据库·图像处理·视频·敏捷流程
学长毕设4 小时前
基于SpringBoot的建筑材料管理系统-附源码
java·spring boot·后端