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是日常高频用法
相关推荐
funnycoffee1231 小时前
cisco Firepower 4110 9300 FXOS set chassis hostname
java·服务器·数据库
0xDevNull1 小时前
MySQL中的锁详解
mysql
六月雨滴1 小时前
Oracle 数据库诊断文件与故障排查
数据库
草莓熊Lotso1 小时前
【Linux网络】从 0 到 1 实现高性能 UDP 聊天室:深入拆解 Linux 网络编程与线程池架构
linux·运维·服务器·网络·数据库·c++·udp
咖啡里的茶i1 小时前
实验一 数据库定义
数据库·oracle
IT 行者1 小时前
Qdrant vs Milvus 向量数据库对比选型指南
数据库·milvus·qdrant
一个数据大开发1 小时前
DB-GPT + StarRocks 实现企业级智能问数:从 Text-to-SQL 到指标治理落地方案
数据库·sql·gpt
赏金术士1 小时前
Kotlin 习题集 · 进阶篇
java·数据库·kotlin
Irene19911 小时前
触发器(Trigger) 是数据库中一种特殊的存储程序,它会在指定的表上发生特定事件(如 INSERT、UPDATE、DELETE)时自动执行
mysql