我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的数据库系统概论专栏
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
插入数据 就是向数据库表中添加新的记录(一行数据),可以是 单条数据 或 批量数据,也可以从其他表查询结果中插入数据。
基本语法
INSERT INTO 表名 [(列1, 列2, ...)] VALUES (值1, 值2, ...);
场景示例
-- 表结构:Student(学号Sno, 姓名Sname, 性别Ssex, 出生日期Sbirthdate, 主修专业Smajor)
INSERT INTO Student (Sno, Sname, Ssex, Smajor, Sbirthdate)
VALUES ('20180009', '陈冬', '男', '信息管理与信息系统', '2000-5-22');
Smajor
提前),但 VALUES
顺序要和列名一一对应。INSERT INTO Student VALUES ('20180008', '张成民', '男', '2000-4-15', '计算机科学与技术');
-- 表结构:SC(学号Sno, 课程号Cno, 成绩Grade, 选学期Semester, 教学班Teachingclass)
INSERT INTO SC(Sno, Cno, Semester, Teachingclass)
VALUES ('20180005', '81004', '20202', '81004-01');
Grade
列会自动填 NULL(前提是该列允许为空)。语法
INSERT INTO 表名 [(列1, 列2, ...)]
VALUES (值1, 值2, ...),
(值3, 值4, ...),
...; -- 用逗号分隔多个元组
示例
INSERT INTO SC VALUES
('200215125', '2', 86, ...),
('200215125', '8', 77, ...),
('200215126', '2', 60, ...);
语法
INSERT INTO 表名 [(列1, 列2, ...)]
子查询; -- 子查询的结果作为要插入的数据
场景示例
需求:统计每个专业学生的平均年龄,存入新表 Smajor_age
。
CREATE TABLE Smajor_age (
Smajor VARCHAR(20), -- 专业名
Avg_age SMALLINT -- 平均年龄
);
INSERT INTO Smajor_age(Smajor, Avg_age)
SELECT Smajor, AVG(TIMESTAMPDIFF(YEAR, Sbirthdate, CURDATE())) -- 计算年龄差
FROM Student
GROUP BY Smajor; -- 按专业分组统计
INSERT INTO
的列匹配。数据库在插入数据时会自动检查以下规则,若违反则插入失败:
修改数据就是对数据库表中已存在的记录进行更新,比如改名字、调整价格、修正错误数据等。
UPDATE 表名
SET 列1=值1, 列2=值2, ... -- 要修改的列和新值
WHERE 条件; -- 筛选需要修改的记录(可选)
需求:把学号为 20180001
的学生出生日期改为 2001-3-18
。
UPDATE Student
SET Sbirthdate = '2001-3-18'
WHERE Sno = '20180001';
需求:给2020年第1学期选修 81002
课程的所有学生成绩减5分。
UPDATE SC
SET Grade = Grade - 5
WHERE Semester = '20201' AND Cno = '81002';
需求:把计算机科学与技术专业的所有学生成绩置零。
UPDATE SC
SET Grade = 0
WHERE Sno IN ( -- 关键:子查询查出目标学号
SELECT Sno FROM Student
WHERE Smajor = '计算机科学与技术'
);
Student
表找出计算机专业的学生学号,再用 IN
匹配到 SC
表中对应的记录。安全第一:先查后改
修改前先用 SELECT
验证 WHERE
条件是否正确,避免误改。
例如,确认计算机专业学生:
SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术';
完整性约束检查
数据库会自动验证修改后的数据是否符合规则:
三种常见错误场景
错误场景 | 示例及后果 |
---|---|
忘记写WHERE子句 | UPDATE SC SET Grade = 0; → 全量数据的成绩都被置零! |
WHERE条件写错 | UPDATE SC SET Grade = 0 WHERE Cno = '81002'; → 误将其他课程成绩置零。 |
子查询逻辑错误 | 子查询查出的学号范围不对,导致修改了不该改的记录。 |
针对“计算机专业学生成绩置零”需求,有三种写法:
UPDATE SC
SET Grade = 0
WHERE Sno IN (SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术');
UPDATE SC
SET Grade = 0
WHERE '计算机科学与技术' = (SELECT Smajor FROM Student WHERE Student.Sno = SC.Sno);
SC
表的每条记录,通过 Sno
关联到 Student
表,判断专业是否匹配。UPDATE SC
SET Grade = 0
WHERE EXISTS (
SELECT 1 FROM Student
WHERE Student.Sno = SC.Sno AND Smajor = '计算机科学与技术'
);
SC
表当前记录 Sno
匹配且专业是计算机的学生,就修改当前记录。删除数据就是从数据库表中移除已存在的记录(一行或多行),可以是单个记录、批量记录,或通过子查询关联其他表的数据进行删除。
DELETE FROM 表名 WHERE 条件;
需求:删除学号为 20180007
的学生记录。
DELETE FROM Student WHERE Sno = '20180007';
WHERE
精准定位单条记录,避免误删。需求:删除所有学生的选课记录(清空表)。
DELETE FROM SC; -- 不写WHERE,删除表中所有数据
需求:删除计算机科学与技术专业学生的所有选课记录。
DELETE FROM SC
WHERE Sno IN ( -- 子查询先找出计算机专业学生的学号
SELECT Sno FROM Student
WHERE Smajor = '计算机科学与技术'
);
Student
表获取目标学生的学号,再在 SC
表中删除这些学号对应的选课记录。安全第一:先查后删
删除前先用 SELECT
验证 WHERE
条件是否正确,避免误删。
例如,确认计算机专业学生学号:
SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术';
参照完整性约束
Student
表中的学生记录时,若 SC
表(选课表)中存在该学生的选课记录,直接删除会报错(因为外键约束要求选课记录的学号必须存在于学生表中)。SC
)中关联的记录,再删除主表(如 Student
)记录。ON DELETE CASCADE
),自动删除关联数据。三种常见错误场景
错误场景 | 示例及后果 |
---|---|
忘记写WHERE子句 | DELETE FROM SC; → 清空整个选课表,所有学生的成绩记录丢失! |
WHERE条件写错 | DELETE FROM SC WHERE Cno = '81002'; → 误删其他课程的选课记录。 |
跨表删除未考虑外键 | 直接删除主表学生记录,导致子表选课记录出现“孤立数据”(外键值不存在)。 |
针对“删除计算机专业学生选课记录”需求,有两种等价写法:
DELETE FROM SC
WHERE Sno IN (SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术');
DELETE FROM SC
WHERE '计算机科学与技术' = (
SELECT Smajor FROM Student
WHERE Student.Sno = SC.Sno -- 通过Sno关联两张表
);
SC
表的每条记录,通过学号关联到 Student
表,判断专业是否匹配,匹配则删除。以上就是这篇博客的全部内容,下一篇我们将继续探索更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的数据库系统概论专栏
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |