MySQL基础CRUD语句

MySQL 作为主流关系型数据库,CRUD(增 Create、查 Retrieve、改 Update、删 Delete) 是数据库操作的核心根基,也是后端开发、数据处理的必备技能。本文全程理论 + 实战实验结合,所有 SQL 代码可直接复制执行,带你从零吃透 MySQL 基本查询与增删改查,新手也能快速上手。

1:学习前置

所有实验基于学生表students和成绩单exam_result开战

1:创建学生表

sql 复制代码
-- 学生表:ID自增、学号唯一、姓名非空、QQ号可选
CREATE TABLE students (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '学生ID(主键自增)',
    sn INT NOT NULL UNIQUE COMMENT '学号(唯一约束)',
    name VARCHAR(20) NOT NULL COMMENT '学生姓名',
    qq VARCHAR(20) COMMENT 'QQ号码'
);

2:创建成绩单exam_result

sql 复制代码
-- 成绩表:存储语数外三科成绩
CREATE TABLE exam_result (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '成绩记录ID',
    name VARCHAR(20) NOT NULL COMMENT '学生姓名',
    chinese FLOAT DEFAULT 0.0 COMMENT '语文成绩',
    math FLOAT DEFAULT 0.0 COMMENT '数学成绩',
    english FLOAT DEFAULT 0.0 COMMENT '英语成绩'
);

2:create插入数据

插入数据是向表中添加记录,核心语法:

INSERT INTO 表名 (列名1,列名2) VALUES (值1,值2);

1:单行数据+全列插入

sql 复制代码
-- 插入2条学生记录
INSERT INTO students VALUES (100, 1000, '唐三藏', NULL);
INSERT INTO students VALUES (101, 10001, '孙悟空', '111');

2:多行数据+指定列插入

sql 复制代码
-- 批量插入2条学生数据,仅填id、学号、姓名
INSERT INTO students (id, sn, name) VALUES 
(102, 20001, '曹孟德'), 
(103, 20002, '孙仲谋');

3:插入否则更新

主键 / 唯一键冲突时,自动更新数据避免插入失败。

sql 复制代码
-- 主键100已存在,触发更新
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';

4:插入替换

冲突则删除旧数据再插入,无冲突直接新增。

sql 复制代码
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
复制代码

3:retrieve数据查询

查询是 MySQL最核心操作,语法:

SELECT DISTINCT 列 FROM 表 WHERE条件 ORDER BY排序 LIMIT分页;

1:基础查询实验

先插入成绩然后查询

sql 复制代码
-- 插入7条成绩数据
INSERT INTO exam_result (name, chinese, math, english) VALUES 
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
1:全列查询(不推荐生产使用)
sql 复制代码
SELECT * FROM exam_result;
2:指定列+表达式查询
sql 复制代码
-- 查询ID、姓名,计算总分
SELECT id, name, chinese + math + english AS 总分 FROM exam_result;
3:结果去重(DISTINCT)
sql 复制代码
-- 数学成绩去重查询
SELECT DISTINCT math FROM exam_result;

2:WHERE条件筛选实验

1:英语不及格的学生
2:语文80-90的学生
sql 复制代码
-- BETWEEN 包含区间两端值
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
3:模糊查询(姓孙的学生)
sql 复制代码
-- %:匹配任意字符;_:匹配单个字符
SELECT name FROM exam_result WHERE name LIKE '孙%';

也可以这样模糊查询

3:排序+分页查询

1:按照数学成绩降序排序
sql 复制代码
SELECT name, math FROM exam_result ORDER BY math DESC;

注意:NULL视为最小值,升序排在最前,降序排在最后。

2:分页查询(第一页,每页三条)
sql 复制代码
-- LIMIT 条数 OFFSET 起始下标(从0开始)
SELECT id, name, math FROM exam_result ORDER BY id LIMIT 3 OFFSET 0;

4:update数据更新

核心语法

UPDATE 表 SET 列=值 WHERE 条件;

无 WHERE 条件会更新全表,生产环境严禁滥用!

1:单字段更新

sql 复制代码
-- 把孙悟空的数学成绩改为80分
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';

2:多字段批量更新

sql 复制代码
-- 曹孟德:数学60分、语文70分
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';

3:表达式更新(在原值上修改)

sql 复制代码
-- 总分倒数前三的学生,数学成绩+30
UPDATE exam_result SET math = math + 30
ORDER BY chinese + math + english LIMIT 3;

5:delete数据删除

核心语法

DELETE FROM 表 WHERE 条件;

1:删除单条数据

sql 复制代码
-- 删除孙悟空的成绩记录
DELETE FROM exam_result WHERE name = '孙悟空';

2:全表删除和截断表

DELETE 全表(保留自增 ID)

sql 复制代码
DELETE FROM students;

TRUNCATE截断表(重置自增ID,速度更快)

