数据库实验1-SQL语言

实验项目名称 SQL语言 指导老师 xxx
(1)实验目的
通过本次实验,使学生能够熟练运用SQL语言进行数据查询和数据更新,以及对基本表、视图、索引的管理。
(2)实验环境
熟悉实验室实验环境,阅读本次实验预备知识,熟悉基本表、视图、索引的基本概念,了解基本表、视图、索引的基本管理语法,熟悉查询语句和更新语句的基本语法。实验中根据实验步骤要求书写相应的SQL代码并运行,记录和分析运行结果,使用代码验证SQL代码执行后是否满足步骤要求,并独立完成实验报告。
(3)实验内容

实验内容第一部分
(建议先把实验内容和步骤拷贝到SQL Developer工作区,然后按步骤进行实验,后同)

  1. 创建学生选课关系数据库中的STUDENT表(特别提示:表结构见1.3节,使用指导书上的表结构是错误的,后同);
  2. 创建学生选课关系数据库中的COURSE表;
  3. 创建学生选课关系数据库中的SC表;
  4. 运行下列语句,为基本表添加数据;

–以下为学生表的初始数据

insert into Student(sname,ssex,sno, sage, sdept) values('李勇','男','200215121',20,'CS');
insert into Student(sname,ssex,sno, sage, sdept) values('刘晨','女','200215122',19,'CS');
insert into Student(sname,ssex,sno, sage, sdept) values('王敏','女','200215123',18,'MA');
insert into Student(sname,ssex,sno, sage, sdept) values('张立','男','200215125',19,'IS');

–以下为课程表的初始数据

insert into course(cno,cname,cpno,ccredit) values('6','数据处理',null,2);
insert into course(cno,cname,cpno,ccredit) values('2','数学',null,2);
insert into course(cno,cname,cpno,ccredit) values('7','PASCAL语言','6',4);
insert into course(cno,cname,cpno,ccredit) values('5','数据结构','7',4);
insert into course(cno,cname,cpno,ccredit) values('1','数据库','5',4);
insert into course(cno,cname,cpno,ccredit) values('3','信息系统','1',4);
insert into course(cno,cname,cpno,ccredit) values('4','操作系统','6',3);

–以下为选修表的初始数据

insert into sc(sno,cno,grade) values('200215121','1',92);
insert into sc(sno,cno,grade) values('200215121','2',85);
insert into sc(sno,cno,grade) values('200215121','3',88);
insert into sc(sno,cno,grade) values('200215122','2',90);
insert into sc(sno,cno,grade) values('200215122','3',80);

5.修改Student表结构,为Student表格添加一个“入学时间”属性,属性名为Senrollment,各元组在属性Senrollment的值是多少;

alter table student add Senrollment date;

6.修改Student表结构,把Ssex列的宽度设置为6个字节;

alter table student modify ssex varchar(6);	

7.修改Student表结构,删除Senrollment列(注:删除SYS模式下表的列将被拒绝);

alter table student drop column  Senrollment;

8.创建视图ds,该视图包含所有选修了“数据库”的学生信息(如果提示没有权限,请使用管理员授予当前用户Create view权限);

//grant Create view to dblesson;  //sys授权
create view ds as select * from student where sno in 
(select sno from sc where cno in(select cno from course where cname= '数据库' ));

9.创建视图maleStudent,该视图包含男学生所有信息,通过视图maleStudent更新基本表数据时必须保证学生性别为男;

create view maleStudent as select * from Student where ssex='男';

10.删除视图maleStudent;

drop view malestudent;

11.为Course表的CName列建立唯一索引,索引名称为uniqueCname;

create UNIQUE index uniqueCname on course(CName);

12.试着为Course表的Cpno列建立唯一索引,索引名为indexCpno1,如果发生错误,请说明普通索引和唯一索引有何区别;

create UNIQUE index indexcpno1 on course(CPNO);
--ORA-01452: 无法 CREATE UNIQUE INDEX; 找到重复的关键字
--唯一索引只能对应唯一数据记录.

