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是日常高频用法
相关推荐
罗政24 分钟前
PDF 批量合并工具:本地 AI 自动排序、识别正文日期与合同编号
数据库·pdf·php
SelectDB31 分钟前
宽表元数据膨胀怎么解?Doris Segment V3 对比 Parquet、Lance
大数据·数据库·数据分析
曹牧1 小时前
Oracle:快速定位最新数据
数据库·oracle
AskHarries1 小时前
PostgreSQL 还是 MySQL
mysql·postgrel
Zhu7582 小时前
在Docker环境部署ApacheGuacamole,对接PG数据库
数据库·docker·容器
Leighteen2 小时前
Redis与MySQL双写一致性:从问题根源到工程落地
数据库·redis·mysql
AI-好学者3 小时前
阶段二-Cypher查询语言详解
数据库·rag·graphrag
龙仔7253 小时前
SQL Server 批量多库只读账号一键脚本(带逐行注释完整脚本 + 分段逐句详细解释)
服务器·数据库·sql·sqlserver·dba
咏方舟【长江支流】4 小时前
【开源】跨语言·跨平台·跨数据库(2) —— 用宝轻量框架设计必读
数据库·架构·开源·ai编程·咏方舟-长江支流·用宝框架