sql 复制代码
TRUNCATE students;
操作 能否删指定行 自增 ID 事务回滚
DELETE 保留 支持
TRUNCATE 不能(全表) 重置 不支持

6:高级查询:聚合函数+分组

1:聚合函数实验

sql 复制代码
-- 统计学生总人数
SELECT COUNT(*) FROM students;
-- 数学成绩总分
SELECT SUM(math) FROM exam_result;
-- 英语最高分
SELECT MAX(english) FROM exam_result;

2:GROUP BY分组+HAVING筛选

1:实验准备

创建员工表

sql 复制代码
-- 1. 创建员工表 emp
CREATE TABLE emp (
    emp_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工编号',
    emp_name VARCHAR(20) NOT NULL COMMENT '员工姓名',
    dept VARCHAR(20) NOT NULL COMMENT '所属部门',
    job VARCHAR(20) NOT NULL COMMENT '岗位',
    sal INT NOT NULL COMMENT '工资'
);

-- 2. 插入测试数据
INSERT INTO emp (emp_name, dept, job, sal) VALUES
('孙悟空', '研发部', '开发', 9000),
('猪八戒', '研发部', '测试', 7000),
('唐三藏', '产品部', '产品经理', 12000),
('沙和尚', '研发部', '开发', 8500),
('白龙马', '产品部', '产品专员', 6000),
('曹孟德', '运营部', '运营主管', 10000),
('刘皇叔', '运营部', '运营专员', 5000);

2:单字段分组->按部门统计

需求:统计每个部门的员工人数、平均工资、最高工资、最低工资

sql 复制代码
-- 单字段分组:按 dept 分组
SELECT
    dept AS '部门',
    COUNT(emp_id) AS '员工人数',
    AVG(sal) AS '平均工资',
    MAX(sal) AS '最高工资',
    MIN(sal) AS '最低工资'
FROM emp
GROUP BY dept;

2:多字段分组->按部门+岗位分组
sql 复制代码
-- 多字段分组:先按部门分,再按岗位分
SELECT
    dept AS '部门',
    job AS '岗位',
    COUNT(emp_id) AS '人数',
    AVG(sal) AS '岗位平均工资'
FROM emp
GROUP BY dept, job;
3:GROUP BY +HAVING ->过滤分组结果

HAVING 专门过滤分组后的结果WHERE 过滤分组前的原始数据,二者不能混用。

需求:筛选出平均工资 ≥ 8000 的部门

sql 复制代码
-- 先分组统计,再用 HAVING 过滤分组结果
SELECT
    dept AS '部门',
    AVG(sal) AS '平均工资'
FROM emp
GROUP BY dept
HAVING AVG(sal) >= 8000;
4:GROUP BY + ORDER BY ->分组后排序

需求:按部门统计总工资,结果按总工资降序排列

sql 复制代码
SELECT
    dept AS '部门',
    SUM(sal) AS '部门总工资'
FROM emp
GROUP BY dept
ORDER BY SUM(sal) DESC;

7:核心知识点总结

  1. SQL 关键字执行顺序 from → on → join → where → group by → having → select → distinct → order by → limit
  2. CRUD 核心原则
    • 增:指定列插入更安全,冲突用ON DUPLICATE/REPLACE
    • 查:少用*,善用WHERE/LIMIT优化性能
    • 改 / 删:必须加 WHERE 条件,避免全表操作
  3. 查询技巧 :去重DISTINCT、排序ORDER BY、分页LIMIT、模糊LIKE是日常高频用法
相关推荐
流星白龙7 小时前
【MySQL高阶】13.其他存储引擎
android·数据库·mysql
薛定谔的悦7 小时前
光伏-储能-负荷联合预测:给 EMS 装上“预知能力“
java·数据库·人工智能·python·储能
阿演7 小时前
DataDjinn v0.1.6 更新:增加在线更新功能,Redis 数据源支持,表格预览和连接体验继续增强
数据库·redis·缓存·数据库连接工具
数据库小学妹7 小时前
InnoDB内存架构解密:Buffer Pool与性能优化实战
数据库·经验分享·sql·性能优化·架构
Lyyaoo.7 小时前
【MySQL】SQL优化
android·sql·mysql
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题 第89题】【Mysql篇】第19题:Hash 索引和 B+ 树索引的区别?它们在使用方面的区别?
java·数据库·mysql·面试·哈希算法
一只fish7 小时前
Oracle官方文档翻译《Database Concepts 26ai》第17章-内存架构
数据库·oracle
元宝骑士8 小时前
MySQL 实战:跨表排序 + 指定类型置顶四种写法
后端·mysql
比企谷八幡8 小时前
一张表在磁盘上长什么样:Heap File 入门
数据库·oracle
流星白龙8 小时前
【MySQL高阶】11.InnoDB存储引擎
数据库·mysql