SQL数据库学习之路(练习)--数据库系统教程第三章练习

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 目录 实验要求利用SQL语句创建数据库Lesson通过SQL语句创建以下基本表通过SQL语句实现以下操作:撤销索引IDX_CLASSID及IDX_S#_C#在学生关系中增加班级号属性列CLASS...

目录

 

实验要求

利用SQL语句创建数据库Lesson

通过SQL语句创建以下基本表

通过SQL语句实现以下操作:

撤销索引IDX_CLASSID及IDX_S#_C#

在学生关系中增加班级号属性列CLASSID

撤销学生关系中的班级号属性列CLASSID

撤销班级关系CLASS

利用实验1创建的数据库Lesson,分别在各表中插入以下记录,要求至少有一个表为单元组、至少有一个表为多元组的方式插入:

通过select into语句将SC表的表结构复制为SC_TEMP表,然后查询所有性别非空的学生的选课记录并将之插入到SC_TEMP表。

删除SC_TEMP表中无成绩的元组。

将SC_TEMP表中S3的低于S3平均成绩的成绩提高10%

删除SC_TEMP表中S3的小于该生平均成绩的成绩元组。

将S表中性别为空的学生的性别修改为女,并将年龄修改为25岁

创建视图V_M_STUDENT, 要求显示男学生的学号、姓名、课程名、教师名、成绩等列

​检索学习C3课程的所有学生姓名和年龄

检索学习由教授讲授的课程的学生学号和姓名

检索没选修任何课程的学生学号

检索年龄在18到20岁之间的女学生学习的课程号和课程名

​检索学习了C1或C3课程的学生学号

​检索Hu同学不学的课程号

检索成绩为空的课程对应的教师号和教师姓名

检索至少有S2和S4学习的课程号

​检索选修了S3学习的全部课程的学生学号

检索每个学生的姓名和出生年份,并将出生年份列重命名为Birth_Year

检索选修了课程的所有学生的学号,要求不显示重复结果

检索LIU老师所授课程的每门课程的人数和平均成绩

统计各门课程的最高分

统计每门课程的学生选修人数,(超过3人的课程才统计),要求显示课程号和人数,查询结构按人数升序排序,若人数相同,按课程号降序排序

查询每个学生超过他自己选修课程平均成绩的学号及课程号

把低于所有课程总平均成绩的女同学的成绩提高3%

分别用INNER JOIN 和LEFT OUTER JOIN 连接S和SC表

检索姓名中第三个字母为“N”的学生的姓名和年龄

 选择C1课程的前3名的学生学号和成绩

 检索平均成绩大于85的学生学号


实验要求

利用SQL语句创建数据库Lesson

create database work
on primary(
	name='work',  --主数据文件的逻辑名称
	filename='F:\SQL\work1\work.mdf',   --主数据文件的物理名称
	size=10mb,		--主数据文件的初始大小
	filegrowth=10mb				--主数据文件的增长率
)

log on(
	name='work_log',  --日志文件的逻辑名称
	filename='F:\SQL\work1\work_log.ldf',    --日志文件的物理名称
	size=5mb,		--日志文件的初始大小
	filegrowth=10%				--日志文件的增长率
)
AI 代码解读

通过SQL语句创建以下基本表

