头歌-数据库原理与应用

目录

实验一 表的建立、修改和删除

第1关 创建表

第2关 修改表结构

第3关 删除表

实验二 对表插入、修改和删除数据

第1关 插入数据

第2关 修改数据1

第3关 修改数据2

第4关 删除数据

实验三 简单查询

第1关:简单查询一

第2关:简单查询二

第3关:简单查询三

实验四 子查询

第1关 子查询一

第2关 子查询二

第3关 子查询三

第4关 带子查询的增删改

实验五 聚合查询

第1关:查询统计一

第2关:查询统计二

第3关:查询统计三

第4关:查询统计四

实验六 约束与索引

第1关:添加约束一

第2关:添加约束二

第3关:添加约束三

第4关:创建索引


实验一 表的建立、修改和删除

第1关 创建表

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、创建Student表”的SQL语句 ********** --
create table Student(Sno char(10) primary key,Sname varchar(20),Ssex char(2),Sage smallint,Sdept varchar(20));


-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、创建Course表”的SQL语句 ********** --
create table Course(Cno char(10) primary key,Cname varchar(20),Cpno char(10),Ccredit smallint);


-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、创建SC表”的SQL语句 ********** --
create table SC(Sno char(10),Cno char(10),primary key(Sno,Cno),Grade smallint);


-- ********** End ********** --

GO

第2关 修改表结构

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、添加phone列”的SQL语句 ********** --
alter table Student add phone char(12);


-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、删除Cpno列”的SQL语句 ********** --
alter table Course drop column Cpno;


-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON


-- ********** Begin ********** --
-- ********** 此处写“3、修改sdept列”的SQL语句 ********** --
alter table Student alter column sdept varchar(30);


-- ********** End ********** --

GO

第3关 删除表

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、删除三张表”的SQL语句 ********** --
drop table SC;
drop table Student;
drop table Course;


-- ********** End ********** --
GO

实验二 对表插入、修改和删除数据

第1关 插入数据

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、为Student表插入两行”的SQL语句 ********** --
insert into Student values('001','Smith','m',18,'CS');
insert into Student values('002','Ketty','f',19,'MA');

-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、为Course表插入两行”的SQL语句 ********** --
insert into Course values('C01','DB',null,2);
insert into Course values('C02','Oracle','C01',3);

-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、为SC表插入3行”的SQL语句 ********** --
insert into SC values('001','C01',70);
insert into SC values('001','C02',82);
insert into SC values('002','C01',86);


-- ********** End ********** --
go

第2关 修改数据1

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、将不及格的学生成绩加5分”的SQL语句 ********** --
update SC set grade=grade+5 where grade<60;


-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、将CS系男同学的年龄加1”的SQL语句 ********** --
update Student set Sage=Sage+1 where Sdept='CS'; 

-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** 此处写“3、将学生的学号前加上‘S’(其中S要大写)”的SQL语句 ********** --
update Student set Sno='S'+sno;


-- ********** End ********** --

GO

第3关 修改数据2

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、将学生的学号前的‘S’删掉”的SQL语句 ********** --
update Student set Sno=substring(Sno,2,4);


-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、在学生学号的后面加上‘S’”的SQL语句 ********** --
update Student set Sno=substring(Sno,1,4)+'S';


-- ********** End ********** --

GO

第4关 删除数据

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、在SC表中删除成绩为空的选课信息”的SQL语句 ********** --
delete from SC where grade is null;


-- ********** End ********** --

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、删除年龄等于18岁的女同学”的SQL语句 ********** --
delete from Student where sage=18 and ssex='f';


-- ********** End ********** --

GO

sql3.sql 

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、删除学分为3分的课程”的SQL语句 ********** --
delete from course where ccredit=3;


-- ********** End ********** --
GO

实验三 简单查询

第1关:简单查询一

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询CS系男同学的学号,姓名,年龄”的SQL语句 ********** --
select sno,sname,sage
from Student
where Sdept='CS' and Ssex='m';
-- ********** End ********** --
GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询不及格的学生选课信息,列出学号,课程号,成绩”的SQL语句 ********** --
select sno,cno,grade
from SC
where grade<60;
-- ********** End ********** --
GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、查询先行课程不为空的课程(使用*表示查询结果)”的SQL语句 ********** --
select *
from Course
where cpno is not null;
-- ********** End ********** --
GO

sql4.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“4、查询姓名中带有'n'字母的学生的学号,姓名(使用like语句)”的SQL语句 ********** --
select sno,sname
from Student
where sname like '%n%';
-- ********** End ********** --
GO

sql5.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“5、使用distinct关键字查询学生表中不同的系,列出系(去除重复元祖)”的SQL语句 ********** --
select distinct sdept
from Student;

-- ********** End ********** --
GO

