MySQL-数据库增删改查学习

一、表架构总览

二、建表SQL语句

sql 复制代码
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `cid` int(11) NOT NULL COMMENT '课程号',
  `cname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '课程名',
  `tid` int(11) NULL DEFAULT NULL COMMENT '老师号',
  PRIMARY KEY (`cid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (3001, '英语', 1);
INSERT INTO `course` VALUES (3002, '数学', 2);
INSERT INTO `course` VALUES (3003, '物理', 3);
INSERT INTO `course` VALUES (3004, '语文', 4);

-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc`  (
  `sid` int(11) NOT NULL COMMENT '学生号',
  `cid` int(11) NOT NULL COMMENT '课程号',
  `score` int(11) NULL DEFAULT NULL COMMENT '成绩'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES (101, 3001, 90);
INSERT INTO `sc` VALUES (102, 3001, 85);
INSERT INTO `sc` VALUES (103, 3001, 76);
INSERT INTO `sc` VALUES (104, 3002, 87);
INSERT INTO `sc` VALUES (105, 3001, 92);
INSERT INTO `sc` VALUES (101, 3002, 81);
INSERT INTO `sc` VALUES (102, 3002, 93);
INSERT INTO `sc` VALUES (103, 3002, 73);
INSERT INTO `sc` VALUES (104, 3002, 65);
INSERT INTO `sc` VALUES (105, 3002, 96);
INSERT INTO `sc` VALUES (101, 3003, 85);
INSERT INTO `sc` VALUES (102, 3003, 76);
INSERT INTO `sc` VALUES (103, 3003, 63);
INSERT INTO `sc` VALUES (104, 3003, 59);
INSERT INTO `sc` VALUES (105, 3003, 56);
INSERT INTO `sc` VALUES (101, 3004, 100);
INSERT INTO `sc` VALUES (102, 3004, 83);
INSERT INTO `sc` VALUES (103, 3004, 75);
INSERT INTO `sc` VALUES (104, 3004, 69);
INSERT INTO `sc` VALUES (105, 3004, 50);
INSERT INTO `sc` VALUES (106, 3001, 60);
INSERT INTO `sc` VALUES (106, 3001, 60);

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `sid` int(11) NOT NULL COMMENT '学生号',
  `sname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `sage` int(11) NULL DEFAULT NULL COMMENT '年龄',
  `ssex` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别',
  PRIMARY KEY (`sid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (101, '王明', 18, '女');
INSERT INTO `student` VALUES (102, '王天', 19, '男');
INSERT INTO `student` VALUES (103, '张三', 18, '男');
INSERT INTO `student` VALUES (104, '李四', 19, '女');
INSERT INTO `student` VALUES (105, '王五', 20, '男');
INSERT INTO `student` VALUES (107, '万源', 17, '男');
INSERT INTO `student` VALUES (108, '王天明', 19, '男');

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `tid` int(11) NOT NULL COMMENT '老师号',
  `tname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '老师名称',
  PRIMARY KEY (`tid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, '王老师');
INSERT INTO `teacher` VALUES (2, '李老师');
INSERT INTO `teacher` VALUES (3, '赵老师');
INSERT INTO `teacher` VALUES (4, '宋老师');

SET FOREIGN_KEY_CHECKS = 1;

三、查询语句

1、基本查询语句

sql 复制代码
1. 查询所有学生信息
SELECT * FROM student;

2. 查询所有课程名称
SELECT cname FROM course;

2、带条件查询

sql 复制代码
1. 查询年龄大于 18 的学生
SELECT * FROM student WHERE sage > 18;

2. 查询所有男学生
SELECT * FROM student WHERE ssex = '男';

3、模糊查询

sql 复制代码
语法:SELECT 列名 FROM 表名 WHERE 列名 LIKE 模式;

1. 查询以"王"开头的学生信息
SELECT * FROM student WHERE sname LIKE '王%';

2. 查询包含"天"的学生信息
SELECT * FROM student WHERE sname LIKE '%天%';

3. 查询姓"王"且姓名为两个汉字的学生信息(下划线"_"单字符匹配)
SELECT * FROM student WHERE sname LIKE '王_';

4、范围查询

sql 复制代码
1. 查询成绩在 80 到 90 之间的选课记录(包含边界)
SELECT * FROM sc WHERE score BETWEEN 80 AND 90;

2. 查询成绩不在 60 到 80 之间的选课记录
SELECT * FROM sc WHERE score NOT BETWEEN 60 AND 80;

5、属于 / 不属于

sql 复制代码
1. 查询课程号为 3001 或 3002 的选课记录(属于)
SELECT * FROM sc WHERE cid IN (3001, 3002);

2. 查询课程号不是 3001 也不是 3002 的选课记录(不属于)
SELECT * FROM sc WHERE cid NOT IN (3001, 3002);

6、排序(升序 ASC / 降序 DESC)

sql 复制代码
语法:SELECT * FROM 表名 ORDER BY 列名 [ASC|DESC];

1. 查询所有学生的成绩,按分数升序排列(从低到高);ASC 是升序,可以省略(默认就是 ASC)
SELECT * FROM sc ORDER BY score ASC;

2. 查询所有学生的成绩,按分数降序排列(从高到低)
SELECT * FROM sc ORDER BY score DESC;

3. 查询所有学生,先按年龄升序,年龄相同再按学号降序
SELECT * FROM student ORDER BY sage ASC, sid DESC;

4. 查询英语课(cid=3001)的成绩,按分数从高到低显示学生号和分数
SELECT sid, score FROM sc WHERE cid = 3001 ORDER BY score DESC;

7、去重

sql 复制代码
1. 查询有哪些课程被选过(去重课程号)
SELECT DISTINCT cid FROM sc;

2. 查询学生表中不重复的(年龄, 性别)组合
SELECT DISTINCT sage, ssex FROM student;

8、聚合函数查询(MAX/AVG/MIN)

sql 复制代码
1. 查询所有学生成绩的平均分
SELECT 
    AVG(score) AS 平均分      -- AVG() 计算平均值,AS 起别名
FROM sc;                      -- FROM 指定数据来源表

2. 查询英语课(3001)的平均分
SELECT 
    AVG(score) AS 英语平均分   -- 计算平均值,别名"英语平均分"
FROM sc                       -- 成绩表
WHERE cid = 3001;             -- WHERE 筛选课程号为3001的记录

3. 查询平均分大于 80 的课程
SELECT 
    cid,                       -- 课程号
    AVG(score) AS 平均分       -- 计算每门课的平均分
FROM sc                        -- 成绩表
GROUP BY cid                   -- GROUP BY 按课程分组
HAVING AVG(score) > 80;        -- HAVING 筛选分组后平均分>80的课程
-- 语法注释:GROUP BY 分组 → AVG() 计算每组平均值 → HAVING 筛选分组结果

4. 查询每个学生的最高分、最低分、平均分
SELECT 
    sid,                       -- 学生号
    MAX(score) AS 最高分,      -- MAX() 求最大值
    MIN(score) AS 最低分,      -- MIN() 求最小值
    AVG(score) AS 平均分       -- AVG() 求平均值
FROM sc                        -- 成绩表
GROUP BY sid;                  -- GROUP BY 按学生分组

5. 查询平均分前三名的学生
SELECT 
    sid,                       -- 学生号
    AVG(score) AS 平均分       -- 计算每个学生的平均分
FROM sc                        -- 成绩表
GROUP BY sid                   -- GROUP BY 按学生分组
ORDER BY 平均分 DESC           -- ORDER BY 按平均分降序排列(高分在前)
LIMIT 3;                       -- LIMIT 只取前3条记录
-- 语法注释:GROUP BY 分组 → AVG() 计算平均分 → ORDER BY DESC 降序排序 → LIMIT 3 取前三名

9、子查询

sql 复制代码
1. 查询比"王明"年龄小的学生
SELECT * FROM student 
WHERE sage < (SELECT sage FROM student WHERE sname = '王明');

2. 查询选了"英语"课的学生信息
SELECT * FROM student 
WHERE sid IN (
  SELECT sid FROM sc WHERE cid = (SELECT cid FROM course WHERE cname = '英语')
);

10、多表查询

sql 复制代码
1. 查询每个学生的姓名及其选课成绩(两表连接)
SELECT student.sname, sc.cid, sc.score
FROM student
JOIN sc ON student.sid = sc.sid;

2. 查询学生姓名、课程名称、成绩(三表连接);使用表别名(s、c)简化书写
SELECT s.sname, c.cname, sc.score
FROM student s
JOIN sc ON s.sid = sc.sid
JOIN course c ON sc.cid = c.cid;

3. 查询每门课程的授课老师姓名
SELECT c.cname, t.tname
FROM course c
JOIN teacher t ON c.tid = t.tid;

4. 查询选了"英语"课的学生姓名
SELECT s.sname
FROM student s
JOIN sc ON s.sid = sc.sid
JOIN course c ON sc.cid = c.cid
WHERE c.cname = '英语';
sql 复制代码
=============================================
JOIN 语法说明
=============================================

一、INNER JOIN(内连接)
说明:只返回两个表中匹配的行,不匹配的行不显示,JOIN 默认就是 INNER JOIN
语法:SELECT * FROM 表A JOIN 表B ON 表A.字段 = 表B.字段
图解:
    表A          表B
  ┌─────┐       ┌─────┐
  │  ✓  │       │  ✓  │
  │  ✓  │  →→→  │  ✓  │  →→→ 只返回 ✓(匹配的)
  │     │       │     │
  └─────┘       └─────┘


二、LEFT JOIN(左连接)
说明:返回左表所有行,右表无匹配的显示为 NULL
语法:SELECT * FROM 表A LEFT JOIN 表B ON 表A.字段 = 表B.字段
图解:
    表A          表B
  ┌─────┐       ┌─────┐
  │  ✓  │       │  ✓  │
  │  ✓  │  →→→  │     │  →→→ 左表全部 + 右表匹配的
  │  ✓  │       │     │
  └─────┘       └─────┘


三、RIGHT JOIN(右连接)
说明:返回右表所有行,左表无匹配的显示为 NULL
语法:SELECT * FROM 表A RIGHT JOIN 表B ON 表A.字段 = 表B.字段
图解:
    表A          表B
  ┌─────┐       ┌─────┐
  │  ✓  │       │  ✓  │
  │     │  ←←←  │  ✓  │  ←←← 右表全部 + 左表匹配的
  │     │       │  ✓  │
  └─────┘       └─────┘


四、多表 JOIN(多表连接)
说明:依次连接多张表
语法:表A JOIN 表B ON ... JOIN 表C ON ...
图解:
  ┌─────┐     ┌─────┐     ┌─────┐
  │ 表A │────│ 表B │────│ 表C │
  └─────┘     └─────┘     └─────┘
       ON          ON

四、更新语句

1、基础更新

sql 复制代码
1. 将学生"张三"的年龄修改为 19 岁
UPDATE student SET sage = 19 WHERE sname = '张三';

2. 将所有学生的年龄增加 1 岁
UPDATE student SET sage = sage + 1;

2、带条件更新

sql 复制代码
1. 将成绩低于 60 分的选课记录成绩改为 60 分
UPDATE sc SET score = 60 WHERE score < 60;

2. 将女生(性别为'女')的年龄增加 1 岁
UPDATE student SET sage = sage + 1 WHERE ssex = '女';

3、多表关联更新

sql 复制代码
1. 将所有选了"英语"课的学生成绩增加 5 分
UPDATE sc 
SET score = score + 5 
WHERE cid = (SELECT cid FROM course WHERE cname = '英语');

2. 将"王明"的所有课程成绩增加 3 分
-- 使用 子查询 更新
UPDATE sc 
SET score = score + 3 
WHERE sid = (SELECT sid FROM student WHERE sname = '王明');

-- 使用 JOIN 更新
UPDATE sc
JOIN student ON sc.sid = student.sid
SET sc.score = sc.score + 3
WHERE student.sname = '王明';

五、删除语句

1、基础删除

sql 复制代码
1. 删除学生"万源"的记录
DELETE FROM student WHERE sname = '万源';

2、带条件删除

sql 复制代码
1. 删除成绩低于 70 分的选课记录
DELETE FROM sc WHERE score < 70;

2. 删除姓名中包含"王"的学生
DELETE FROM student WHERE sname LIKE '%王%';

3、多表关联删除

sql 复制代码
1. 删除选了"英语"课的选课记录
DELETE FROM sc 
WHERE cid = (SELECT cid FROM course WHERE cname = '英语');

2. 删除"王老师"所教课程的所有选课记录
-- 使用 子查询 删除
DELETE FROM sc 
WHERE cid IN (
  SELECT cid FROM course WHERE tid = (SELECT tid FROM teacher WHERE tname = '王老师')
);

-- 使用 JOIN 删除
DELETE sc FROM sc
JOIN course ON sc.cid = course.cid
JOIN teacher ON course.tid = teacher.tid
WHERE teacher.tname = '王老师';
xml 复制代码
子查询写法(单表删除):
┌─────────────────────────────────────────┐
│ DELETE FROM sc                          │  ← 已经指定了删除 sc 表
│ WHERE cid IN (子查询)                    │  ← 子查询只是条件
└─────────────────────────────────────────┘

JOIN 写法(多表连接):
┌─────────────────────────────────────────┐
│ DELETE sc FROM sc                       │  ← DELETE 后面指定要删 sc
│ JOIN course ON ...                      │  ← 连接了其他表,删除必须指定
│ WHERE ...                               │
└─────────────────────────────────────────┘

六、插入语句

1、基础插入

sql 复制代码
1. 插入一名新学生(学号 108,姓名"赵六",年龄 18,性别"男")
INSERT INTO student (sid, sname, sage, ssex) 
VALUES (108, '赵六', 18, '男');

2、批量插入

sql 复制代码
1. 一次性插入多名学生
INSERT INTO student (sid, sname, sage, ssex) VALUES 
(110, '周八', 20, '男'),
(111, '吴九', 19, '女'),
(112, '郑十', 18, '男');

七、事务保护

sql 复制代码
-- 开启事务
START TRANSACTION;

-- 执行 SQL 语句
UPDATE ...;
DELETE ...;
INSERT ...;

-- 提交事务(确认修改,永久生效)
COMMIT;

-- 回滚事务(撤销修改,恢复原状)
ROLLBACK;
  • 在执行增删改操作时,建议开启事务保护,如操作正确保存,错误回滚
相关推荐
qq_189807032 小时前
CSS如何实现纯CSS树状目录结构_利用-checked与递归思维构建交互节点
jvm·数据库·python
2301_777599372 小时前
Go语言如何做HTTP连接池_Go语言HTTP连接池教程【最新】
jvm·数据库·python
Wy_编程2 小时前
Redis数据类型和常用命令
数据库·redis·缓存
Polar__Star2 小时前
Redis如何利用位图快速判断数据存在性
jvm·数据库·python
2301_817672262 小时前
CSS如何实现优雅的间距_使用CSS Grid控制盒模型间隙
jvm·数据库·python
你说咋整就咋整2 小时前
openGauss6.0.3 一主二从集群安装手册
数据库·python·gaussdb
Shorasul2 小时前
JavaScript中显式创建包装对象的后果与性能损耗
jvm·数据库·python
minglie12 小时前
Zynq 开发中的工程文件管理
学习
吕源林3 小时前
C#怎么实现EF Core迁移 C#如何用Entity Framework Core进行数据库迁移和更新表结构【数据库】
jvm·数据库·python