数据库系统实验
班 级 姓 名 学 号 任课教师
计算机学院
.
.
实验一:基本SQL语言
1. 实验目标
1.1. 熟练掌握基本的SQL语言。能够利用SQL定义语言(DDL)
创建、删除和修改数据库的基本对象(表、视图、约束和索引等),利用SQL查询语言(Select)对数据中数据进行检索,利用SQL修改语言(Insert、Update、Delete)对数据中数据进行插入、修改和删除操作。能够利用SQL控制语言(DCL)将数据库的基本对象(表和视图等)的各种权限授予其它用户。
1.2. 熟悉SQL Server 2000的交互式SQL语言的操作环境。能够
利用查询分析器进行SQL语言的编辑和提交。
2. 实验要求
2.1. 写出以下各个实验的SQL语句。
2.2. 在SQL Server 2000的查询分析器环境中执行SQL语句,写
出每次执行的结果。
2.3. 对于错误的执行结果,分析产生错误的原因,并写出纠正错
误的方案。
2.4. SQL语句的书写规范,要求每个查询子句独占一行,如:
Select SNO, SNAME From S
Where Sage>=20 ;
注意:每次实验之后请作好数据库备份。下次实验之前进行数据库恢复。
3. 实验课时
本次实验共计10课时。
4. 实验数据
本次实验中用到6个关系表(当前用户):COURSE(课程)、DEPT(系)、S(学生)、PROF(教师)、PC(授课)、SC(选修)。
.
.
4.1. 关系模式。
SSNOSNAMESEXAGEDNO SC SNOCNOSCORECOURSECNO CNAME PCNOCREDIT PC PNOCNODEPT DNO DNAME DEAN PROF PNO PNAME SAL AGE DNO 4.2. 6个关系表的定义。 ⑴ COURSE(课程) 字段 名称 CNO CNAME PCNO CREDIT 课程号 课程名 先修课程号 学分 类型 VARCHAR(10) VARCHAR(10) VARCHAR(10) REAL 说明 PK,NOT NULL NOT NULL ⑵ DEPT(系)
字段 DNO DNAME DEAN
名称 系号 系名 系主任号 类型 VARCHAR(10) VARCHAR(10) VARCHAR(10) 说明 PK,NOT NULL NOT NULL 系主任作为教师的编号 ⑶ S(学生) 字段 SNO SNAME .
名称 学生号 学生名 类型 VARCHAR(10) VARCHAR(10) 说明 PK,NOT NULL NOT NULL .
SEX AGE DNO 性别 年龄 所在系号 VARCHAR(10) REAL VARCHAR(10) 0,女;1,男 FK ⑷ PROF(教师) 字段 名称 PNO PNAME SAL AGE DNO 教师号 教师名 工资额 年龄 所在系号 类型 VARCHAR(10) VARCHAR(10) FLOAT REAL VARCHAR(10) 说明 PK,NOT NULL NOT NULL FK ⑸ SC(选修) 字段 名称 SNO CNO SCORE 学生号 课程号 成绩 类型 VARCHAR(10) VARCHAR(10) REAL 说明 PK, NOT NULL FK FK ⑹ PC(授课) 字段 名称 PNO CNO 学生号 课程号 类型 VARCHAR(10) VARCHAR(10) 说明 PK, NOT NULL FK FK 4.3. 6个关系表的元组数据。 ⑴ COURSE(课程) CNO CNAME C1 C2 C3 C4 C5 C6 C7 C8 C9 数据库 离散数学 组合数学 操作系统 数据结构 近世代数 高等数学 C语言 数理逻辑 C5 C7 C2 C9 C2 C7 C2 PCNO 4 2 2 4 3 2 4 2 4 CREDIT .
.
⑵ DEPT(系) DNO D1 D2 D3 DNAME P01 P04 P07 DEAN 计算机 数学 物理 ⑶ S(学生) SNO SNAME S1 S2 S3 S4 S5 S6 S7 S8 宋江 吴用 鲁智深 孙二娘 林冲 李逵 武松 扈三娘 1 1 1 0 1 1 1 0 SEX 59 48 42 40 51 46 36 30 AGE D1 D1 D1 D2 D2 D2 D3 D3 DNO ⑷ PROF(教师) PNO PNAME P1 P2 P3 P4 P5 P6 P7 P8 P9 刘备 诸葛亮 关羽 曹操 司马懿 张辽 孙权 周瑜 鲁肃 SAL 1800 1600 1400 2200 2000 1700 2100 1900 1500 59 48 40 61 46 66 30 50 AGE D1 D1 D1 D2 D2 D2 D3 D3 D3 DNO ⑸ SC(选修) SNO S1 S1 S1 S1 S1 .
CNO C1 C2 C3 C4 C5 80 60 40 90 70 SCORE .
S1 S1 S1 S1 S2 S2 S2 S2 S3 S3 S4 S4 S4 S4 S4 S4 S4 S4 S4 S5 S5 S5 S5 S5 S6 S6 S6 S6 S7 S7 S7 S7 S7 S7 S7 S7 .
C6 C7 C8 C9 C1 C2 C3 C4 C5 C6 C1 C2 C3 C4 C5 C6 C7 C8 C9 C3 C4 C5 C6 C7 C1 C2 C3 C4 C1 C2 C3 C4 C5 C6 C7 C8 60 50 70 80 80 60 40 90 70 60 70 60 55 85 70 70 80 40 70 40 90 70 60 50 80 60 40 90 30 80 40 70 80 60 90 50 .
S7 S8 S8 S8 C9 C2 C3 C4 80 60 55 85 ⑹ PC(授课) PNO P1 P2 P3 P4 P5 P6 P7 P8 P9 C1 C2 C3 C4 C5 C6 C7 C8 C9 CNO
.
.
5. 实验步骤
5.1. SQL Server 2000数据库的安装、启动和创建新的数据库。
SQL Server 2000已安装在本机,一般采用的是Windows认证方式。因此当你以默认Windows用户administrator登陆进window操作系统之后,你就可以直接通过服务管理器启动SQL Server 2000。
.
.
启动成功之后的状态如下(启动成功之后,可以关闭服务管理器):
之后可以通过打开查询分析器登陆到SQL Server 2000,建立和DBMS的会话。
.
.
利用此windows默认用户身份登录SQL Server
Windows的系统管理员默认对应SQL Server的系统管理员用户sa。因此,当你以windows的系统管理员身份登陆到SQL Server之
.
.
后,你在SQL Server中对应的用户名就是sa。你可以对SQL Server执行任何操作了(当然你也可以创建一个新的用户,该用户最好在windows和SQL Server中以相同的名字同时创建)。
利用企业管理器创建新的数据库test。test数据库作为本次实验用数据库,在test数据库中创建本次实验的所有数据库对象。
5.2. Create语句
利用Create语句创建以上6个关系表。同时利用Insert语句将实验数据插入到相应的表中。
1) 创建COURSE(课程)的Create语句。 表的创建SQL语句、出现的主要错误及原因:
CREATE TABLE COURSE( CNO VARCHAR(10) PRIMARY KEY NOT NULL, CNAME VARCHAR(10) NOT NULL, PCNO VARCHAR(10), CREATIT REAL)
向表插入数据的SQL语句、出现的主要错误及原因:
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C1','数据库','C5',4)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C2','离散数学','C7',2)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C3','组合数学','C2',2)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C4','操作系统','C9',4) .
.
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C5','数据结构','C2',3)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C6','近世代数','C7',2)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C7','高等数学',NULL,4)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C8','C语言','C2',2)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C9','数理逻辑',NULL,4)
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C1','数据库','C5',’4’)
中,字符型varchar类型的要用单引号,数字型的real,float类型的不用加单引号,上面的’4’应改为4
INSERT INTO COURSE(CNO,CNAME,PCNO,CREATIT) values('C9','数理逻辑',’’,4)
VALUES值中若为空,应写为NULL,不是用两个单引号表示
2) 创建DEPT(系)的Create语句。
表的创建SQL语句、出现的主要错误及原因:
CREATE TABLE DEPT( DNO VARCHAR(10) PRIMARY KEY NOT NULL, DNAME VARCHAR(10) NOT NULL, DEAN VARCHAR(10))
.
.
向表插入数据的SQL语句、出现的主要错误及原因:
INSERT INTO DEPT(DNO,DNAME,DEAN) VALUES('D1','计算机','P01')
INSERT INTO DEPT(DNO,DNAME,DEAN) VALUES('D2','数学','P04')
INSERT INTO DEPT(DNO,DNAME,DEAN) VALUES('D3','物理','P07')
3) 创建S(学生)的Create语句。
表的创建SQL语句、出现的主要错误及原因:
CREATE TABLE S(
SNO VARCHAR(10) PRIMARY KEY NOT NULL, SNAME VARCHAR(10) NOT NULL, SEX VARCHAR(10) CHECK(SEX=0 OR SEX=1), AGE REAL ,
DNO VARCHAR(10) FOREIGN KEY REFERENCES DEPT(DNO) NOT NULL) .
.
有外键约束时格式为 DNO VARCHAR(10) FOREIGN KEY REFERENCES DEPT(DNO) NOT NULL
向表插入数据的SQL语句、出现的主要错误及原因:
INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S1','宋江','1',59,'D1')
INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S2','吴用','1',48,'D1')
INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S3','鲁智深','1',42,'D1') INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S4','孙二娘','0',40,'D2') INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S5','林冲','1',51,'D2')
INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S6','李逵','1',46,'D2')
INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S7','武松','1',36,'D3')
INSERT INTO S(SNO,SNAME,SEX,AGE,DNO) VALUES('S8','扈三娘','0',30,'D3')
.
.
4) 创建PROF(教师)的Create语句。
表的创建SQL语句、出现的主要错误及原因:
CREATE TABLE PROF( PNO VARCHAR(10) PRIMARY KEY NOT NULL, PNAME VARCHAR(10) NOT NULL, SAL FLOAT, AGE REAL, DNO VARCHAR(10) FOREIGN KEY REFERENCES DEPT(DNO) NOT NULL)
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P1','刘备',1800,59,'D1')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P2','诸葛亮',1600,48,'D1')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P3','关羽',1400,NULL,'D1')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P4','曹操',2200,40,'D2')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P5','司马懿',2000,61,'D2')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P6','张辽',1700,46,'D2')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P7','孙权',2100,66,'D3')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P8','周瑜',1900,30,'D3')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) .
.
VALUES('P9','鲁肃',1500,50,'D3')
向表插入数据的SQL语句、出现的主要错误及原因:
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P1','刘备',1800,59,'D1')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P2','诸葛亮',1600,48,'D1')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P3','关羽',1400,NULL,'D1')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P4','曹操',2200,40,'D2')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P5','司马懿',2000,61,'D2')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P6','张辽',1700,46,'D2')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P7','孙权',2100,66,'D3')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P8','周瑜',1900,30,'D3')
INSERT INTO PROF(PNO,PNAME,SAL,AGE,DNO) VALUES('P9','鲁肃',1500,50,'D3')
5) 创建SC(选修)的Create语句。
CREATE TABLE SC( SNO VARCHAR(10) FOREIGN KEY REFERENCES S(SNO) NOT NULL, CNO VARCHAR(10) FOREIGN KEY REFERENCES COURSE(CNO) NOT NULL, SCORE REAL, PRIMARY KEY(SNO,CNO))
有多个字段的约束必须定义为表的约束形式 .
.
当SNO,CNO都是主键时格式应为: PRIMARY KEY(SNO,CNO)
向表插入数据的SQL语句、出现的主要错误及原因:
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C1',80)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C2',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C3',40)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C4',90)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C5',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C6',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C7',50)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C8',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S1','C9',80) .
.
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S2','C1',80)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S2','C2',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S2','C3',40)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S2','C4',90)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S3','C5',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S3','C6',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C1',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C2',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C3',55)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C4',85)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C5',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C6',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C7',80)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C8',40)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S4','C9',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S5','C3',40)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S5','C4',90) .
.
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S5','C5',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S5','C6',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S5','C7',50)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S6','C1',80)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S6','C2',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S6','C3',40)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S6','C4',90)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C1',30)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C2',80)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C3',40)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C4',70)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C5',80)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C6',60)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C7',90)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C8',50)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S7','C9',80)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S8','C2',60) .
.
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S8','C3',55)
INSERT INTO SC(SNO,CNO,SCORE) VALUES ('S8','C4',85)
6) 创建PC(授课)的Create语句。
表的创建SQL语句、出现的主要错误及原因:
CREATE TABLE PC(
PNO VARCHAR(10) FOREIGN KEY PROF(PNO) NOT NULL, CNO VARCHAR(10) FOREIGN KEY COURSE(CNO) NOT NULL)
REFERENCES REFERENCES
向表插入数据的SQL语句、出现的主要错误及原因:
INSERT INTO PC(PNO,CNO) VALUES('P1','C1') INSERT INTO PC(PNO,CNO) VALUES('P2','C2') INSERT INTO PC(PNO,CNO) VALUES('P3','C3') .
.
INSERT INTO PC(PNO,CNO) VALUES('P4','C4') INSERT INTO PC(PNO,CNO) VALUES('P5','C5') INSERT INTO PC(PNO,CNO) VALUES('P6','C6') INSERT INTO PC(PNO,CNO) VALUES('P7','C7') INSERT INTO PC(PNO,CNO) VALUES('P8','C8') INSERT INTO PC(PNO,CNO) VALUES('P9','C9')*/
5.3. Select语句
7) 给出所有老师的信息。
该查询的SQL语句、出现的错误及原因:
SELECT * FROM PROF
8) 出所有老师的姓名及税后工资额(税额5%)。 该查询的SQL语句、出现的错误及原因:
SELECT PNAME,SAL*0.95 FROM PROF
9) 找出所有选修课程的学生。
该查询的SQL语句、出现的错误及原因:
.
.
SELECT distinct SNO FROM SC
[all]在实际代码中,不加[],否则无效
10) 找出工资低于1500的职工的姓名、工资、系名。 该查询的SQL语句、出现的错误及原因:
select PNAME,SAL,DNAME FROM PROF,DEPT WHERE SAL<1500
AND PROF.DNO=DEPT.DNO
11) 列出教授“数学”课程的老师的教工号及姓名。 该查询的SQL语句、出现的错误及原因:
SELECT PROF.PNO,PNAME FROM PROF,PC,COURSE WHERE PROF.PNO=PC.PNO AND PC.CNO=COURSE.CNO AND COURSE.CNAME='数学'
数学,在查询中应该为'哲学',在做只是链接时,需要对PNO前加限制,否则会出现对象不明确
12) 列出工资在500~800之间的老师姓名。 该查询的SQL语句、出现的错误及原因:
SELECT PNAME FROM PROF
WHERE SAL BETWEEN 500 AND 800
.
.
13) 给出所有老师的姓名,所纳税额及税后工资额(税额5%)。 该查询的Select语句:
该查询的SQL语句、出现的错误及原因:
SELECT PNAME,SAL*0.05 AS TAX,SAL*0.95 AS INCOME FROM PROF
%号不识别,应该写成小数形式
14) 求每一课程的间接先行课(即先行课的先行课)。 该查询的SQL语句、出现的错误及原因:
SELECT C1.CNO,C2.CNO
FROM COURSE AS C1,COURSE AS C2 WHERE C1.PCNO=C2.CNO
15) 找出工资比所在系主任工资高的老师姓名及工资。 该查询的SQL语句、出现的错误及原因:
SELECT P1.PNAME,P1.SAL
FROM PROF AS P1,PROF AS P2,DEPT WHERE P1.DNO=DEPT.DNO
AND DEPT.DEAN=P2.PNO AND P1.SAL>P2.SAL
16) 求选修了C1或C2课程的学生姓名。 该查询的SQL语句、出现的错误及原因:
SELECT SNAME FROM S,SC
WHERE SC.SNO=S.SNO
.
.
AND (SC.CNO='C1' OR SC.CNO='C2')
SELECT SNAME FROM S,SC
WHERE S.SNO=SC.SNO
AND CNO IN ('C1','C2')
17) 列出姓名以“张”打头的教师的所有信息。 该查询的SQL语句、出现的错误及原因:
SELECT *
FROM PROF
WHERE PNAME LIKE '张%'
18) 列出名称中含有4个字符以上,且倒数第3个字符是“d”,
倒数第2个字符是“_”的教师的所有信息。 该查询的SQL语句、出现的错误及原因: SELECT *
FROM PROF
WHERE PNAME LIKE '%d\\__'escape '\\'
19) 按系名升序列出老师姓名,所在系名,同一系中老师按姓名
降序排列。
该查询的SQL语句、出现的错误及原因: SELECT PNAME,DEAN FROM PROF,DEPT
WHERE PROF.DNO=DEPT.DNO ORDER BY DEAN ASC,PNAME DESC
20) 求选修了C1或C2号而没有选C3号课程的学生号。
.
.
该查询的SQL语句、出现的错误及原因:
SELECT DISTINCT SNO FROM SC
WHERE CNO IN ('C1','C2') AND CNO NOT IN ('C3')
21) 列出各系的老师的最高、最低、平均工资。 该查询的SQL语句、出现的错误及原因:
SELECT DNO,MAX(SAL),MIN(SAL),AVG(SAL) FROM PROF GROUP BY DNO
22) 列出计算机系总分超过300分的学生的平均成绩及学号。该查询的SQL语句、出现的错误及原因: SELECT AVG(SCORE),S.SNO FROM S,SC,DEPT
WHERE S.DNO=DEPT.DNO AND DNAME='计算机' AND S.SNO=SC.SNO GROUP BY S.SNO
HAVING SUM(SCORE)>=300
23) 列出选修了两门课程以上的学生的平均成绩及学号。 该查询的SQL语句、出现的错误及原因: SELECT AVG(SCORE),SNO FROM SC
GROUP BY SNO
HAVING COUNT(*)>=2
24) 求选修了课程的学生人数。
该查询的SQL语句、出现的错误及原因:
SELECT COUNT(DISTINCT SNO)
.
.
FROM SC
25) 求各系60岁以上老师的平均工资。 该查询的SQL语句、出现的错误及原因: SELECT AVG(SAL) FROM PROF WHERE AGE>60 GROUP BY DNO
26) 找出年龄值为空的老师姓名。
该查询的SQL语句、出现的错误及原因: SELECT PNAME FROM PROF
WHERE AGE IS NULL
27) 列出选修了C1号和C2号课程的学生的学号。 该查询的SQL语句、出现的错误及原因: SELECT SNO FROM SC
WHERE CNO='C1' AND SNO IN (SELECT SNO FROM SC
WHERE CNO='C2' )
28) 找出平均成绩最高的学生号。
该查询的SQL语句、出现的错误及原因: SELECT SNO FROM SC
GROUP BY SNO
HAVING AVG(SCORE)>=ALL (SELECT AVG(SCORE) FROM SC GROUP BY SNO)
.
.
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。要加上all
29) 求S1号学生所选课程的课程记录。 该查询的SQL语句、出现的错误及原因: SELECT *
FROM COURSE WHERE EXISTS (SELECT * FROM SC
WHERE SC.CNO=COURSE.CNO AND SC.SNO='S1')
30) 列出选修了所有课程的学生名。
该查询的SQL语句、出现的错误及原因:
SELECT SNAME FROM S
WHERE NOT EXISTS (SELECT * FROM COURSE WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.CNO=COURSE.CNO AND SC.SNO=S.SNO) )
31) 列出至少选修了S1号学生选修的所有课程的学生名。 该查询的SQL语句、出现的错误及原因: SELECT SNAME FROM S
.
.
WHERE NOT EXISTS ( SELECT * FROM SC SC1 WHERE SC1.CNO='S1' AND NOT EXISTS (SELECT * FROM SC SC2 WHERE SC2.CNO=SC1.CNO AND SC2.SNO=S.SNO) )
32) 找出所有只教授一门课程的老师姓名。 该查询的SQL语句、出现的错误及原因:
SELECT PNAME FROM PROF WHERE PNO IN (SELECT PNO FROM PC GROUP BY(PNO) HAVING COUNT(PNO)=1)
UNIQUE在查询分析器中不识别,用IN以及GROUP BY来实现相同功能
33) 找出至少选修了两门课程的学生姓名。 该查询的SQL语句、出现的错误及原因: SELECT SNAME FROM S WHERE SNO IN (SELECT SNO FROM SC GROUP BY(SNO) HAVING COUNT(SNO)>=2)
.
.
34) 找出平均成绩及格的学生及其平均分数。 该查询的SQL语句、出现的错误及原因:
SELECT SNAME,AVG_SCORE
FROM S,(SELECT SNO,AVG(SCORE) FROM SC GROUP BY SNO HAVING AVG(SCORE)>=60) AS SC_AVG(SNO,AVG_SCORE) WHERE S.SNO=SC_AVG.SNO
利用派生关系解决属性之间的问题,重新生成一个临时表并加以引用
5.4. Insert语句
35) 将平均成绩大于60的学生加入到EXCELLENT中(先自行
定义创建EXCELLENT表)。
该插入的SQL语句、出现的错误及原因: CREATE TABLE EXCELLENT( SNO VARCHAR(10), SCORE REAL)
INSERT INTO EXCELLENT(SNO,SCORE) SELECT SNO,AVG(SCORE) FROM SC
GROUP BY SNO
HAVING AVG(SCORE)>90
5.5. Update语句
36) 将老师工资上调5%。
该更新的SQL语句、出现的错误及原因:
UPDATE PROF
SET SAL=SAL*1.05
37) 将D1系系主任的工资改为该系的平均工资。
.
.
该更新的SQL语句、出现的错误及原因:
UPDATE PROF
SET SAL=(SELECT AVG(SAL) FROM PROF WHERE DNO='D1' )
WHERE PNO=(SELECT DEAN FROM DEPT WHERE DNO='D1' )
38) 工资超过2000的缴纳10%所得税,其余的缴纳5%所得税。
求教师的税后工资。
该更新的SQL语句、出现的错误及原因: UPDATE PROF SET SAL=SAL*0.9 WHERE SAL>2000
UPDATE PROF
SET SAL=SAL*0.95 WHERE SAL<=2000
39) 将计算机系学生的选课成绩上调20%。 该更新的SQL语句、出现的错误及原因:
UPDATE SC
SET SCORE=SCORE*1.2 WHERE EXISTS (SELECT *
FROM S,DEPT
WHERE S.DNO=DEPT.DNO AND DEPT.DNAME='计算机' AND S.SNO=SC.SNO)
5.6. Delete语句
40) 删除张辽老师所有的任课记录。
.
.
该删除的SQL语句、出现的错误及原因:
DELETE FROM PC WHERE PNO IN (SELECT PNO FROM PROF WHERE PNAME='张辽')
DELETE语句中不能使用连接,应该考虑使用子查询 并且from后面的表明只能为一个
41) 清除EXCELLENT表中所有记录。 该删除的SQL语句、出现的错误及原因:
DELETE FROM EXCELLENT
42) 删除低于平均工资的老师记录。
该删除的SQL语句、出现的错误及原因:
DELETE FROM PROF
WHERE SAL<(SELECT AVG(SAL) FROM PROF)
DELETE 语句与 COLUMN REFERENCE 约束 'FK__PC__PNO__72C60C4A' 冲突。该冲突发生于数据库 'test',表 'PC', column 'PNO'。
43) 删除没有选课的学生记录。
该删除的SQL语句、出现的错误及原因:
DELETE FROM S
WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.SNO=S.SNO)
.
.
5.7. Alter和Drop语句
44) 自己设计利用Alter修改EXCELLENT关系表的定义(包括
字段的定义和表约束的定义)。
该修改的SQL语句、出现的错误及原因: 字段约束:
ALTER TABLE EXCELLENT ADD SNAME VARCHAR(10) 表约束:
ALTER TABLE EXCELLENT ADD CHECK (SCORE>92)
45) 利用Drop语句删除EXCELLENT关系表的定义。 该删除的SQL语句、出现的错误及原因:
DROP DATABASE EXCELLENT
5.8. Grant和Revoke语句
按以下各图创建一个用户,利用Grant和Revoke语句授予和收回表的各种权限。根据以下几个图示进行实验。 46) 授权1的Grant和Revoke语句。
.
.
A1GRANTWITH GRANT OPTION授权14B2GRANTWITH GRANT OPTIONA:REVOKEREVOKE路径C3GRANTD
该授权的SQL语句、出现的错误及原因:
47) 授权2的Grant和Revoke语句。
.
.
授权2A3A:REVOKE1A:GRANT2B:GRANTBC 该授权的SQL语句、出现的错误及原因:
48) 授权3的Grant和Revoke语句。
.
.
A4A:REVOKE12B:GRANTB授权3A:GRANTWITH GRANT OPTIONWITH GRANT OPTIONC3C:GRANTD 该授权的SQL语句、出现的错误及原因:
.
.
49) 授权4的Grant和Revoke语句。
A4A:REVOKE13B:GRANTB授权4A:GRANTWITH GRANT OPTIONWITH GRANT OPTIONC2C:GRANTD 该授权的SQL语句、出现的错误及原因:
.
.
5.9. Index
50) 创建关系表COURSE(课程)基于列“CNAME”的索引的
Create语句。
该索引创建的SQL语句、出现的错误及原因:
CREATE INDEX CNAME_INDEX ON COURSE (CNAME)
51) 创建关系表DEPT(系)基于列“DNAME”的索引的Create
语句。
该索引创建的SQL语句、出现的错误及原因:
CREATE INDEX DNAME_INDEX ON DEPT(DNAME)
52) 创建关系表S(学生)基于列“SNAME”的索引的Create语
句。
该索引创建的SQL语句、出现的错误及原因:
CREATE INDEX SNAME_INDEX ON S(SNAME)
53) 创建关系表PROF(教师)基于列“PNAME,DNO”的联合
索引的Create语句。
该索引创建的SQL语句、出现的错误及原因:
CREATE INDEX P_INDEX ON PROF(PNAME,DNO)
54) 创建关系表SC(选修)基于列“SNO”的索引和基于列“CNO”
的索引的Create语句。
该索引创建的SQL语句、出现的错误及原因:
CREATE INDEX SC_INDEX ON SC(SNO,CNO)
.
.
55) 创建关系表PC(授课)基于列“PNO”的索引和基于列“CNO”
的索引的Create语句。
该索引创建的SQL语句、出现的错误及原因: CREATE INDEX PC_INDEX ON PC(PNO,CNO)
5.10. View
56) 创建工资少于2000元的教工视图(水平视图)。 该视图创建的SQL语句、出现的错误及原因:
CREATE VIEW P_SAL1 AS (SELECT * FROM PROF WHERE SAL<2000)
57) 创建只能访问列“PNO , PNAME , SAL”的教工视图(垂直
视图)。
该视图创建的SQL语句、出现的错误及原因:
CREATE VIEW P_SAL2
AS (SELECT PNO,PNAME,SAL FROM PROF)
58) 创建工资少于2000元且只能访问列“PNO , PNAME , SAL”
的教工视图(行列视图)。
该视图创建的SQL语句、出现的错误及原因:
CREATE VIEW P_SAL
AS (SELECT PNO,PNAME,SAL FROM PROF WHERE SAL<2000)
59) 创建可以访问列“SNO , SNAME , CNAME , SCORE”的视图
(连接视图)。
该视图创建的SQL语句、出现的错误及原因:
.
.
CREATE VIEW S_SC_C
AS(SELECT S.SNO,SNAME,CNAME,SCORE FROM S,SC,COURSE WHERE S.SNO=SC.SNO AND SC.CNO=COURSE.CNO) SNO不明确,要在sno前加限制
60) 创建每个学生的平均成绩的视图(分组视图)。 该视图创建的SQL语句、出现的错误及原因:
CREATE VIEW SC_AVG(SNO,AVG) AS (SELECT SNO,AVG(SCORE) FROM SC GROUP BY SNO)
.
.
实验二:嵌入式SQL语言
1. 实验目标
1.1. 熟练掌握数据库前端开发工具PowerBuilder的使用。能利用
PowerBuilder工具建立和Oracle数据库的连接,并利用PowerBuilder进行关系模式的定义。
1.2. 熟练掌握PowerBuilder的各种控件的使用。 1.3. 熟悉Oracle的嵌入式SQL语言。能够利用嵌入式SQL语言
实现对表数据的更新和查询。
1.4. 熟悉视图的操作。能够根据应用的需求创建视图,并实现对
视图的更新和查询。
2. 实验要求
2.1. 写出以下实验中的嵌入式SQL语句。
2.2. 在PowerBuilder所开发的界面中执行操作,写出每次执行的
结果。
2.3. 对于错误的执行结果,分析产生错误的原因,并写出纠正错
误的方案。
3. 实验课时
本次实验共计10课时。
4. 实验数据
实验一中的所有关系(1-6),以及USER关系表,该表用于管理用户的,USER关系表的定义和元组数据如下。 ⑺ USER(用户)
字段 USERID USERNAME PWD 名称 用户ID 用户名 密码 类型 VARCHAR2(10) VARCHAR2(10) VARCHAR2(10) 说明 PK,NOT NULL NOT NULL
.
.
USER(用户) USERID USERNAME 001 002 003 泰森 马拉多纳 萨达姆 PWD banana apple orange 5. 实验步骤
5.1. 安装PowerBuilder工具软件。
5.2. 启动PowerBuilder集成开发环境IDE。开发一个纯
PowerBuilder的应用程序“PBDemo1”。包括以下两种功能,要求两种功能通过菜单进行选择。 ⑴ 计算圆面积。用户输入半径的值,程序可以计算圆的面积。 给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
.
⑵ 计算正方形的面积。用户选择边长的值,程序可以计算正方形的面积。
给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
.
5.3. 创建SQL Server2000的ODBC数据源。该数据源命名为
SQLDS。步骤如下:
注意:在创建数据源之前,应启动数据库服务器,并创建一个自己的数据库(如Test)。
1、打开ODBC数据源管理器。
2、添加新的ODBC数据源。
.
.
3、选择新的ODBC数据源的驱动程序。
.
.
4、为新创建的ODBC数据源命名和选择一个Local类型的SQL Server服务器。
5、为新创建的ODBC数据源选择Window NT验证模式。
.
.
6、为新创建的ODBC数据源选择数据库(该数据库应该是自己创建的数据库)。
.
.
7、完成创建ODBC数据源,并测试新创建ODBC数据源,测试成功后在资源管理器中查看所创建的ODBC数据源,结束创建过程。
.
.
.
.
.
.
按照以上步骤创建一个SQL Server2000的ODBC数据源。该数据源对应自己创建的数据库。
5.4. 利用ODBC数据源SQLDS建立PowerBuilder和SQL
Server2000数据库Test的连接。 给出以上建立连接的关键步骤。
5.5. 利用PowerBuilder定义关系模式。关系模式包括6个表以及
一个USER表。同时还要定义6个关系表的约束。 给出以上定义关系模式的关键步骤。
.
.
5.6. 利用PowerBuilder开发应用程序“PBDemo2”。包括以下几
个功能:
⑴ 学生记录的查询和更新:提供根据学生号、学生姓名单个字段查询和组合查询学生记录的功能;同时提供对所查询出的某条学生记录的修改和删除的功能;也可以添加一条学生记录。
给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
.
⑵ 学生选课记录的查询:提供根据学生号、课程号单个字段查询和组合查询学生选课记录的功能。同时提供对所查询出的某个学生选课的成绩修改的功能,对所查询出的某个学生选课记录的删除功能;也可以添加一条学生选课记录。
给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
.
⑶ 教师平均工资的查询:根据系号查询该系教师的平均工资。
给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
.
⑷ 学生情况的查询:根据平均选课成绩查询出学生的相关情况(学生号、学生姓名、系号、系名)。
给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
.
⑸ 课程记录的修改:将课程名中包含某个字符的课程的学分增加或减少一个值,并能显示变化前后的课程记录。即用户可以在界面中输入某个字符(如“数”),输入一个值(如2),选择是“增加”还是“减少”(如选择“增加”),则程序应该能对课程名中包含“数”字符的所有课程的学分增加2个学分,修改后在界面中显示学分有变化的课程情况(包括变化前的值、变化后的值、此次变化是增加还是减少)。提示:可以增加一个关系表。
给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
.
⑹ 以上功能的切换通过菜单实现。最后对应用程序增加一个登陆界面(利用USER关系表)。
给出实现该功能所用的包括嵌入式SQL的主要程序代码、出现的主要错误及原因。
.
因篇幅问题不能全部显示,请点此查看更多更全内容