太原理工大学软件学院 数据库实验 实验二(2021.4.8)
太原理工大学软件学院 数据库实验 实验二(2021.4.8)
实验内容
以下内容直接全部复制到console窗口即可
需要逐句运行
-- (1)创建Student表
CREATE TABLE Student
( Sno CHAR(8) PRIMARY KEY,
Sname CHAR(8) ,
Ssex CHAR(2) NOT NULL,
Sage INT,
Sdept CHAR(20)
);
-- (2)创建Course表
CREATE TABLE Course
( Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) NOT NULL,
Cpno CHAR(4) ,
Ccredit SMALLINT,
);
-- (3)创建SC表
CREATE TABLE SC(
Sno CHAR(8) FOREIGN KEY (Sno) REFERENCES Student(Sno),
Cno CHAR(4),
Grade SMALLINT,
);
-- (4)创建员工表Employee
CREATE TABLE Employee
(
编号 CHAR(8) PRIMARY KEY,
姓名 VARCHAR(8) not null
部门 CHR(40),
工资 numeric(8,2),
生日 datetime,
职称 char(20),
);
-- 指出该语句中的错误并改正后执行。
-- (5)检查表是否创建成功
-- SELECT * FROM Student
-- SELECT * FROM Course
-- SELECT * FROM SC
-- SELECT * FROM Employee
-- (6)修改表结构及约束
-- 增加班级列
ALTER TABLE Student ADD Sclass char(4)
-- 修改年龄列
ALTER TABLE Student ALTER COLUMN Sage smallint
-- 增加约束
ALTER TABLE Course ADD UNIQUE(Cname)
-- (7)删除表
DROP TABLE Employee
-- (1)为Course表按课程名称创建索引
CREATE INDEX iCname On Course(Cname)
-- (2)为Student表按学生姓名创建唯一索引
CREATE UNIQUE INDEX iSname ON Student(Sname)
-- (3)为SC表按学号和课程号创建聚集索引
CREATE CLUSTERED INDEX iSnoCno On SC(Sno,Cno desc)
-- (4)为Course表按课程号创建唯一索引
CREATE UNIQUE INDEX iSCno ON Course(Cno)
-- 3.创建视图
-- 建立信息系学生的视图:
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage FROM Student
WHERE Sdept= 'IS';
-- (1)插入到Student表
INSERT INTO Student VALUES('20100001','李勇','男',20,'CS','1001'),('20100002','刘晨','女',19,'CS','1001')
INSERT INTO Student(Sno,Sname,Ssex,Sage,Sdept,Sclass) VALUES('20100021','王敏','女',18,'MA','1002'),('20100031','张立','男',19,'IS','1003')
INSERT INTO Student(Sno,Sname,Ssex,sclass) VALUES('20100003','刘洋','女','1001')
-- 检查下列语句中的错误,并改正:
-- INSERT INTO Student(Sno,Sname,Ssex,Sage,Sdept,sclass) VALUES('20100010',赵斌,'男','19','IS','1005')
-- INSERT INTO Student VALUES('20100022','张明明',19,'男','CS','1002')
INSERT INTO Student(Sno,Sname,Ssex,Sage,Sdept,sclass) VALUES('20100010','赵斌','男','19','IS','1005')
INSERT INTO Student VALUES('20100022','张明明','男',19,'CS','1002')
-- (2)插入到Course表
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES('1','数据库系统原理', '5',4)
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES('2','高等数学', null,2)
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES('3','管理信息系统','1',4)
-- 请写出插入其余行的插入语句,并插入数据。
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES('6','数据处理',null,'2')
INSERT INTO Course(cno, cname, cpno, ccredit) values ('7','c语言',null,'4')
-- (3)插入到SC表
INSERT INTO SC VALUES('20100001','1',92)
INSERT INTO SC VALUES('20100002','2',80)
INSERT INTO SC(Sno,Cno) VALUES('20100003','1')
INSERT INTO SC(Sno,Cno,Grade) VALUES('20100010','3',null)
-- 请写出插入其余行的插入语句,并插入数据。
INSERT INTO SC VALUES('20100002','2',85)
INSERT INTO SC VALUES('20100002','3',88)
INSERT INTO SC VALUES('20100002','1',90)
-- (4)多行插入到表中
-- 创建存一个表,保存学生的学号、姓名和年龄:
CREATE TABLE cs_Student
(
学号 char(8),
姓名 char(8),
年龄 smallint
);
-- 插入数据行:
INSERT INTO cs_Student
SELECT Sno,Sname,Sage
FROM student Where Sdept='CS';
-- (5)检查插入到表中的数据
SELECT * FROM Student
SELECT * FROM Course
SELECT * FROM SC
-- 2. 修改数据
-- (1)将学生20100001的年龄改为22岁。
UPDATE student SET Sage = 22 WHERE Sno='20100001';
-- (2)将所有学生的年龄增加一岁。
UPDATE Student SET Sage = Sage +1
-- (3)填写赵斌同学的管理信息系统课程的成绩
UPDATE SC SET Grade = 85
WHERE Sno='20100010' AND Cno='3'
-- (4)将计算机科学系全体学生的成绩加5分
UPDATE sc SET Grade=Grade + 5
WHERE 'CS'=(select Sdept from student where student.Sno=sc.Sno);
-- (5)请自己完成如下操作
-- 将刘晨同学的2号课程成绩修改为80
-- 将“20100021”同学的学号修改为“20100025”
update SC set Grade=80
where Sno='20100002' and Cno=2
update Student set Sno='20100025'
where Sno='20100021'
-- (1)删除学号为201000022的学生记录
DELETE FROM Student WHERE Sno='20100022'
-- (2)删除学号20100001学生的1号课程选课记录
-- 将选课信息复制到一个临时表tmpSC中:
SELECT * INTO tmpSC FROM SC
-- 在tmpSC中执行删除操作:
DELETE FROM tmpSC WHERE Sno='20100001' and Cno='1'
-- (3)删除临时表中20100002学生的全部选课记录
delete from tmpSC where Sno='20100002'
-- (4)删除计算机科学系所有学生的选课记录
DELETE FROM tmpSC WHERE 'CS'=(select Sdept from student where student.Sno=tmpSC.Sno );
-- (5)删除全部选课记录
DELETE FROM tmpSC
-- 3.3 数据查询操作完成如下查询操作:
-- 1.单表查询
-- (1)按指定目标列查询
-- 查询学生的详细记录:
SELECT * FROM Student;
-- 查询学生的学号、姓名和年龄
SELECT Sno,Sname,Sage FROM Student;
-- 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。
SELECT Sname,'Year of Birth: ',2004-Sage,LOWER(Sdept) FROM Student;
-- 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。
SELECT Sname, 'Year of Birth:' as BIRTH, 2000-Sage BIRTHDAY, DEPARTMENT = LOWER(Sdept)
FROM Student;
-- (4)取消重复行
-- 查询选修了课程的学生学号:比较ALL和DISTINCT的区别
SELECT Sno FROM SC;
SELECT DISTINCT Sno FROM SC;
-- (5)简单条件查询
-- 查询计算机科学系全体学生的名单
SELECT Sname FROM Student WHERE Sdept='CS';
-- (6)按范围查询
-- 查询年龄在20~23岁之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23
-- (7)查询属性值属于指定集合的行
-- 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别
SELECT Sname,Ssex FROM Student WHERE Sdept IN ('IS','MA','CS');
-- (8)模糊查询
-- 查询所有姓刘学生的姓名、学号和性别
SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%'
-- (9)查询空值
-- 查询缺少成绩的学生的学号和相应的课程号
SELECT Sno,Cno FROM sc WHERE Grade is null;
-- (10)多重条件查询
-- 查询计算机科学系年龄在岁以下的学生姓名
SELECT Sname FROM student WHERE Sdept='CS' and Sage<20;
-- (11)结果集排序
-- 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
-- (12)完成下列查询
-- 查询学生基本信息,结果集属性名使用汉字
select Sno as '学号',Sname as '姓名', Ssex as '性别', Sage as '年龄' ,Sdept as '系名', Sclass as '班级' from Student ;
-- 查询信息系且年龄大于23岁同学的学号和姓名
select Sno,Sname from Student where Sage>23 and Sdept='IS';
-- 查询年龄是17、18、20、23岁同学的学号、姓名、年龄和所在系
select Sno,Sname,Sno,Sdept from Student where Sage=18 or Sage=17 or Sage=20 or Sage=23;
-- 查询年龄不在21~24岁之间的学生的姓名、系别和年龄
select Sname,Sdept,Sage from Student where Sage>24 or Sage<21;
-- 2. 分组统计 (1)聚集函数的使用
-- 查询学生总人数
SELECT COUNT(*) FROM Student;
-- 查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno) FROM SC
-- 查询最高分
SELECT MAX(Grade) FROM SC
-- (2)聚集函数作用于部分行
-- 统计2号课程的总分、均分和最高分
SELECT SUM(grade) 总分,AVG(grade) 均分,MAX(grade) 最高分
FROM sc WHERE Cno='2'
-- (3)分组统计
-- 统计各门课程的选课人数、均分和最高分
select cno 课程号,count(*) 人数,AVG(grade) 均分,MAX(grade) 最高分
from sc group by Cno
-- 统计均分大于90的课程
select cno 课程号,count(*) 人数,AVG(grade) 均分,MAX(grade) 最高分
from sc group by Cno
having AVG(grade) > 90;
-- (4)完成下面的查询
-- 统计每个同学的学号、选课数、平均成绩和最高成绩
select Sno 学号,count(cno) 选课数,AVG(Grade) 平均成绩,max(Grade) 最高成绩 from SC group by Sno
-- 统计每个班的每门课的选课人数、平均成绩和最高成绩
select Sclass 班级, Cno 课程号, count(cno) 选课数,AVG(Grade) 平均成绩,max(Grade) 最高成绩 from SC,Student where Student.Sno=SC.Sno group by Cno,Student.Sclass
-- 3.连接查询(1)在WHERE中指定连接条件
-- 查询每个参加选课的学生信息及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno
-- 查询每一门课的间接先修课
SELECT * FROM course first,course second
WHERE first.Cpno=second.Cno;
SELECT first.Cno,second.Cpno FROM course first,course second
WHERE first.Cpno=second.Cno;
-- (2)在FROM中指定连接条件
-- 查询每个参加选课的学生信息及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student JOIN SC ON (Student.Sno=SC.Sno)
-- (3)使用外连接查询
-- 查询每个学生信息及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)
-- (4)复合条件连接查询
-- 查询选修号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname
FROM Student join SC ON (Student.Sno = SC.Sno) /* 连接条件*/
WHERE SC.Cno= '2' AND SC.Grade > 90; /* 过滤条件*/
-- (5)多表查询
-- 查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
-- (6)完成下列查询
-- 查询选修了2号课程的同学的学号和姓名
select Student.Sno,Sname from Student,SC where Student.Sno=Sc.Sno and Cno='2'
-- 查询各门课程的课程号、课程名称以及选课学生的学号
select sc.Cno,Cname,Sno from Course,SC where Course.Cno=SC.Cno
-- 查询选修了数据库系统原理课程的同学的学号和姓名和成绩
select SC.Sno ,Sname,Grade from Course,Student,SC where Sc.Cno=Course.Cno and SC.Sno=Student.Sno and Cname='数据库系统原理'
-- 4.嵌套查询(1)由In引出的子查询
-- 查询与“刘晨”在同一个系学习的学生
SELECT Sno,Sname,Sdept FROM Student
WHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname= '刘晨'); (2)由比较运算符引出的子查询
-- 找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno, Cno FROM SC x
WHERE Grade >= ( SELECT AVG(Grade) FROM SC y
WHERE y.Sno=x.Sno);
-- (3)带修饰符的比较运算符引出的子查询
-- 查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
SELECT Sname,Sage FROM Student
WHERE Sage < ALL ( SELECT Sage FROM Student WHERE Sdept= 'CS')
AND Sdept <> 'CS' ;
-- (4)由EXISTS引出的子查询
-- 查询所有选修了1号课程的学生姓名
SELECT Sname FROM Student
WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= '1')
-- 5.集合查询(1)集合并
-- 查询计算机科学系的学生及年龄不大于19岁的学生
SELECT * FROM Student WHERE Sdept= 'CS'
UNION
SELECT * FROM Student WHERE Sage<=19
-- (2)集合交
-- 查询计算机科学系且年龄不大于19岁的学生
SELECT * FROM Student WHERE Sdept='CS'
INTERSECT
SELECT * FROM Student WHERE Sage<=19
-- (3)集合差
-- 查询计算机科学系且年龄大于19岁的学生
SELECT * FROM Student WHERE Sdept='CS'
EXCEPT
SELECT * FROM Student WHERE Sage <=19;
-- 3.4 视图操作
-- 建立视图并基于视图进行查询:
-- 1. 创建视图
-- (1)建立学生基本信息视图
CREATE VIEW Student_VIEW(学号,姓名,性别,年龄,系,班级)
AS
SELECT Sno,Sname,Ssex,Sage,Sdept,Sclass
FROM Student;
-- (2)建立学生均分视图
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,avg(Grade)
FROM SC GROUP BY Sno;
-- (3)建立选课信息视图
CREATE VIEW XK_VIEW
AS
SELECT Student.*,Course.*,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
-- 2. 视图查询
-- (1)查询学生基本信息
SELECT * FROM Student_VIEW
-- (2)找出每个学生超过他选修课程平均成绩的课程号
SELECT SC.Sno,Cno,grade
FROM SC, S_G
WHERE SC.Sno = S_G.Sno and Grade >= S_G.Gavg
-- (3)查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Sno,Sname,Cname,Grade
FROM XK_VIEW
-- (4)比较使用视图查询和直接从基表查询的优点