教师关系 T(T#, TNAME,TITLE)

课程关系 C(C#,CNAME,T#)

学生关系 S(S#,SNAME,AGE,SEX)

选课关系SC(S#,C#,SCORE)

班级关系CLASS(CLASSID,CLASSNAME)

其中红色粗体为主键,带下划线的属性为外键。

通过SQL语句在CLASS表的CLASSID列上创建聚集索引IDX_CLASSID

通过SQL语句创建在S#C#两个列上创建索引IDX_S#_C#,并指定索引按S#降序,C#升序有序。

create table T    --创建表教师关系T
(T# char(4) not null,        
 TNAME char(8) not null,
 TITLE char(10),
 PRIMARY KEY(T#)	--设置主键为T#
);
create table C   --创建表课程关系T
(C# char(4),
 CNAME char(10) not null,
 T# char(4),
 PRIMARY KEY(C#),   --设置主键为C#
 FOREIGN KEY(T#)REFERENCES T(T#)	--设置外键为T#
);
create table S		--创建表学生关系S
(S# char(4) not null,
 SNAME char(8) not null,
 AEG char(1),
 PRIMARY KEY(S#)	--设置主键为S#
);
create table SC		--创建表选课关系SC
(S# char(4),
 C# char(4),
 SCORE SMALLINT,
 PRIMARY KEY(S#,C#),  --设置主键为S#,C#
 FOREIGN KEY(S#)REFERENCES S(S#), ----设置外键为S#
 FOREIGN KEY(C#)REFERENCES C(C#)  ----设置外键为C#
);
create table class  --创建表班级关系class
(
	CLASSID char(4),
	CLASSNAME char(8)
);
AI 代码解读

通过SQL语句实现以下操作:

撤销索引IDX_CLASSID及IDX_S#_C#

create unique index IDX_CLASSID on class(CLASSID);  
--在CLASS表的CLASSID列上创建聚集索引IDX_CLASSID
create unique index IDX_S#_C# on SC(S# DESC,C# ASC);
--创建在S#和C#两个列上创建索引IDX_S#_C#,并指定索引按S#降序,C#升序有序
AI 代码解读
DROP INDEX IDX_CLASSID on class; --撤销索引IDX_CLASSID
DROP INDEX IDX_S#_C# on SC;		--撤销索引IDX_S#_C#
AI 代码解读

在学生关系中增加班级号属性列CLASSID

alter table S add CLASSID char(4); --在学生关系中增加班级号属性列CLASSID
AI 代码解读

撤销学生关系中的班级号属性列CLASSID

alter table S drop column CLASSID;	  --撤销学生关系中的班级号属性列CLASSID
AI 代码解读

撤销班级关系CLASS

drop table class ;		--撤销班级关系CLASS
AI 代码解读

利用实验1创建的数据库Lesson,分别在各表中插入以下记录,要求至少有一个表为单元组、至少有一个表为多元组的方式插入:

S表

 

C表

 

SC表

T表

insert S(S#,SNAME,AEG,sex) 
values('s1','WANG','20','男'),
	  ('s2','LIU','18','女'),
	  ('s3','HU','17','男'),
	  ('s4','XIA','19',NULL),
	  ('s5','SUN','20','男'),
	  ('s6','ZHAO',NULL,'男'),
	  ('s7','DENG',NULL,'女')

insert C(C#,CNAME,T#) values ('c1','OS','t2')
insert C(C#,CNAME,T#) values ('c2','java','t1')
insert C(C#,CNAME,T#) values ('c3','C++','t1')
insert C(C#,CNAME,T#) values ('c4','C','t3')

insert SC(S#,C#,SCORE) 
values('s1','c1','80'),
	  ('s1','c2','53'),
	  ('s1','c3',NULL),
	  ('s1','c4','68'),
	  ('s2','c1','85'),
	  ('s3','c1','85'),
	  ('s3','c3','83'),
	  ('s3','c4','75'),
	  ('s4','c1','79'),
	  ('s4','c2','92'),
	  ('s5','c1',NULL),
	  ('s5','c2','45')

insert T(T#,TNAME,TITLE) 
values('t1','LIU','教授'),
	  ('t2','ZHANG','副教授'),
      ('t3','LI','教授'),
      ('t4','ZHAO','讲师')
AI 代码解读

通过select into语句将SC表的表结构复制为SC_TEMP表,然后查询所有性别非空的学生的选课记录并将之插入到SC_TEMP表。

select *into SC_TEMP from SC where 1=2
insert into SC_TEMP select *from SC where S# in(select S# from S where sex is not NULL)
AI 代码解读

删除SC_TEMP表中无成绩的元组。

delete from SC_TEMP where SCORE is NULL  --删除SC_TEMP表中成绩为NULL的元组
AI 代码解读

将SC_TEMP表中S3的低于S3平均成绩的成绩提高10%

--将SC_TEMP表中S3的低于S3平均成绩的成绩提高10% 
update SC_TEMP set SCORE =1.1*SCORE where SCORE <(select AVG(SCORE) from SC_TEMP where S#='s3') and S#='s3'
AI 代码解读

删除SC_TEMP表中S3的小于该生平均成绩的成绩元组。

--删除SC_TEMP表中S3的小于该生平均成绩的成绩元组。
delete from SC_TEMP where SCORE <(select AVG(SCORE) from SC_TEMP where S#='s3') and S#='s3'
AI 代码解读

将S表中性别为空的学生的性别修改为女,并将年龄修改为25岁

update S set [sex]='女', [AEG]='25' where sex is NULL
AI 代码解读

创建视图V_M_STUDENT, 要求显示男学生的学号、姓名、课程名、教师名、成绩等列

create view V_M_STUDENT(S#,SNAME,CNAME,TNAME,SCORE) 
as select S.S#,SNAME,CNAME,TNAME,SCORE from S,C,T,SC
where S.S#=SC.S# AND SC.C#=C.C# AND C.T#=T.T#
AI 代码解读

检索学习C3课程的所有学生姓名和年龄

--1)检索学习C3课程的所有学生姓名和年龄
select S.SNAME,S.AEG from S,SC where S.S#=SC.S# and SC.C#='c3'
AI 代码解读

检索学习由教授讲授的课程的学生学号和姓名

--2)检索学习由教授讲授的课程的学生学号和姓名
Select DISTINCT S.S#,S.SNAME from S,SC,C,T where 
T.TITLE='教授' AND T.T#=C.T# AND C.C#=SC.C# 
AND SC.S#=S.S#
AI 代码解读

检索没选修任何课程的学生学号

--3)检索没选修任何课程的学生学号
select S.S# from S where S.S# NOT IN (SELECT S# FROM SC) 
AI 代码解读

检索年龄在18到20岁之间的女学生学习的课程号和课程名

--4)检索年龄在18到20岁之间的女学生学习的课程号和课程名
SELECT DISTINCT C.C#,C.CNAME FROM C,SC WHERE C.C#=SC.C# AND SC.S# IN(SELECT S# FROM S WHERE S.AEG BETWEEN 18 AND 20)
AI 代码解读

检索学习了C1或C3课程的学生学号

--5)检索学习了C1或C3课程的学生学号
SELECT DISTINCT S.S# FROM S,SC WHERE S.S# LIKE SC.S# AND (SC.C#='c1' or SC.C#='c3')
AI 代码解读

检索Hu同学不学的课程号

--6)检索Hu同学不学的课程号
SELECT C.C# FROM C WHERE C.C# NOT IN (SELECT C# FROM SC,S WHERE SC.S# LIKE S.S# AND S.SNAME='HU') 
AI 代码解读

检索成绩为空的课程对应的教师号和教师姓名

--7)检索成绩为空的课程对应的教师号和教师姓名
SELECT T.T#,T.TNAME 
FROM T 
WHERE T.T# IN 
(SELECT C.T# FROM C,SC WHERE C.C# LIKE SC.C# AND SC.SCORE IS NULL)
AI 代码解读

检索至少有S2和S4学习的课程号

--8)检索至少有S2和S4学习的课程号
SELECT DISTINCT SC.C# FROM SC 
WHERE SC.C# IN 
((SELECT SC.C# FROM SC WHERE SC.S# like 's2') INTERSECT (SELECT SC.C# FROM SC WHERE SC.S# like 's4'))
AI 代码解读

检索选修了S3学习的全部课程的学生学号

--9)检索选修了S3学习的全部课程的学生学号
SELECT DISTINCT SC.S# FROM SC WHERE SC.C# IN (SELECT SC.C# FROM SC WHERE SC.S# LIKE 's3')
AI 代码解读

检索每个学生的姓名和出生年份,并将出生年份列重命名为Birth_Year

--10)检索每个学生的姓名和出生年份,并将出生年份列重命名为Birth_Year
SELECT S.SNAME,2018-S.AEG AS Birth_Year FROM S
AI 代码解读

检索选修了课程的所有学生的学号,要求不显示重复结果

--1)检索选修了课程的所有学生的学号,要求不显示重复结果
SELECT DISTINCT SC.S# FROM SC 
AI 代码解读

检索LIU老师所授课程的每门课程的人数和平均成绩

--2)检索LIU老师所授课程的每门课程的人数和平均成绩。
SELECT C.C#,COUNT(DISTINCT SC.S#),AVG(SC.SCORE)
FROM C,T,SC
WHERE C.T#=T.T# AND C.C#=SC.C# AND TNAME='LIU'
GROUP BY C.C#;
AI 代码解读

统计各门课程的最高分

--3)统计各门课程的最高分。
SELECT SC.C#,MAX(SC.SCORE) FROM SC GROUP BY SC.C#
AI 代码解读

统计每门课程的学生选修人数,(超过3人的课程才统计),要求显示课程号和人数,查询结构按人数升序排序,若人数相同,按课程号降序排序

--4)统计每门课程的学生选修人数,(超过3人的课程才统计),要求显示课程号和人数,查询结构按人数升序排序,若人数相同,按课程号降序排序。
SELECT DISTINCT C#,COUNT(DISTINCT S#) AS 人数
FROM SC
GROUP BY C#
HAVING COUNT(S#)>3
ORDER BY COUNT(DISTINCT S#) asc,C#
AI 代码解读

查询每个学生超过他自己选修课程平均成绩的学号及课程号

--5)查询每个学生超过他自己选修课程平均成绩的学号及课程号。
SELECT X.S#,X.C#
FROM SC AS X 
WHERE X.SCORE >(SELECT AVG(Y.SCORE) FROM SC AS Y WHERE X.S# =Y.S# )
AI 代码解读

把低于所有课程总平均成绩的女同学的成绩提高3%

--6)把低于所有课程总平均成绩的女同学的成绩提高3%
--SELECT SC.SCORE FROM SC,S WHERE SC.S# LIKE S.S# AND S.sex='女' AND SC.SCORE>(SELECT AVG(SC.SCORE) FROM SC)
UPDATE SC SET SC.SCORE=SC.SCORE*1.03 WHERE SC.SCORE LIKE (SELECT SC.SCORE FROM SC,S WHERE SC.S# LIKE S.S# AND S.sex='女' AND SC.SCORE<(SELECT AVG(SC.SCORE) FROM SC))
AI 代码解读

分别用INNER JOIN 和LEFT OUTER JOIN 连接S和SC表

--INNER JOIN   仅对满足连接条件的CROSS中的列        LEFT OUTER JOIN    一个表满足条件的行,和另一个表的所有行
SELECT *FROM S INNER JOIN SC on S.S#=SC.S# 
SELECT *FROM S LEFT OUTER JOIN SC on S.S#=SC.S# 
AI 代码解读

检索姓名中第三个字母为“N”的学生的姓名和年龄

--8)检索姓名中第三个字母为“N”的学生的姓名和年龄。
SELECT S.SNAME,S.AEG FROM S WHERE S.SNAME LIKE '__N%'
AI 代码解读

 选择C1课程的前3名的学生学号和成绩

--9) 选择C1课程的前3名的学生学号和成绩。
SELECT TOP(3) SC.S#,SC.SCORE FROM SC WHERE SC.C# LIKE 'c1' ORDER BY SC.SCORE DESC
AI 代码解读

 检索平均成绩大于85的学生学号

--10) 检索平均成绩大于85的学生学号。
SELECT DISTINCT X.S# FROM SC AS X WHERE 85<= ALL(SELECT AVG(Y.SCORE) FROM SC AS Y WHERE Y.S#=X.S# GROUP BY Y.S#)
AI 代码解读

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
2
分享
相关文章
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
32 16
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
98 9
PolarDB 开源基础教程系列 8 数据库生态
PolarDB是一款开源的云原生分布式数据库,源自阿里云商业产品。为降低使用门槛,PolarDB携手伙伴打造了完整的开源生态,涵盖操作系统、芯片、存储、集成管控、监控、审计、开发者工具、数据同步、超融合计算、ISV软件、开源插件、人才培养、社区合作及大型用户合作等领域。通过这些合作伙伴,PolarDB提供了丰富的功能和服务,支持多种硬件和软件环境,满足不同用户的需求。更多信息请访问[PolarDB开源官方网站](https://openpolardb.com/home)。
78 4
新手教程:数据库操作(使用PDO或MySQLi扩展)
本文为新手介绍如何使用PDO和MySQLi扩展连接与操作MySQL数据库。PDO更现代灵活,支持多种数据库,适合大多数应用;MySQLi提供面向过程和面向对象两种API,适合直接控制数据库操作。教程涵盖安装配置、创建连接、执行查询(查询、插入、更新、删除)及错误处理等内容。希望这篇教程能帮助你快速上手PHP中的数据库操作!
200 32
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
229 6
|
4月前
|
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
103 15
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
113 11
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
144 0

热门文章

最新文章

目录
目录