数据库实验报告1-SQL语言

(1)实验目的

通过本次实验,使学生能够熟练运用SQL语言进行数据查询和数据更新,以及对基本表、视图、索引的管理。

(2)实验要求

熟悉实验室实验环境,阅读本次实验预备知识,熟悉基本表、视图、索引的基本概念,了解基本表、视图、索引的基本管理语法,熟悉查询语句和更新语句的基本语法。实验中根据实验步骤要求书写相应的SQL代码并运行,记录和分析运行结果,使用代码验证SQL代码执行后是否满足步骤要求,并独立完成实验报告。

实验内容1:

–1.创建学生选课关系数据库中的STUDENT表

create table student
(
sno char(9) primary key,
sname char(20) unique,
ssex char(3),
sage smallint,
sdept char(20)
);

–2.创建学生选课关系数据库中的COURSE表;

create table course
(
cno char(4) primary key,
cname char(20),
cpno char(4),
ccredit smallint
);

–3.创建学生选课关系数据库中的SC表;

create table sc
(
sno char(9),
cno char(4),
grade smallint
);

–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);
commit;

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

–值为null

alter table student add Senrollment date;

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

alter table student modify  ssex char(6);

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

alter table student drop column Senrollment;

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

create view ds(sname,ssex,sno, sage, sdept) as
select student.sname,student.ssex,student.sno, student.sage, student.sdept from student,sc where student.sno=sc.sno and sc.cno='1';

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

create view malesutdent(sname,ssex,sno, sage, sdept) as
select sname,ssex,sno,sage, sdept from student where ssex='男' 
with check option;

–10.删除视图maleStudent;

drop view malestudent;

–11.为Course表的CName列建立唯一索引,索引名称为uniqueCname;是否能够为Course表的Cpno列建立唯一索引?为什么?

–不能,因为每个索引值只对应唯一的数据记录

create unique index uniqueCname on course(cname);

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

create index indexcpno2 on course(cpno);

–13.删除索引indexCpno2;

drop index indexcpno2;

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

–没有失败

drop table student;

–15.删除基本表SC;

drop table sc;

实验内容2:

–1.查询系号为“d001”的所有教师的教工号、名称和工资;

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

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

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

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

select distinct tno from tm where pno is not null;

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

select tname,2022-extract(year from tbirthday) from teacher where tname like '%小%';

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

select tname,2022-extract(year from tbirthday) from teacher where tname like '_小%';

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

select tname,2022-extract(year from tbirthday) from teacher where tname not like '李%' and tname like '___';

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

select dno,dname from department where dname in(select dname from department where tno is not null);

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

select tno, tname, tsex, tsalary, tbirthday, dno from teacher where tsex='女'  or tsalary>4000;

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

select pno,count(tno) as 总人数 from tm group by pno;

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

select count(pno) from myproject where tno in (select tno from teacher where tname='张三');

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

select avg(tsalary) as 平均工资,sum(tsalary) as 工资总和,max(tsalary) as 最高工资,min(tsalary) as 最低工资 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 department,departmentSalary where department.dno=departmentSalary.dno;

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

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

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

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

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

1.子查询:select tno, tname, tsex, tsalary, tbirthday, dno from teacher where tsalary in(select tsalary from teacher where tname='李小龙');

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

select  teacher.tno, tname, tsex, tsalary, tbirthday,dno,tm.pno from teacher,tm where teacher.tno=tm.tno and tm.pno='p0002' and teacher.tsalary>4000;

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

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

–内层是查询同一个系中的教师平均工资,至于是哪个系的平均工资要看参数x.dno的值

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

select * from teacher where tsalary>all(select tsalary from teacher where dno='d001') and dno!='d003';

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

select tno,tname from teacher where tno  not in(select tno from tm where pno='p0001');

–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='d001';

–23.查询工资大于3500并且不在计算机科学系工作的教师详细信息(要求使用关键字MINUS);

select * from teacher where tsalary>3500 minus select * from teacher where dno!='d001';

实验内容3:

–1.列出Teacher表的所有约束,并说明每个约束的具体含义及其对表列取值的影响;

外键约束:外键是用来控制数据库中数据的完整性的,对一个表的数操作时,和它关联的一个或多个表的数据同时发生改变。

