本期实验,我们将讲解数据更新的一些sql语句的练习题,所有题目的表结构基于下述,与sql语句与模型图一并给出。
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
-- 创建学生表
CREATE TABLE student (
SNO CHAR(7) PRIMARY KEY,
SNAME CHAR(10) NOT NULL,
SSEX CHAR(2),
SAGE SMALLINT,
SDEPT VARCHAR(20)
);
-- 创建课程表
CREATE TABLE course (
CNO CHAR(10) PRIMARY KEY,
CNAME VARCHAR(20) NOT NULL,
CCREDIT SMALLINT,
SEMSTER SMALLINT,
PERIOD SMALLINT
);
-- 创建选课表
CREATE TABLE sc (
SNO CHAR(7),
CNO CHAR(10),
GRADE SMALLINT,
PRIMARY KEY (SNO, CNO),
FOREIGN KEY (SNO) REFERENCES student(SNO),
FOREIGN KEY (CNO) REFERENCES course(CNO)
);
update student set sage=sage+1;
UPDATE sc
SET sc.grade = sc.grade-5
where cno in(select cno from course where cname='高等数学') and grade is not null
order by grade
limit 3;
UPDATE sc
表示要更新选课表 sc 中的数据。SET sc.grade = sc.grade-5
表示将选课表 sc 中所有符合条件的记录中的成绩减去 5 分。where cno in(select cno from course where cname='高等数学') and grade is not null
表示只更新选修了课程名为“高等数学”的课程且成绩不为空的学生的选课记录。其中,cno in(select cno from course where cname='高等数学')
表示选修了课程名为“高等数学”的课程,grade is not null
表示成绩不为空。order by grade
表示按成绩升序排序。limit 3
表示最多更新 3 条记录。如果符合条件的记录多于 3 条,则只更新前三条记录。UPDATE sc
SET GRADE = GRADE + 5
WHERE SNO IN (
SELECT t.SNO
FROM (
SELECT SNO, AVG(GRADE) AS AVG_GRADE
FROM sc
GROUP BY SNO
HAVING AVG_GRADE >= 75
) AS t
);
在这条 SQL 语句的子查询中,使用了别名 t 来代表子查询的结果集。这样做的好处是,可以在 SELECT 子句中引用这个别名,从而简化 SQL 语句的书写。
在这个例子中,子查询的目的是找出平均成绩大于等于 75 分的学生的学号。因此,子查询的结果需要包含两个字段:SNO(学号)和 AVG_GRADE(平均成绩)。在子查询中,使用了 GROUP BY
子句对 SNO 进行分组,并使用 AVG
函数计算每个学生的平均成绩。由于 AVG
函数返回的结果需要命名为 AVG_GRADE
,因此使用了 AS 关键字来给这个字段起别名。
UPDATE sc
SET GRADE = 70
WHERE SNO = (
SELECT SNO
FROM student
WHERE SNAME = '王大力'
) AND CNO = (
SELECT CNO
FROM course
WHERE CNAME = '计算机导论'
);
WHERE SNO = (SELECT SNO FROM student WHERE SNAME = '王大力') AND CNO = (SELECT CNO FROM course WHERE CNAME = '计算机导论')
表示只更新某个学生选修的某一门课程的成绩。其中,SELECT SNO FROM student WHERE SNAME = '王大力'
是一个子查询,用于查找名为“王大力”的学生的学号。同样地,SELECT CNO FROM course WHERE CNAME = '计算机导论'
也是一个子查询,用于查找课程名为“计算机导论”的课程的课程号。因此,WHERE 子句中的条件 SNO = (SELECT SNO FROM student WHERE SNAME = '王大力') AND CNO = (SELECT CNO FROM course WHERE CNAME = '计算机导论')
表示选取符合条件的学生和课程的选课记录进行更新。
update sc
set grade = 85
where sno='9512101' and cno='C01';
Sno:9512102 Sname:刘晨 Ssex:男 Sage:20 Sdept:计算机系
表结构如下:student(学生表)
列名 | 说明 | 数据类型 | 约束 |
SNO | 学号 | CHAR(7) | 主码 |
SNAME | 姓名 | CHAR(10) | NOT NULL |
SSEX | 性别 | CHAR(2) | 取“男”或“女” |
SAGE | 年龄 | SMALLINT | |
SDEPT | 所在系 | VARCHAR(20) | 默认“计算机系” |
INSERT INTO student (SNO, SNAME, SSEX, SAGE, SDEPT)
VALUES ('9512102', '刘晨', '男', 20, '计算机系');
delete from sc where cno in(select cno from course where cname='数据库基础' );
delete from course where cname='数据库基础';
Cno:C06 Cname:数据结构 Ccredit:5 Semster:4
表结构如下:course(课程表)
列名 | 说明 | 数据类型 | 约束 |
CNO | 课程号 | CHAR(10) | 主码 |
CNAME | 课程名 | VARCHAR(20) | NOT NULL |
CCREDIT | 学分 | SMALLINT | |
SEMSTER | 学期 | SMALLINT | |
PERIOD | 学时 | SMALLINT |
insert into course (cno,cname,ccredit,semster)
values ('C06','数据结构',5,4);
DELETE FROM sc
WHERE sno IN(SELECT sno FROM student WHERE sname='张海');
INSERT INTO sc(sno,cno)
SELECT sno,cno FROM student,course
WHERE sno LIKE '95211%' and cno='C04';
DELETE FROM sc
WHERE cno='C05' AND sno='9531102';
根据employee员工表中各部门的员工数,更新department部门表的各对应部门人数。
员工表employee表结构如下:
update department,
(select dept_id,count(*) as snum from employee group by dept_id)as num1
set emp_num = snum
where num1.dept_id = department.dept_id;
UPDATE department, (select dept_id,count(
) as snum from employee group by dept_id) as num1
表示要更新部门表 department 中的数据,并使用子查询 (select dept_id,count(
) as snum from employee group by dept_id) as num1
来获取每个部门的员工人数信息。
set emp_num = snum
表示将部门表 department 中的 emp_num 字段设置为子查询 num1 中的 snum 字段,即将每个部门的员工人数信息更新到部门表中。
where num1.dept_id = department.dept_id
表示将子查询 num1 的结果与部门表 department 进行关联,只更新那些部门的员工人数信息,其部门编号在子查询 num1 中也存在。
综上所述,这条 SQL 语句的作用是将每个部门的员工人数信息更新到部门表 department 中。子查询 num1 用于计算每个部门的员工人数并将结果存储在一个临时表 num1 中。在主查询中,使用 num1 表来获取每个部门的员工人数信息,并将其更新到部门表的 emp_num 字段中。WHERE 子句中的条件用于将临时表 num1 的结果与部门表 department 进行关联,只更新那些部门的员工人数信息,其部门编号在临时表 num1 中也存在。