13.为Cource表的Cpno列建立普通索引,索引名称为indexCpno2;

create  index indexcpno2 on course(CPNO);

14.删除索引indexCpno2;

drop index indexcpno2;

15.删除基本表Student,如果发生错误,请分析原因;

drop table student;
--ORA-02449: 表中的唯一/主键被外键引用
--因为主键被course引用.

16.删除基本表SC;

drop table sc;

17.参考1.3节学生选课关系数据库的表结构,列出各个关系表应有的主码和外码约束(文字回答即可);
表student的主码为sno
表course的主码为cno
表sc的主码为sno,cno

18.查看已创建的Student、SC、Course表的约束,如果某个表缺少应有的主码或外码约束,为该表添加缺失的主码或外码约束。
NULL

实验内容第二部分
本部分实验采用项目信息管理关系数据库,实验前请执行附录中项目信息管理关系数据库的DDL代码和“项目信息管理关系数据库初始化数据代码”建立基本表和插入初始化数据,后续实验也都采用项目信息管理关系数据库。
1.查询系号为“d001”的所有教师的教工号、名称和工资;

select tno,tname,tsalary from teacher where dno='d001';

2.查询工资在3000到5000之间的教师姓名、年龄(提示:可使用当前年份减去教师的出生年份,教师的出生年份可以使用函数extract(year from tbirthday)获取);

select tname,2020-extract(year from tbirthday) as age from teacher where tsalary  between 3000 and 5000;

3.查询参加了项目的教工的编号,排除相同的元素;

select UNIQUE tno from myproject;

4.查询名字中包含字“小”的教工姓名、出生日期;

select tname,tbirthday from teacher where tname like'%小%';

5.查询名字中第二个字为“小”的教工姓名、出生日期;

select tname,tbirthday from teacher where tname like'_小%';

6.查询所有不姓“李”、并且姓名为三个字的教工姓名、性别;

select tname,tsex from teacher where tname like '___' and tname not like '李%';

7.查询Department表有系主任的系号、系名称;

select DNO,Dname from department;

8.查询工资在4000以上或者性别为女的教师详细信息,按性别降序排列输出;

select * from teacher where tsex='女' or tsalary>4000 order by tsex desc; 

9.查询参与了项目的教工总人数;

select count(unique TNO) from myproject;

10.查询“张三”负责的项目数量;

select count (*) from TM where tno in (select tno from teacher where tname='张三');

11.查询所有教师的平均工资、工资总和、最高工资、最低工资;

select sum(tsalary),avg(tsalary),max(tsalary),min(tsalary) from teacher;

12.创建视图departmentSalary,查询各个系的教师的平均工资、工资总和、最高工资、最低工资;

create view departmentSalary as  select dno,avg(tsalary) as 平均工资,sum(tsalary) as 工资总和,
max(tsalary) as 最高工资,min(tsalary)as 最低工资 from teacher GROUP by dno ;

13.查询各个系的详细信息,包括各个系的教师的平均工资、工资总和、最高工资、最低工资(提示:可以使用department表与视图departmentSalary进行连接运算完成);

select * from departmentsalary;

14.查询教师平均工资大于4500的系号、系名称、平均工资(提示:要求不能使用视图departmentSalary,可把department与teacher连接后再进行分组,然后使用having子句对分组进行筛选);

select department.dno,dname,avg(tsalary) as 平均工资 from department,teacher 
where department.dno=teacher.dno having avg(tsalary)>4500 group by department.dno,dname;

15.查询教师参与项目的情况,列出教工号、姓名和项目名称,没有参与项目的教师也列出来(提示:用左外连接);

select teacher.tno,teacher.tname,myProject.pname from teacher left outer 
join myProject on(myProject.tno=teacher.tno);

16.查询与“李小龙”工资相同的教师详细信息(要求分别使用自身连接、子查询两种查询方法完成);
自身连接