第2关:简单查询二

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询90分以上学生的选课信息,列出学号,姓名,课程号,成绩”的SQL语句 ********** --
select Student.sno,Student.sname,SC.cno,Sc.grade
from Student,SC
where SC.grade>90
and Student.sno=SC.sno;
-- ********** End ********** --

GO

sql2.sql 

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询‘DB’课程的选课情况,列出学号,成绩”的SQL语句 ********** --
select SC.sno,SC.grade
from Course,SC
where Course.cname='DB'
and Course.cno=SC.cno;
-- ********** End ********** --

GO

第3关:简单查询三

sql1.sql


USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询CS系的学生选择‘DB’课程的情况,列出学号,成绩”的SQL语句 ********** --
Select SC.sno,SC.grade
from Student,Course,SC
where Student.sdept='CS'
and Course.cname='DB'
and Student.sno=SC.sno
and Course.cno=SC.cno;
-- ********** End ********** --

GO

sql2.sql 


USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询女同学的选课情况,列出学号,课程号,课程名,成绩”的SQL语句 ********** --
Select SC.sno,SC.cno,Course.cname,SC.grade
from Student,Course,SC
where Student.ssex='f'
and Student.sno=SC.sno
and Course.cno=SC.cno;
-- ********** End ********** --

GO

实验四 子查询

第1关 子查询一

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询CS系学生选择的课程,列出学号,课程号,成绩”的SQL语句 ********** --
Select sno,cno,grade
from SC
where sno in (
    Select sno
    from Student
    where sdept='CS'
);
-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询没有选C06(课程号)课程的同学的学号,姓名,性别”的SQL语句 ********** --
Select sno,sname,ssex
from Student
where sno not in (
    Select sno
    from SC
    where cno='c06'
);
-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、查询成绩最高的选课信息,列出学号,课程号和成绩”的SQL语句 ********** --
Select sno,cno,grade
from SC
where grade >= all(
    Select grade
    from SC
);
-- ********** End ********** --

GO

第2关 子查询二

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询CS系没有选择'DB'课程学生的姓名,列出学生姓名”的SQL语句 ********** --
Select sname
from Student
where sdept='CS' and sno not in (
    Select sno
    from SC
    where cno in (
        Select cno
        from Course
        where cname = 'DB'
    )
);
-- ********** End ********** --

GO

sql2.sql 

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询'DB'课程考最高分的选课信息。列出学号,课程号,成绩”的SQL语句 ********** --
Select sno,cno,grade
from SC
where grade >= all(
    Select grade
    from SC
    where cno in (
        Select cno
        from Course
        where cname='DB'
    )
) and cno in (
    Select cno
    from Course
    where cname = 'DB'
);
-- ********** End ********** --

GO

第3关 子查询三

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询选修了先行课为'DB'的课程的学生,列出学生学号,姓名,性别,所在系”的SQL语句 ********** --
Select sno,sname,ssex,sdept
from Student
where sno in (
    Select sno
    from SC
    where cno in (
        Select cno
        from Course
        where cpno = (
            Select cno
            from Course
            where cname='DB'
        )
    )
)

-- ********** End ********** --

GO

第4关 带子查询的增删改

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、将'DB'课程不及格的成绩加5分”的SQL语句 ********** --
update SC
set grade=grade+5
where grade < 60 and cno=(
    Select cno
    from Course
    where cname='DB'
)
-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、删除'English'(课程名)课程CS系学生的选课记录”的SQL语句 ********** --
delete from SC 
where cno = (
    Select cno
    from Course
    where cname='English'
) and sno in (
    Select sno
    from Student
    where sdept='CS'
)
-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、为CS系添加必修课,课程号为C02”的SQL语句 ********** --
insert into SC
select sno,'C02',null 
from Student 
where sno not in (
    select Student.sno 
    from Student,SC 
    where Student.sno = SC.sno and SC.cno = 'C02') and sdept = 'CS';
-- ********** End ********** --

GO

实验五 聚合查询

第1关:查询统计一

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询‘001’号的学生不及格的课程数,列出不及格课程数(列名为:scnt)”的SQL语句 ********** --
Select count(Sno) as scnt
from SC
where Sno = '001' and Grade < 60
Group by Sno;
-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询每个学生不及格的课程数,列出学号和不及格课程数(列名为:scnt)”的SQL语句 ********** --
Select sno,count(sno) as scnt
from SC
where Grade < 60
Group by sno;
-- ********** End ********** --

GO

sql3.sql 

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、查询每个系女同学的平均年龄,列出所在系和平均年龄(列名为:sageavg)”的SQL语句 ********** --
Select sdept,avg(sage) as sageavg
from Student
where ssex = 'f'
Group by sdept;
-- ********** End ********** --

GO

第2关:查询统计二

sql1.sql


USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询Niki(姓名)同学的平均分,列出平均分(列名为:savg)”的SQL语句 ********** --
Select Avg(grade) as savg
From SC
Where sno in (
    Select sno
    From Student
    Where sname = 'Niki'
);
-- ********** End ********** --

GO

sql2.sql


USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询CS系每个同学的平均分,列出学号和平均分(列名为:savg)”的SQL语句 ********** --
Select sno,Avg(grade) as savg
From SC
Where sno in (
    Select sno
    From Student
    Where sdept = 'CS'
)
Group by sno;

-- ********** End ********** --

GO

sql3.sql


USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、查询学分为2的每门课程的选课人数,列出课程号和选课人数(列名为:scnt)”的SQL语句 ********** --
Select cno,Count(cno) as scnt
From SC
Where cno in (
    Select cno
    From course
    where ccredit = 2
)
Group by cno;
-- ********** End ********** --

GO

第3关:查询统计三

sql1.sql


USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询平均分最高的学生的姓名”的SQL语句 ********** --
Select sname
From Student
Where sno in (
    Select sno
    From sc
    group by sno,grade
    having avg(grade) >= all(
        select avg(grade)
        from sc
        group by grade
    )
);

-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、查询不及格人数大于等于2人的课程,列出课程号,课程名,不及格人数(列名为scnt)”的SQL语句 ********** --
Select course.cno,cname,count(sno) scnt 
from course,sc
Where course.cno=sc.cno and grade < 60
group by course.cno,cname
having count(sno)>=2;
-- ********** End ********** --

GO

第4关:查询统计四

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、查询E系平均成绩最高的同学的姓名,列出姓名”的SQL语句 ********** --
select sname
from SC,Student
where Student.sdept='E' and Student.sno=SC.sno
group by sname
having avg(grade) >= all(
    select avg(grade) 
    from SC,Student 
    where Student.sno=SC.sno and sdept='E'
    group by SC.sno);
-- ********** End ********** --

GO

实验六 约束与索引

第1关:添加约束一

 sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、为Student表的Sage列添加约束,使其取值小于30岁(约束名:stu_chk_sage)”的SQL语句 ********** --
alter table student
add constraint stu_chk_sage check(sage<30);

-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、为student表的Ssex列添加约束,使其只能取值‘m’或‘f’(约束名:stu_chk_ssex)”的SQL语句 ********** --
alter table student
add constraint stu_chk_ssex check(ssex='f' or ssex='m');


-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、为Student表的ssex列添加缺省约束,缺省值为‘m’(约束名:stu_def_ssex)”的SQL语句 ********** --
alter table student
add constraint stu_def_ssex default'm' for ssex;

-- ********** End ********** --

GO

第2关:添加约束二

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、为SC表的sno列添加外码(约束名:stu_ref_sno)”的SQL语句 ********** --
alter table sc
add constraint stu_ref_sno foreign key(sno) references student(sno);


-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、为SC表的cno列添加外码(约束名:stu_ref_cno)”的SQL语句 ********** --
alter table sc
add constraint stu_ref_cno foreign key(cno) references course(cno);

-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、为SC表的grade列添加检查约束(1到100分)(约束名:stu_chk_grade)”的SQL语句 ********** --
alter table sc
add constraint stu_chk_grade check(grade between 1 and 100);

-- ********** End ********** --

GO

第3关:添加约束三

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、为Course表的cname列添加唯一约束(约束名:Course_un_cname)”的SQL语句 ********** --
alter table course
add constraint Course_un_cname unique(cname);

-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、为Course表的ccredit列添加检查约束,使其值为(1到10之间)(约束名:Course_chk_ccredit)”的SQL语句 ********** --
alter table course
add constraint Course_chk_ccredit check(ccredit between 1 and 10);

-- ********** End ********** --

GO

sql3.sql 

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、为Course表的cpno列添加外码约束(约束名:Course_ref_cpno)”的SQL语句 ********** --
alter table course
add constraint Course_ref_cpno foreign key(cpno) references course(cno);

-- ********** End ********** --

GO

第4关:创建索引

sql1.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“1、为Student表的sname列创建唯一索引(索引名:idx_student_sname)”的SQL语句 ********** --
create unique index idx_student_sname on student(sname);


-- ********** End ********** --

GO

sql2.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“2、为sc表的grade列创建降序索引(索引名:idx_sc_grade)”的SQL语句 ********** --
create index idx_sc_grade on sc(grade desc);


-- ********** End ********** --

GO

sql3.sql

USE CS_yx_DB
GO
SET NOCOUNT ON

-- ********** Begin ********** --
-- ********** 此处写“3、为course表的ccredit列创建升序索引(索引名:idx_course_cname)”的SQL语句 ********** --
create index idx_course_cname on course(ccredit asc);


-- ********** End ********** --

GO

未完待续。。。。

猜你喜欢

转载自blog.csdn.net/somewon/article/details/129498839