oracle 数据库基本操作二——数据操纵语言
- (插入数据) 按前面各表中的数据分别插入到教学数据库的四个数据库表中。将自己的信息作为数据插入到学生表(学号的后5位作为学生表的学号),向Score表中插入相应的选课数据。
insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('96001','马小燕','CS','01','女','21'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('96002','黎明','CS','01','男','18'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('96003','刘东明','MA','01','男','18'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('96004','赵志勇','IS','02','男','20'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('97001','马蓉','MA','02','女','19'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('97002','李成功','CS','01','男','20'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('97003','黎明','IS','03','女','19'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('97004','李丽','CS','02','女','19'); insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('96005','司马志明','CS','02','男','18');
insert into Student(SNO,SNAME,SDEPT,SCLASS,SSEX,SAGE) values('74277','**晨','CS','01','男','20');insert into Course(CNO,CNAME,CTIME) values('001','数学分析','144'); insert into Course(CNO,CNAME,CTIME) values('002','普通物理','144'); insert into Course(CNO,CNAME,CTIME) values('003','微机原理','72'); insert into Course(CNO,CNAME,CTIME) values('004','数据结构','72'); insert into Course(CNO,CNAME,CTIME) values('005','操作系统','64'); insert into Course(CNO,CNAME,CTIME) values('006','数据库原理','64'); insert into Course(CNO,CNAME,CTIME) values('007','DB_Design','48'); insert into Course(CNO,CNAME,CTIME) values('008','程序设计','56'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('王成刚','男','004',to_date('1999-9-5','yyyy-mm-dd'),'CS'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('李正科','男','003',to_date('1999-9-5','yyyy-mm-dd'),'CS'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('严敏','女','001',to_date('1999-9-5','yyyy-mm-dd'),'MA'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('赵高','男','004',to_date('1999-9-5','yyyy-mm-dd'),'IS'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('李正科','男','003',to_date('2000-2-23','yyyy-mm-dd'),'MA'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('刘玉兰','女','006',to_date('2000-2-23','yyyy-mm-dd'),'CS'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('王成刚','男','004',to_date('2000-2-23','yyyy-mm-dd'),'IS'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('马跃','女','008',to_date('2000-9-6','yyyy-mm-dd'),'CS'); insert into Teach(TNAME,TSEX,CNO,TDATE,TDEPT) values('王成刚','男','007',to_date('1999-9-5','yyyy-mm-dd'),'CS'); insert into Score(SNO,CNO,SCORE) values('96001','001','77.5'); insert into Score(SNO,CNO,SCORE) values('96001','003','89'); insert into Score(SNO,CNO,SCORE) values('96001','004','86'); insert into Score(SNO,CNO,SCORE) values('96001','005','82'); insert into Score(SNO,CNO,SCORE) values('96002','001','88'); insert into Score(SNO,CNO,SCORE) values('96002','003','92.5'); insert into Score(SNO,CNO,SCORE) values('96002','006','90'); insert into Score(SNO,CNO,SCORE) values('96005','004','92'); insert into Score(SNO,CNO,SCORE) values('96005','005','90'); insert into Score(SNO,CNO,SCORE) values('96005','006','89'); insert into Score(SNO,CNO,SCORE) values('96005','007','76'); insert into Score(SNO,CNO,SCORE) values('96003','001','69'); insert into Score(SNO,CNO,SCORE) values('97001','001','96'); insert into Score(SNO,CNO,SCORE) values('97001','008','95'); insert into Score(SNO,CNO,SCORE) values('96004','001','87'); insert into Score(SNO,CNO,SCORE) values('96003','003','91'); insert into Score(SNO,CNO,SCORE) values('97002','003','91'); insert into Score(SNO,CNO,SCORE) values('97002','004',''); insert into Score(SNO,CNO,SCORE) values('97002','006','92'); insert into Score(SNO,CNO,SCORE) values('97004','005','90'); insert into Score(SNO,CNO,SCORE) values('97004','006','85'); insert into Score(SNO,CNO,SCORE) values('97004','008','75'); insert into Score(SNO,CNO,SCORE) values('97003','001','59'); insert into Score(SNO,CNO,SCORE) values('97003','003','58');
- (多行插入) 将表Student中在计算机系(‘CS’)的学生数据插入到表Student_Temp中。(以上操作中,注意用COMMIT提交数据,将数据保存到数据库服务器)
insert into student_temp(sno,sname,sd,sa) select sno,sname,sdept,sage from student where sdept='CS'; commit;
- (利用查询来实现表的定义与数据插入) 求每一个学生的平均成绩,把结果存入数据库表Student_Gr中。
create table student_gr ( sno char(5) not null,sname char(16),avgs number(5,2));
insert into student_gr(sno,sname,avgs) select score.sno,sname,avg(score) from student,score
where student.sno=score.sno group by score.sno,sname; - (修改数据) 将Student_Temp表中所有学生的年龄加2。
update student_temp set sa=sa+2;
- (修改数据) 将Course表中‘程序设计’课时数修改成与‘数据结构’的课时数相同。
update course set ctime = (select ctime from course where cname='数据结构') where cname = '程序设计';
- (插入数据) 向Score表中插入数据(‘98001’, ‘001’, 95),根据返回信息解释其原因。
SQL> insert into score(sno,cno,score) values('98001','001',95); insert into score(sno,cno,score) values('98001','001',95) * 第 1 行出现错误: ORA-02291: 违反完整约束条件 (SUNC.S_SNO_FK) - 未找到父项关键字 SQL> select * from student where sno = '98001'; 未选定行
原因:Score表受sunc.s_sno_fk外键在Student表中的约束,因为Student表中没有学号为'98001'的同学,故在Score表中无法插入此条数据。
- (插入数据) 向Score表中插入数据(‘97001’, ‘010’, 80),根据返回信息解释其原因。
SQL> insert into score(sno,cno,score) values('97001','010',80); insert into score(sno,cno,score) values('97001','010',80) * 第 1 行出现错误: ORA-02291: 违反完整约束条件 (SUNC.S_CNO_FK) - 未找到父项关键字 SQL> select * from student where sno = '97001'; SNO SAGE SDEP SSEX SCLA SNAME ---------- ---------- ---- ------ ---- -------------------------------- 97001 19 MA 女 02 马蓉 SQL> select * from course where cno = '010'; 未选定行
原因:Score表中有两个外键,必须同时满足Student和Course中对应的键,有一个不存在都不可以在Score表中插入数据
- (删除数据) 删除Student表中学号为‘96001’的学生信息,根据返回信息解释其原因。
SQL> delete from student where sno = '96001'; delete from student where sno = '96001' * 第 1 行出现错误: ORA-02292: 违反完整约束条件 (SUNC.S_SNO_FK) - 已找到子记录 SQL> select * from score where sno = '96001'; SNO CNO SCORE ---------- ------ ---------- 96001 001 78 96001 003 89 96001 004 86 96001 005 82
原因:受外键的约束,子表已经存在此外键信息,故不能删除;
通过子查询查询子表,查到关于学号为96001的同学已存在的数据,如果要让Student表删除掉学号为96001的同学,必须先从子表开始删除数据; - (删除数据) 删除Course表中课程号为‘003’ 的课程信息,根据返回信息解释其原因。
SQL> delete from course where cno = '003'; delete from course where cno = '003' * 第 1 行出现错误: ORA-02292: 违反完整约束条件 (SUNC.TEACH_CNO_FK) - 已找到子记录
SQL> select * from course where cno = '003'; CNO CNAME CTIME ------ ---------------------------------------- ---------------- 003 微机原理 72
原因:受外键的约束,子表已经存在此外键信息,故不能删除;
通过子查询查询子表,查到关于课程号为‘003’的同学已存在的数据,如果要让Course表删除掉课程号为‘003’的同学,必须先从子表开始删除数据; - (删除数据) 删除学生表Student_Temp中学号以96打头的学生信息。(此操作后,注意用ROLLBACK回退可能更新的数据)
delete from student_temp where sno like '96%'; //回退数据 rollback;
- (删除数据) 删除数据库表Student_Temp中所有学生的数据。
delete from student_temp;
- (删除表) 删除数据库表Student_Temp和Student_Gr。
drop table student_temp; drop table student_gr;
创建表时一定要细心,在插入数据是出现各种各样的错误,最后通过修改表的属性等操作终于完成了数据插入;
用to_date('2000-2-23','yyyy-mm-dd')在插入数据时设置时间格式;
alter session set nls_date_format='yyyy-mm-dd';将日期设置成年月日格式;
因为同一个课程可以多位老师教学,所以不需要设置主键,否则数据插入会出现问题;
在使用相似匹配时依然用等号,导致不知错在哪,最后查阅资料发现是like!