博客
关于我
数据库系统第三章作业
阅读量:598 次
发布时间:2019-03-12

本文共 3064 字,大约阅读时间需要 10 分钟。

数据库系统第三章作业

一、数据定义

我们需要根据要求定义三张表:学生表S、课程表C以及选课表SC。每张表的字段信息如下:

学生表S

字段及规格:

  • S#: 学号(10位字符,主键)
  • Sname: 学生姓名(8位可变长字符串,非空)
  • Sex: 性别(2位字符)
  • Age: 年龄(整数)
  • sdept: 系部(30位可变长字符串)

表结构定义:

CREATE TABLE S (    S# CHAR(10) PRIMARY KEY,    Sname VARCHAR(8) NOT NULL,    Sex CHAR(2),    Age INT,    sdept VARCHAR(30));

课程表C

字段及规格:

  • C#: 课程编号(4位字符,主键)
  • Cname: 课程名称(20位可变长字符串,非空)
  • Teacher: 教师姓名(8位可变长字符串,非空)

表结构定义:

CREATE TABLE C (    C# CHAR(4) PRIMARY KEY,    Cname VARCHAR(20) NOT NULL,    Teacher VARCHAR(8) NOT NULL);

选课表SC

字段及规格:

  • S#: 学号(10位字符,联合主键,外键引用S表)
  • C#: 课程编号(4位字符,联合主键,外键引用C表)
  • Grade: 成绩(整数)

表结构定义:

CREATE TABLE SC (    S# CHAR(10),    C# CHAR(4),    Grade INT,    PRIMARY KEY (S#, C#),    FOREIGN KEY (S#) REFERENCES S(S#),    FOREIGN KEY (C#) REFERENCES C(C#));

二、SELECT 查询

以下是针对上述数据库的SELECT 查询示例:

查询1:检索LIU老师所授课程的课程号和课程名

SELECT C#, Cname FROM C WHERE Teacher = 'LIU';

查询2:检索年龄大于23的男同学的学号和姓名

SELECT S#, Sname FROM S WHERE Sex = '男' AND Age > 23;

查询3:检索学号为S3的学生所学课程的课程名与任课老师

SELECT DISTINCT Cname, Teacher FROM C WHERE C# IN (    SELECT C# FROM SC WHERE S# = 'S3');

查询4:检索至少选修LIU老师所授课程中一门课程的女学生的姓名

SELECT Sname FROM S WHERE Sex = '女' AND S# IN (    SELECT DISTINCT S# FROM SC WHERE C# IN (        SELECT C# FROM C WHERE Teacher = 'LIU'    ));

查询5:检索WANG同学不学课程的课程号

SELECT DISTINCT C# FROM C WHERE C# NOT IN (    SELECT DISTINCT C# FROM SC WHERE S# IN (        SELECT S# FROM S WHERE Sname = 'WANG'    ));

查询6:检索至少选修2门课的学生的学号

SELECT DISTINCT S# FROM SC GROUP BY S# HAVING COUNT(C#) > 2;

查询7:检索全部学生都选修的课程的课程号和课程名

SELECT C#, Cname FROM C WHERE NOT EXISTS (    SELECT * FROM S WHERE NOT EXISTS (        SELECT * FROM SC WHERE S# = S.S# AND C# = C.C#    ));

查询8:检索选修课程包含LIU老师所授全部课程的学生的学号

SELECT DISTINCT S# FROM SC WHERE NOT EXISTS (    SELECT * FROM C WHERE Teacher = 'LIU' AND NOT EXISTS (        SELECT * FROM SC WHERE S# = S.S# AND C# = C.C#    ));

查询9:检索所有姓张的学生

SELECT * FROM S WHERE Sname LIKE '张%';

查询10:查询每个学生的平均成绩

SELECT S#, AVG(Grade) FROM SC GROUP BY S#;

查询11:查询平均成绩大于等于80分的学生的学号和姓名

SELECT S#, Sname FROM S WHERE S# IN (    SELECT S# FROM SC GROUP BY S# HAVING AVG(Grade) >= 80);

查询12:查询平均成绩第一名的学生的学号和姓名

SELECT S#, Sname FROM S WHERE S# IN (    SELECT TOP 1 S# FROM SC GROUP BY S#	ORDER BY AVG(Grade) DESC);

三、创建视图

视图1:选修LIU老师所带课程的学生视图

CREATE VIEW V_LIU (    学号,姓名,性别,课程号,课程名,成绩) AS SELECT S.S#, Sname, Sex, C#, Cname, GradeFROM S, SC, CWHERE S.S#=SC.S# AND SC.C#=C.C# AND Teacher = 'LIU';

视图2:所有男生的视图

CREATE VIEW V_MALE AS SELECT * FROM S WHERE Sex = '男';

视图3:所有学生的选课视图

CREATE VIEW V_LIU (    学号,姓名,性别,课程号,课程名,成绩) AS SELECT S.S#, Sname, Sex, C#, Cname, GradeFROM S, SC, CWHERE S.S#=SC.S# AND SC.C#=C.C#;

视图4:学生平均成绩的视图

CREATE VIEW V_AVG (    学号,姓名,平均成绩) AS SELECT S.S#, Sname, AVG(Grade)FROM S, SCWHERE S.S#=SC.S# GROUP BY S.S#, Sname;

四、数据操纵语言(DML)命令

命令1:把所有学生的年龄增加1岁

UPDATE S SET Age = Age + 1;

命令2:把所有选修LIU老师所带课程的学生成绩置零

UPDATE SC SET Grade = 0 WHERE C# IN (    SELECT C# FROM C WHERE Teacher = 'LIU');

命令3:删除所有女生的选课记录

DELETE FROM SC WHERE S# IN (    SELECT S# FROM S WHERE Sex = '女');

命令4:删除全部的学生记录

DELETE FROM S;

命令5:向学生表S插入一条记录

INSERT INTO S VALUES('1006', '黎明', '男', 20);

转载地址:http://gjgtz.baihongyu.com/

你可能感兴趣的文章
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中使用range范围节点实现从一个范围对应至另一个范围
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
查看>>
Node-RED中建立TCP服务端和客户端
查看>>
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中建立静态网页和动态网页内容
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中连接Mysql数据库并实现增删改查的操作
查看>>
Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
查看>>
Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
查看>>
Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
查看>>
Node-RED怎样导出导入流程为json文件
查看>>
Node-RED订阅MQTT主题并调试数据
查看>>
Node-RED通过npm安装的方式对应卸载
查看>>
node-request模块
查看>>
node-static 任意文件读取漏洞复现(CVE-2023-26111)
查看>>
Node.js 8 中的 util.promisify的详解
查看>>
node.js debug在webstrom工具
查看>>
Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
查看>>