创建表student
学生表:student。表结构如下:
字段名
数据类型
长度
约束
描述
sno
char
9
非空,主键
学生ID
sname
char
4
非空
姓名
ssex
char
2
性别
sage
smallint
年龄
sdept
char
20
所在系
请用DDL语言,完成该表的创建。
CREATE TABLE student (sno CHAR(9) NOT NULL PRIMARY KEY COMMENT '学生ID', sname CHAR(4) NOT NULL COMMENT '姓名', ssex CHAR(2) COMMENT '性别', sage SMALLINT COMMENT '年龄', sdept CHAR(20) COMMENT '所在系' );
创建表course
课程表:course,表结构如下:
字段名
数据类型
长度
约束
描述
cno
char
4
非空,主键
课程ID
cname
char
40
非空
课程名
cpno
char
4
先行课(参照自身,cno)
ccredit
smallint
学分
请用DDL语言,完成该表的创建。
CREATE TABLE course (cno CHAR(4) NOT NULL PRIMARY KEY COMMENT '课程ID', cname CHAR(40) NOT NULL COMMENT '课程名', cpno CHAR(4) COMMENT '先行课(参照自身,cno)', ccredit SMALLINT COMMENT '学分', FOREIGN KEY (cpno) REFERENCES course(cno) );
创建表sc
学生选课表:sc,表结构如下:
字段名
数据类型
长度
约束
描述
sno
char
9
非空
学生ID(参照student,sno)
cno
char
4
非空
课程ID(参照course,cno)
grade
smallint
默认为null
成绩
备注:
该表的主键是sno,cno
请根据各个表的结构,完成sc表的创建。
CREATE TABLE sc (sno CHAR(9) NOT NULL COMMENT '学生ID(参照student,sno)', cno CHAR(4) NOT NULL COMMENT '课程ID(参照course,cno)', grade SMALLINT NULL COMMENT '成绩', PRIMARY KEY(sno,cno), FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) );
查询表sc——计算1号课程的学生平均成绩。
SELECT AVG(grade) FROM sc WHERE cno='1';
查询表student——查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT sname,sage FROM student WHERE sage<20;
查询表student——查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
SELECT sname,ssex FROM student WHERE sdept in ('CS','MA','IS');
查询表student——查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT sname,sdept,sage FROM student WHERE sage NOT BETWEEN 20 AND 23;
查询表sc——查询选修了课程的学生学号。(要求去掉重复)
SELECT DISTINCT sno FROM sc;
查询表student——查询计算机科学系(CS)全体学生的名单。
SELECT sname FROM student WHERE sdept='CS';
查询表student——查询全体学生的姓名、学号、所在系。
SELECT sname,sno,sdept FROM student;
查询表student——查全体学生的姓名及其出生年份
SELECT sname '姓名',2022-sage '出生年份' FROM student;
查询表sc—— 查询选修了3门以上课程的学生学号。
SELECT sno FROM sc GROUP BY sno HAVING COUNT(*)>3;
查询表sc——查询考试成绩有不及格的学生的学号
SELECT DISTINCT sno FROM sc WHERE grade<60;
查询表student——查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT sname,sno FROM student WHERE sname LIKE '_阳%';
查询表course——查询以"DB_"开头课程的详细情况。
SELECT * FROM course WHERE cname LIKE 'DB\_%';
查询表sc——查询选修了课程的学生人数。
SELECT COUNT(DISTINCT sno) FROM sc;
查询表sc——查询学生201215121选修课程的总学分数。
SELECT SUM(ccredit) FROM course,sc WHERE course.cno=sc.cno AND sc.sno='201215121';
查询表sc——查询选修1号课程的学生最高分数。
SELECT MAX(grade) FROM sc WHERE cno='1';
查询表sc——查询缺少成绩的学生的学号和相应的课程号。
SELECT sno,cno FROM sc WHERE grade IS NULL;
查询表course——查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT * FROM course WHERE cname LIKE 'DB\_%i__';
查询表student——查询计算机系(即CS)年龄在20岁以下的学生姓名。
SELECT sname FROM student WHERE sdept='CS' AND sage<20;
查询表student——查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT sname FROM student WHERE sname LIKE '欧阳_';
查询表student——查询所有不姓刘学生的姓名、学号和性别
SELECT sname,sno,ssex FROM student WHERE sname NOT LIKE '刘%';
查询表sc——查询平均成绩大于等于90分的学生学号和平均成绩
SELECT sno,AVG(grade) FROM sc GROUP BY sno HAVING AVG(grade)>=90;
查询没有选修1号课程的学生姓名。
SELECT sname FROM student WHERE NOT EXISTS( SELECT * FROM sc WHERE sno=student.sno AND cno='1');
查询所有选修了1号课程的学生姓名
SELECT sname FROM student WHERE EXISTS( SELECT * FROM sc WHERE sno=student.sno AND cno='1');
查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
SELECT sname,sage FROM student WHERE sage< ALL( SELECT sage FROM student WHERE sdept='CS') AND sdept!='CS';
查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT sname,sage FROM student WHERE sage< ANY( SELECT sage FROM student WHERE sdept='CS') AND sdept!='CS';
找出每个学生超过他选修课程平均成绩的课程号。
SELECT sno,cno FROM sc a WHERE grade>( SELECT AVG( grade) FROM sc b WHERE a.sno=b.sno );
查询选修了课程名为“信息系统”的学生学号和姓名
SELECT student.sno,student.sname FROM student,sc,course WHERE student.sno=sc.sno AND sc.cno=course.cno AND course.cname='信息系统';
查询与“刘晨”在同一个系学习的学生(学号,姓名,系)
SELECT sno,sname,sdept FROM student a WHERE sdept IN( SELECT sdept FROM student b WHERE b.sname='刘晨');
查询选修了全部课程的学生姓名
SELECT sname FROM student WHERE NOT EXISTS( SELECT* FROM course WHERE NOT EXISTS( SELECT* FROM sc WHERE sno=student.sno AND cno=course.cno));
查询每个学生及其选修课程的情况,保留学生学号,姓名,课程号,成绩
SELECT student.sno,student.sname,sc.cno,sc.grade FROM student,sc,course WHERE student.sno=sc.sno AND sc.cno=course.cno;
查询选修了1号课程的学生及其选修课程的情况,保留学生学号,姓名,课程名,成绩
SELECT student.sno,student.sname,course.cname,sc.grade FROM student,sc,course WHERE student.sno=sc.sno AND sc.cno=course.cno AND sc.cno='1';
查询每个学生及其选修课程的情况,保留学生学号,姓名,课程号,课程名,成绩
SELECT student.sno,student.sname,course.cno,course.cname,sc.grade FROM student,sc,course WHERE student.sno=sc.sno AND sc.cno=course.cno;
查询每一门课的间接先修课(即先修课的先修课)
SELECT a.cno,b.cpno FROM course a,course b WHERE a.cpno=b.cno;
查询至少选修了学生201215122选修的全部课程的学生号码。
解题思路:
用逻辑蕴涵表达:查询学号为x的学生,对所有的课程y,只要201215122学生选修了课程y,则x也选修了y。
形式化表示:
用P表示谓词 “学生201215122选修了课程y”
用q表示谓词 “学生x选修了课程y”
则上述查询为:
等价变换:
SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.Sno = ' 201215122 ' AND NOT EXISTS (SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));