select B.* from teacher A,teacher B where a.tsalary=b.tsalary and a.tname='李小龙'; 

子查询

select * from teacher where tsalary in(select tsalary from teacher where tname='李小龙');

17.查询参与了“云计算研究”并且工资在4000以上的教师详细信息;

select * from teacher where tsalary>4000 and tno in(select tno from myproject where pname='云计算研究' );

18.查询小于或等于“同一系中教师平均工资”的教工号、姓名、年龄(提示:请参阅书本的“相关子查询”示例);

select tno,tname,202-extract(year from tbirthday) as age from teacher x 
where tsalary<=(select avg(tsalary) from teacher y where x.dno=y.dno);

19.查询比“计算机科学系”教师工资都高、并且不是“网络工程系”的教师信息;

select * from teacher where dno in(select dno from department where not dname='“网络工程系' );

20.查询没有参与项目“p0001”的教工号、姓名;

select tno,tname from teacher where not tno in(select tno from department where dno='p001' );

21.查询参与了所有项目的教师姓名;

select tname from teacher where not exists(select * from myproject where not exists
(select * from tm where tno=teacher.tno and pno=myproject.pno ));

22.查询工资大于3500或者在计算机科学系工作的教师详细信息(要求使用关键字UNION);

select * from teacher where tsalary>3500 union select * from teacher 
where dno in(select dno from department where dname like '计算机科学系'); 
  1. 查询工资大于3500并且不在计算机科学系工作的教师详细信息(要求使用关键字MINUS);
select * from teacher where tsalary>3500 minus select *from teacher where dno in 
(select dno from department where dname ='计算机科学系' )

实验内容第三部分
1.列出Teacher表的所有约束,并说明每个约束的具体含义及其对表列取值的影响;

Select table_name,constraint_name,constraint_type from user_constraints where table_name='TEACHER';

2.书写SQL语句,在Teacher表中插入2条元组,元组内容任意设置,要求能取空值的列均设置为空(提示:如果插入失败,则查看是否满足基本表的约束条件);

insert into teacher(tno, tname, tsex, tbirthday, dno) values('t111', '张一', '男',
To_date('7-7-1977', 'DD-mm-yyyy'), 'd001');

insert into teacher(tno, tname, tsex, tbirthday, dno) values('t222', '张二', '男',
To_date('7-7-1977', 'DD-mm-yyyy'), 'd001');

3.利用“create table teacher2 as select * from teacher”语句创建表teacher2,并列出Teacher2表的所有约束,比较Teacher2表与Teacher表的约束差异;

create table teacher2 as select * from teacher;

select table_name,constraint_name,constraint_type from user_constraints where table_name='TEACHER';

select table_name,constraint_name,constraint_type from user_constraints where table_name='TEACHER2';

4.任取teacher表中的一条元组,把这条元组分别插入到teacher2和Teacher表中,比较两次插入操作的运行结果并分析原因(要求插入失败时必须指出违反了哪类完整性约束条件);

insert into teacher(tno, tname, tsex, tsalary, tbirthday, dno) values('t444', '张四', '男',
5000, To_date('7-7-1977', 'DD-mm-yyyy'), 'd001');

insert into teacher2(tno, tname, tsex, tsalary, tbirthday, dno) values('t444', '张四', '男',
5000, To_date('7-7-1977', 'DD-mm-yyyy'), 'd001');
--错误违反唯一约束条件 实体完整性
insert into teacher2(tno,tname,tsex,tsalary,tbirthday,dno) 

5.使用带子查询的插入语句把teacher表中的所有男教师插入到teacher2表中;

select tno,tname,tsex,tsalary,tbirthday,dno from teacher where tsex like '男';

6.为表Teacher添加check约束,使性别的取值只能为“男”或者“女”;

alter table teacher add check(tsex='男' or tsex='女');

7.删除teacher2表中工资等于6000的教师信息;

delete from teacher2 where tsalary=6000;

