插入数据
插入单个元组
格式:
INSERT
INTO <表名> [(<属性列1>,<属性列2>…)]
VALUES (<常量1>[,<常量2>]…)
【注意】
INTO子句:指定要插入数据的表名及属性列名
- 属性列的顺序可以与表定义中的顺序不一致
- 没有指定任何属性列:默认要插入的是一条完整的元组,且数据顺序与表定义中的属性列顺序一致
- 指定部分属性列:插入元组在其余属性列上取空值
例:将一个新生记录(学号:95020;姓名:陈东;性别:男;所在院系:IS;年龄:18)插入Student表中
INSERT
INTO Student
VALUES('95020','陈东','男','IS',18)
例:插入一条选课记录('95020','1')
INSERT
INTO SC(Sno,Cno) --可以指明列
VALUES('95020','1') --新插入的记录在Score列上取空值
插入多个元组
例:插入3条选课记录('95020','1',90)、('95010','1',60)、('95010','3',50)
INSERT
INTO SC VALUES
('95020','1',90),
('95010','1',60),
('95010','3',50)
插入子查询结果
格式:
INSERT
INTO <表名>[(<属性列1>[,<属性列2>]…)]
子查询
例:对每一个系求学生的平均年龄,并把结果存入数据库
#step 1 在数据库中建立一个有两个属性列的新表,其中一列存放系名,另一列存放相应系的学生平均年龄
CREATE TABLE Deptage
(Sdept VARCHAR(15)
Avgage SMALLINT)
#step 2 对Student表按系分组求平均年龄再把系名和平均年龄存入新表中
INSERT
INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept
修改数据
格式:
UPDATE <表名>
SET <列名> = <表达式>[,<列名> = <表达式>]…
[WHERE <条件>]
例:将所有学生的年龄增加1岁,性别设置为默认值'男'
UPDATE Student
SET Sage = Sage+1,Ssex = default
例:将计算机系全体学生的成绩置零
UPDATE SC
SET Score = 0
WHERE Sno IN --子查询嵌套在UPDATE语句中
(SELECT Sno
FROM Student
WHERE Student.Sdept = 'CS')
【重点】修改操作与数据库的一致性
例:学号为95007的学生因病休学一年,复学后需要将其学号改为96089
#step 1 修改Student表
UPDATE Student
SET Sno = '96089'
WHERE Sno = '95007'
#step 2 修改SC表
UPDATE SC
SET Sno = '96089'
WHERE Sno = '95007'
删除数据
DELETE语句
格式:
DELETE
FROM <表名>
[WHERE <条件>]
【注意】DELETE语句删除的是表中数据并非关于表的定义
例:删除学号为95019的学生记录(SC,Student)
#step 1 删除SC表中关于95019学生的选课记录
DELETE
FROM SC
WHERE Sno = '95019'
#step 2 删除Student表中关于95019学生的信息
DELETE
FROM Student
WHERE Sno = '95019'
#此时同样会遇到UPDATE操作中提到的数据不一致问题,因此必须保证这两条语句都做,要么都不做,解决这一问题数据库系统引入了事务概念
TRUNCATE语句
使用TRUNCATE可以快速删除表中的所有行且无日志记录,只记录整个数据页的释放操作
例:删除所有学生的选课记录
TRUNCATE --与不含WHERE子句的DELETE语句等价,只删除行,不删除表本身
FROM SC