constraint FK_DEPARTME_MANAGE_TEACHER foreign key (TNO) references Teacher (TNO);
constraint FK_MYPROJEC_PROJECTMA_TEACHER foreign key (TNO) references Teacher (TNO);
constraint FK_TM_TM_TEACHER foreign key (TNO) references Teacher (TNO);
constraint FK_TEACHER_BELONGTO_DEPARTME foreign key (DNO) references Department (DNO);

主键约束:主键是能确定一条记录的唯一标识,带有主键约束的值不能为null也不能重复

constraint PK_TEACHER primary key (TNO);
Not Null约束:不接受NULL值
TNO                  VARCHAR2(20)         not null,
DNO                  VARCHAR2(10)         not null,
TName                NVARCHAR2(20)        not null,
TSex                 VARCHAR2(3)          not null,
TBirthday            DATE                 not null

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

select * from teacher;
insert into teacher(tno, tname, tsex, tbirthday, dno) values('t009', '陈小明', '男',To_date('12-10月-1987', 'DD-mon-yyyy'), 'd001');
insert into teacher(tno, tname, tsex, tbirthday, dno) values('t010', '陈小红', '女',To_date('11-10月-1987', 'DD-mon-yyyy'), 'd002');

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

create table teacher2 as select * from teacher;

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

insert into teacher2(tno, tname, tsex, tsalary, tbirthday, dno)  select tno, tname, tsex, tsalary, tbirthday, dno from teahcer where tsex='男';

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

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

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

delete from teacher2 where dno='d001';

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

delete from teacher2;

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

alter table teacher2 add constraint PK_TEACHER2 primary key(tno);

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

alter table teacher2 add unique(tname);

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

alter table teacher2 add constraint FK_TEACHER2_DEARTMENT foreign key(dno) referenceS department(dno) on delete cascade;

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

insert into department(dno,dname) values('xyz','网络安全系');

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

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

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

delete from department where dno='d001';

–违反完整约束条件

delete from department where dno='xyz';

–成功

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

select * from tm;
insert into tm(tno,pno) values('t005','p0001');

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

update teacher set tsalary=tsalary+100;

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

update teacher set tsalary=tsalary+100 where dno='d001';

–16.创建两个视图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('t011', '陈小雪', '女', 4000, To_date('1-1月-1988', 'DD-mon-yyyy'), 'd002'); 

–插入成功

insert into VT2(tno, tname, tsex, tsalary, tbirthday, dno) values('t012', '陈小白', '女', 4000, To_date('1-1月-1990', 'DD-mon-yyyy'), 'd002'); 

–插入失败,WITH CHECK OPTION 表示对视图进行UPDATE,INSERT和DELETE操作时要保证更新,插入或删除的行满足视图定义中的谓词条件,女教师不满足性别为男的这个条件,所以插入失败