8.删除teacher2表中“计算机科学系”的所有教师;

delete from teacher2 where dno in(select dnofrom department where dname='计算机科学系');

9.删除teacher2表中的所有教师;

delete  from teacher2;

10.修改teacher2表,使列tno为主码,主码约束名字为PK_teacher2;

alter table teacher2 add  primary key(tno) ;

11.为teacher2表添加唯一约束,使tname的取值不能重复;

alter table teacher2 add unique(tname);

12.修改teacher2表,使列dno成为外码,引用department表的主码dno,当删除department表中的元组时,级联删除Teacher2表中的元组(提示:删除并重新创建外码约束,使用ON DELETE CASCADE选项);

alter table teacher2 add foreign key(dno) references department(dno) on delete cascade;

13.在department表中插入一个新系,系号为“xyz”,在Teacher2表中为该新系添加两个教师信息;

insert into department(dno,dname) values('xyz','xyz');

insert into teacher2(tno, tname, tsex, tsalary, tbirthday, dno) values('t001', 'Boy', '男', 6000, To_date('1-1月-1990', 'DD-mon-yyyy'), 'xyz');

insert into teacher2(tno, tname, tsex, tsalary, tbirthday, dno) values('t002', 'girl', '女', 5000, To_date('1-1月-1990', 'DD-mon-yyyy'), 'xyz');

14.分别写出删除department表中系号为d001和xyz的记录的SQL语句并执行,比较并分析执行结果(提示:在Teacher表和Teacher2表中的外码定义是不同的);

delete from department where dno='d001';
--违反完整约束条件
delete from department where dno='xyz';
--成功删除

15.在tm中插入一条元组,只设置tno、pno的值;

insert into tm(tno,pno) values('t006','p0001');

16.给teacher表中的所有教师的工资增加100;

update teacher set tsalary =tsalary+100 where dno in( select dno from department);

17.给teacher表中的“计算机科学系”教师的工资增加100;

update teacher set tsalary =tsalary+100 where dno in( select dno from department where dname='计算机工程系');

18.创建两个视图VT、VT2,两个视图均为包含所有teacher表的男教师的信息,但视图VT2的定义带有with check option选项,设置一条女教师信息记录,指出通过哪个视图可以成功插入记录,并说明with check option选项的作用;

create view VT as select * from teacher where tsex='男';

create view VT2 as select * from teacher where tsex='男' with check option;

insert into VT(tno, tname, tsex, tsalary, tbirthday, dno) values('t010', '冰冰', '女', 3000, To_date('1-1月-1990', 'DD-mon-yyyy'), 'd001'); 
--插入时需要注意不违反唯一约束条件 (DBLESSON.PK_TEACHER)
insert into VT2(tno, tname, tsex, tsalary, tbirthday, dno) values('t010', '冰冰', '女', 3000, To_date('1-1月-1990', 'DD-mon-yyyy'), 'd001'); 
--视图 WITH CHECK OPTION where 子句违规

实验总结
总结实验过程中涉及到的知识点、实验过程中遇到的问题及解决方法。
(1)基础语法学习select选择,alter table对表进行搞作,insert插入,drop删除,delect删除,update更新,create table创建表,create view创建视图
(2)在create 新表时,需要区分select * from有关联引用 和select 所有列from 没关联传参数
(3)需要提前注意限制词,插入时需要注意不违反唯一约束条件
(4)在多个表中,Select选择指定关键词选择信息,需要逻辑清晰意识到各个表之间的逻辑关系巧妙运用交并补运算
(5)存在级联关系的时候,不可以直接简单的删除基表的信息,需要从其他表逐个删除,也可以用级联删除强制删除。
(6)对已存在表插入信息时需要注意values后面跟随的关键字对齐
(7)总和sum(),平均值avg(),最大值max(),最小值min(),差集minus
(8)自身查询时可以对同个表引用两个对象,子查询可以在where中再对自身进行选择

你可能感兴趣的:(数据库)