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 = '英语';
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 ... │
└─────────────────────────────────────────┘