如果大家想要**实验内容2跟实验内容3的初始化代码**,可以私信我
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此为吉林大学数据库实验报告,实验内容为: 实验一 熟悉MySQL环境及SQL定义语言 一、实验目的: 1. 了解MySQL程序构成、安装、管理方法。 2. 了解MySQL数据库及表结构。 3. 熟练掌握SQL语言进行基本表结构的创建。 4. 熟练应用SQL语言进行表结构的修改。 5. 掌握SQL语言进行基本表的删除。 6. 掌握SQL语言进行索引的建立和删除。 二、实验内容和主要步骤: 1. 参考“MYSQL简体中文参考文档.chm”,熟悉MySQL构成和功能特性。 2. 打开Windows服务管理器,实验启动、停止MySQL服务,了解MySQL的服务管理方法; 3. 打开“MySQL管理控制台.bat”,熟悉控制台中操作数据库; 4. 利用控制台创建“Student数据库”。 5. 打开“Student”数据库,创建如下三个表,按下面的列表中的字段名(英文)、类型和宽度建立: 7. 用SQL语言CREATE TABLE语句创建学生表student、课程表course和选课表SC;(字段类型及长度参照实验一) 8. 用SQL语言ALTER语句修改表结构; a) STUDENT表中SNO设为非空和唯一; b) STUDENT表中增加一个字段SBIRTH,类型设置为日期时间类型,增加一个ADDRESS字段,类型为文本(字符); c) 删除STUDENT表中ADDRESS字段; d) COURSE表中CNO字段设为非空和唯一; 9. 重新定义一个简单表,然后用SQL语言DROP语句删除该表结构; 10. 用SQL语言CREATE INDEX语句定义表STUDENT的SNAME字段的降序索引; 11. 用SQL语言CREATE INDEX语句定义表SC的GRADE字段的升序索引; 12. 用SQL语言DROP语句删除索引; 13. 输入部分数据,并试着修改其中的错误; 注: 实验二 SQL语言进行简单查询 一、实验目的: 1. 掌握SQL查询语句的一般格式 2. 掌握简单数据查询操作。 3. 熟练掌握各种查询条件的表示。 4. 掌握排序和分组操作在SQL语句中的实现。 5. 掌握集函数的使用。 二、实验内容和主要步骤: 1. 创建学生表student、课程表course和选课表SC,并输入数据(注意数据的完整性。);(可以使用实验一中已经建立的表和数据) 2. 对各表中的数据进行不同条件的查询; 1) 查询全体学生的学号和姓名 2) 查询全体学生的详细记录 3) 查询所有选修过课程的学生学号 4) 查询考试有不及格的学生学号 5) 查询不是信息系(IS)、计算机系(CS)的学生性别、年龄、系别 6) 查询选修了4号课的学生学号和成绩,结果按成绩降序排列 7) 查询每个课程号和相应的选课人数 8) 查询计算机系(CS)的学生姓名、年龄、系别 9) 查询年龄18-20岁的学生学号、姓名、系别、年龄; 10) 查询姓刘的学生情况 11) 查询既选修1号课程,又选修2号课程的学生学号 12) 查询学生的姓名和出生年份(今年2003年) 13) 查询没有成绩的学生学号和课程号 14) 查询总成绩大于200分的学生学号 15) 查询每门课程不及格学生人数 16) 查询不及格课程超过3门的学生学号 17) 查询年龄在10到19岁之间的学生信息 18) 查询全体学生情况,按所在系升序排列,同一个系的学生按年龄降序排列 19) 查询选了1号课程的学生平均成绩 20) 查询选了3号课程的学生的最高分 21) 查询每个同学的总成绩 实验三 SQL进行复杂查询 一、实验目的: 1. 熟练掌握各种连接查询及其连接条件。 2. 掌握各种嵌套查询的使用。 3. 掌握复杂的集合查询。 二、内容和主要步骤: 1.实验一中的数据为基础 2.对各表中的数据进行不同条件的连接查询和嵌套查询; 1) 查询每个学生及其选课情况; 2) 查询每门课的间接先修课 3) 将STUDENT,SC进行右连接 4) 查询有不及格的学生姓名和所在系 5) 查询所有成绩为优秀(大于90分)的学生姓名 6) 查询既选修了2号课程又选修了3号课程的学生姓名、学号; 7) 查询和刘晨同一年龄的学生 8) 选修了课程名为“数据库”的学生姓名和年龄 9) 查询其他系比IS系任一学生年龄小的学生名单 10) 查询其他系中比IS系所有学生年龄都小的学生名单 11) 查询选修了全部课程的学生姓名 12) 查询计算机系学生及其性别是男的学生 13) 查询选修课程1的学生集合和选修2号课程学生集合的差集 14) 查询李丽同学不学的课程的课程号 15) 查询选修了3号课程的学生平均年龄 16) 求每门课程学生的平均成绩 17) 统计每门课程的学生选修人数(超过3人的才统计)。要求输出课程号和选修人数,结果按人数降序排列,若人数相同,按课程号升序排列 18) 查询学号比刘晨大,而年龄比他小的学生姓名。 19) 求年龄大于女同学平均年龄的男同学姓名和年龄 20) 求年龄大于所有女同学年龄的男同学姓名和年龄 21) 查询至少选修了95002选修的全部课程的学生号码 22) 查询95001和95002两个学生都选修的课程的信息 实验四 SQL的常用数据更新操作 一、实验目的: 1. 熟练掌握SQL的常用数据更新操作。 2. 熟练应用INSERT,UPDATE,DELETE语句。 3. 掌握更新操作的各种格式。 二、实验内容和主要步骤 1. 应用INSERT,UPDATE,DELETE语句进行更新操作; 1) 插入如下学生记录(学号:95030,姓名:李莉,年龄:18) 2) 插入如下选课记录(95030,1) 3) 计算机系学生年龄改成20 4) 数学系所有学生成绩改成0 5) 把低于总平均成绩的女同学成绩提高5分 6) 修改2号课程的成绩,若成绩小于75分提高5%,成绩大于75时提高 7) 4%(两个语句实现,注意顺序) 8) 删除95030学生信息 9) 删除SC表中无成绩的记录 10) 删除张娜的选课记录 11) 删除数学系所有学生选课记录 12) 删除不及格的学生选课记录 13) 查询每一门课程成绩都大于等于80分的学生学号、姓名和性别,把值送往另一个已经存在的基本表STU(SNO,SNAME,SSEX)中 14) 把所有学生学号和课程号连接追加到新表中 15) 所有学生年龄增1 16) 统计3门以上课程不及格的学生把相应的学生姓名、系别追加到另外一个表中 2.熟练掌握INSERT,UPDATE,DELETE语句并能综合应用;
2008数据库实验 1.SQL SEVER 2000的系统工具、使用交互方式建库、建表 2.T—SQL的简单查询、连接查询 3.子查询及组合 4.数据控制、数据导入/导出、数据备份和恢复 实验1 SQL SEVER 2000的系统工具、使用交互方式建库、建表实验 实验目的和要求:了解SQL SEVER 2000的功能及组成,熟练掌握利用SQL SEVER 2000企业管理器和查询分析器创建数据库、表、索引和修改表结构及向数据库输入数据、修改数据和删除数据的操作方法和步骤,掌握定义数据约束条件的操作。 实验内容和步骤: (1)熟悉SQL SEVER 2000的界面和操作。 (3)熟悉企业管理器和查询分析器的界面和操作。 (3)创建数据库和查看数据库属性。 (4)创建表、确定表的主码和约束条件。 (5)查看和修改表的结构。 (6)向数据库输入数据,观察违反列级约束时出现的情况。 (7)修改数据。 (8)删除数据,观察违反表级约束时出现的情况。 实验2 T—SQL的简单查询、连接查询 实验目的和要求:,了解SQL语句的数据定义与数据更新功能,了解SQL语句的查询功能,掌握SQL中的数据定义语句的用法,熟练掌握SQL中的插入、修改和删除语句的操作,熟练掌握使用SQL语句进行数据库的简单查询、连接查询。 实验内容和步骤: (1)在SQL SEVER 2000的查询分析器里,用SQL语句建库、建表并插入记录。 (2)修改表结构,包括修改属性列的数据类型,增加新的属性列,删除已有的属性列。 (3)使用单个元组和多元组插入。 (4)简单查询操作,包括投影、选择、数据排序、模糊匹配查询等。如果结果不正确,要进行修改,直至正确为止。 (5)连接查询操作,包括等值连接、自然连接、一般连接、自身连接、外连接。 实验3 子查询及组合 实验目的和要求:了解SQL语句的查询功能,理解视图的概念。熟练掌握使用SQL语句进行数据库的嵌套查询及组合查询的操作;掌握视图创建语句和视图的使用方法,加深对视图作用的理解。 实验内容和步骤: (1)在DBMS的交互式环境里,用SQL语句建库、建表并插入记录。 (2)使用In、比较符和Exists操作符进行嵌套查询操作。 (3)分组查询,包括分组条件表达、选择组条件表达的方法。 (4)集合查询。 (5)使用视图创建语句建视图,通过视图查询数据 (6)带子查询的修改和删除 (7)通过视图修改和删除数据 实验4 数据控制、数据的导入/导出、数据库备份和恢复 实验目的和要求:掌握数据控制(安全性)的方法,了解SQL SEVER 2000的数据备份和恢复机制,掌握SQL SEVER 2000中数据库备份和恢复的方法。 实验内容和步骤: (1)使用SQL对数据进行安全性控制,包括授权和权利收回。 (2)查看授权和权利收回后的结果 (3)SQL SEVER 2000工具对表中的数据导出到其它格式的文件。 (4)将其它格式的文件数据导入到数据库中。 (5)使用SQL SEVER 2000工具创建一个数据库的备份(海量备份、增量备份)。 (6)使用SQL SEVER 2000工具及所创建的数据库备份恢复这个数据库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值