。系关系模式D(DNO,DNAME),其属性分别表示:系号、系名。
。学生关系模式S(SNO,SNAME, AGE,SEX,DNO),其属性分别表示:学号、姓名、年龄、性别,系号。
。教师关系模式T(TNO,TNAME,DNO),其属性分别表示:教师号、教师名、教师所在系的系号。
。课程关系模式C(CNO,CNAME,CREDIT,TNO),其属性分别表示:课程号、课程名、学分数、讲授课程教师号。
。选课关系模式SC(SNO,CNO,GRADE),其属性分别表示:学号、课程号、成绩。
请用SQL语句实现下列操作:
1. 假设T表已定义,请用CREATE TABLE 语句定义课程基本表S(要求有实体完整性和参照完整性约束)。
2. 将选课表SC中每个选修了课程号为“C2”的课程成绩加2分。
3. 将选课表SC中删除所有学号为“S1”的选课记录。
4. 查询没有选修课程的学生姓名。
5. 查询 所有“信息”系的教师编号和姓名。
1. 假设T表已定义,请用CREATE TABLE 语句定义课程基本表S(要求有实体完整性和参照完整性约束)。
CREATE TABLE C
(CNO INT(8) PRIMARY KEY,--主键
CNAME CHAR(20) UNIQUE, --一般课程都不会重名
CREDIT FLOAT(2) NOT NULL,--一门课不可能不标学分吧,0也算
FOREIGN KEY(TNO) REFERENCES T(TNO)--C表的TNO是外键,参照T表的TNO
);--类型后面的数字仅代表显示的内容长度,并不代表存储的空间
2. 将选课表SC中每个选修了课程号为“C2”的课程成绩加2分。
UPDATE SC
SET GRADE
WHERE CNO = 'C2';
3. 将选课表SC中删除所有学号为“S1”的选课记录。
DELETE
FROM SC
WHERE SNO = 'S1';
4. 查询没有选修课程的学生姓名。
SELECT SNAME
FROM S,SC
WHERE S.SNO NOT IN(
SELECT DISTINCT SC.SNO
FROM SC
);--先找到选课表中所有的学生学号,再看看哪个学生的学号不在选课表的学号集里面
5. 查询 所有“信息”系的教师编号和姓名。
SELECT TNO,TNAME
FROM T,D
WHERE T.DNO = D.DNO AND DNAME = '信息';
注:数据是模拟的
关系图
D、T、C、SC、S表的创建,主键、外键约束的添加
创建D表,Dno为主键
CREATE TABLE `D` (
`Dno` int NOT NULL AUTO_INCREMENT COMMENT '系号' ,
`Dname` varchar(255) NULL COMMENT '系名' ,
PRIMARY KEY (`Dno`)
)
创建T表,Tno为主键
CREATE TABLE `T` (
`Tno` int NOT NULL AUTO_INCREMENT COMMENT '教师号' ,
`Tname` varchar(255) NULL COMMENT '教师名' ,
`Dno` int NULL COMMENT '系号' ,
PRIMARY KEY (`Tno`)
)
创建C表,Cno为主键
CREATE TABLE `C` (
`Cno` int NOT NULL AUTO_INCREMENT COMMENT '课程号' ,
`Cname` varchar(255) NULL COMMENT '课程名' ,
`Credit` varchar(255) NULL COMMENT '学分数' ,
`Tno` int NULL COMMENT '教师号' ,
PRIMARY KEY (`Cno`)
)
创建SC表
CREATE TABLE `SC` (
`Sno` int NULL COMMENT '学号' ,
`Cno` int NULL COMMENT '课程号' ,
`Crade` int NULL COMMENT '成绩'
)
创建S表,Sno为主键
CREATE TABLE `S` (
`Sno` int NOT NULL AUTO_INCREMENT COMMENT '学号' ,
`Sname` varchar(255) NULL COMMENT '姓名' ,
`Age` int NULL COMMENT '年龄' ,
`Sex` varchar(255) NULL COMMENT '性别' ,
`Dno` int NULL COMMENT '系号' ,
PRIMARY KEY (`Sno`)
)
添加外键约束T_Dno,将T表的Dno设为外键,关联D表的主键Dno
ALTER TABLE `T` ADD CONSTRAINT `T_Dno` FOREIGN KEY (`Dno`) REFERENCES `D` (`Dno`)
添加外键约束C_Tno,将C表的Tno设为外键,关联T表的主键Tno
ALTER TABLE `C` ADD CONSTRAINT `C_Tno` FOREIGN KEY (`Tno`) REFERENCES `T` (`Tno`)
添加外键约束SC_Sno,将SC表的Sno设为外键,关联S表的主键Sno
ALTER TABLE `SC` ADD CONSTRAINT `SC_Sno` FOREIGN KEY (`Sno`) REFERENCES `S` (`Sno`)
添加外键约束SC_Cno,将SC表的Cno设为外键,关联C表的主键Cno
ALTER TABLE `SC` ADD CONSTRAINT `SC_Cno` FOREIGN KEY (`Cno`) REFERENCES `C` (`Cno`)
添加外键约束S_Dno,将S表的Dno设为外键,关联D表的主键Dno
ALTER TABLE `S` ADD CONSTRAINT `S_Dno` FOREIGN KEY (`Dno`) REFERENCES `D` (`Dno`)
表的数据初始化
D表
INSERT INTO `D` (`Dname`) VALUES ('信息');
INSERT INTO `D` (`Dname`) VALUES ('建筑');
INSERT INTO `D` (`Dname`) VALUES ('艺术');
T表
INSERT INTO `T` (`Tname`, `Dno`) VALUES ('T1', '1');
INSERT INTO `T` (`Tname`, `Dno`) VALUES ('T2', '2');
INSERT INTO `T` (`Tname`, `Dno`) VALUES ('T3', '3');
INSERT INTO `T` (`Tname`, `Dno`) VALUES ('T4', '1');
C表
INSERT INTO `C` (`Cname`, `Credit`, `Tno`) VALUES ('C1', '3', '2');
INSERT INTO `C` (`Cname`, `Credit`, `Tno`) VALUES ('C2', '4', '1');
INSERT INTO `C` (`Cname`, `Credit`, `Tno`) VALUES ('C3', '2', '3');
INSERT INTO `C` (`Cname`, `Credit`, `Tno`) VALUES ('C4', '4', '4');
S表
INSERT INTO `S` (`Sname`, `Age`, `Sex`, `Dno`) VALUES ('S1', '15', '男', '1');
INSERT INTO `S` (`Sname`, `Age`, `Sex`, `Dno`) VALUES ('S2', '16', '女', '2');
INSERT INTO `S` (`Sname`, `Age`, `Sex`, `Dno`) VALUES ('S3', '18', '男', '3');
SC表
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('1', '1', '60');
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('1', '2', '75');
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('1', '3', '75');
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('1', '4', '90');
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('2', '3', '80');
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('2', '1', '60');
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('3', '1', '90');
INSERT INTO `SC` (`Sno`, `Cno`, `Crade`) VALUES ('3', '3', '80');
1. 假设T表已定义,请用CREATE TABLE 语句定义课程基本表S(要求有实体完整性和参照完整性约束)。
答案参照上方创建表的过程
2、 将选课表SC中每个选修了课程号为“C2”的课程成绩加2分。
UPDATE SC set Crade=crade+2
where Cno in(
select Cno from C where Cname = "C2"
)
3. 将选课表SC中删除所有学号为“S1”的选课记录。
DELETE from SC where Sno in(
select Sno from S where Sname = "S1"
)
4. 查询没有选修课程的学生姓名。
SELECT Sname from S where Sno in(
SELECT Sno from SC group by sno having count(*) <= 0
)
注意:我初始化的数据中无没有选修课程的学生,查询出来的是null
5. 查询 所有“信息”系的教师编号和姓名。
答案1:
select T.Tno,T.Tname from D,T
where D.Dno=T.Dno
and D.Dname="信息"
答案2:
select Tno,Tname from T
where Dno in(select Dno from D where Dname = "信息")