sql数据库练习题(涵盖大部分知识点)

一.创建数据库stucourse

没有表结构, 根据数据, 自己决定使用哪种数据类型

学生表(student)

sidsnamesexagedept
1001宋江25计算机系
3002张明23生物系
1003李小鹏26计算机系
1004郑冬25计算机系
4005李晓红27工商管理
5006赵紫月24外语系

教师表(teacher)

tidtnametitlesalarydeptcid
3102李明初级2500计算机系C1
3108黄晓明初级4000生物系C3
4105张晓红中级3500工商管理C2
5102宋力跃高级3500物理系C4
3106赵明阳初级1500地理系C2
7108张丽高级3500生物系C3
9103王彬高级3500计算机系C1
7101王力号初级1800生物系C1

课程表(courseinfo)

cidcnamecbookctestdept
C1计算机基础b12312009-4-6计算机系
C2工商管理基础b12322009-7-16工商管理
C3生物科学b12332010-3-6生物系
C4大学物理b12342009-4-26物理系
C5数据库原理b12352010-2-6计算机系

选课表(scourse)

sidscorecidtid
100187C13102
100177C24105
100163C33108
100156C45102
300278C33108
300278C45102
100389C19103
100456C23106
400587C45102
5006nullC17101

教材表(bookinfo)

bidbnamebpublishbpricequantity
b1231Image Processing人民大学出版社34.568
b1212Signal Processing清华大学出版社51.7510
b1233Digital Signal Processing邮电出版社48.511
b1234The Logic Circuit北大出版社49.240
b1235SQL Techniques邮电出版社65.420

二.查询问题

-- 查询数据stucourse

-- 1.查询全体学生的学号, 姓名和年龄

-- 2.查询选修了课程的学生号

-- 3.查询选修课程号c3的学号和成绩

-- 4.查询成绩高于85分的学生的学号,课程号和成绩

-- 5.查询没有选修C1也没有选修C2的学生学号,课程号和成绩

-- 6.查询工资在1500~2000之间的教师的教师号,姓名和职称

-- 7.查询选修C1或C2的学生的学号,课程号和成绩

-- 8.查询所有姓张的教师的教师号和姓名

-- 9.查询姓名中第2个汉字是力的教师号和姓名

-- 10.查询所有没有成绩的学生的学号和相应的课程号

-- 11.查询选修C1的学生学号和成绩,并按照成绩降序排列

-- 12.查询选修C2,或者C3,或者C4,或者C5课程的学号,课程号和成绩, 查询结果按学号升序排列,学号相同,再按成绩降序排列

-- 13.查询选修C1的学生学号和成绩,并显示成绩前三的学生

-- 14.查询计算机系学生的总数

-- 15.查询每位学生的学号及其选修课的门数

-- 16.在分组查询中使用having条件查询,平均成绩大于85的学生学号及平均成绩

-- 17.查询选课在两门以上且各门课均及格的学生的学号及其总成绩, 查询结果按总成绩降序列出

-- 18.查询所有选课学生的学号,姓名,选课名称及成绩

-- 19.查询选修C1课程且成绩在60以上的所有学生的学号, 姓名和分数

-- 20.查询与李明教师职称相同的教师号, 姓名

三.答案

1.创建数据库stucourse

分析表格数据可得到课表与学生表不作为子健,所以优先创建(主键建立后才能链接子健)

# 建立表
create database library;
use library;
create table booktype(
	typeid int primary key,
	typename varchar(20)

);

create table readerType(
	# 如果这个字段需要进行链接外键,那么这个也没有要求主键约束,那么我们只能弄一个唯一约束
	retypeid int unique not null,
	readerName varchar(20) not null,
	borrowquantity int not null,
	borrowDay int

);

create table book(
	bookid char(10) PRIMARY key,
	bookName varchar(20) not null,
	typeid int,
	bookauthor varchar(20),
	bookPublisher varchar(20),
	bookPrice double,
	borrowsum int,
	FOREIGN key (typeid) REFERENCES booktype(typeid)

);

create table bookstorage(
	bookbarcode char(20) PRIMARY key,
	bookId char(10) not null,
	bookInTime datetime,
	bookStatus varchar(4),
	FOREIGN key (bookId) REFERENCES book(bookId)


);



create table reader(
	readerId char(10) PRIMARY key,
	readerName varchar(20) not null,
	readerPass varchar(20) not null,
	retypeId int not null,
	readerDate dateTime,
	readerStatus varchar(4),
	FOREIGN key (reTypeId) REFERENCES readerType(reTypeId)

);

create table bookBorrow(
	borrowId char(10) PRIMARY key,
	bookBarCode char(20) not null,
	readerId char(10) not null,
	borrowTime datetime,
	returnTime datetime,
	borrowStatus varchar(4),
	FOREIGN key (bookBarCode) REFERENCES bookStorage(bookBarCode),
	Foreign key (readerId) REFERENCES reader(readerId)

);



# 插入数据

insert into booktype VALUES
(1, "自然科学"),
(2, "数学"),
(3, "计算机"),
(4, "建筑水利"),
(5, "旅游地理"),
(6, "励志/自我实现"),
(7, "工业技术"),
(8, "基础医学"),
(9, "室内设计"),
(10, "人文景观");

insert into book values
('TP39/1712','Java程序设计',3,'陈永红','机械工业出版社',35.5,30),
('013452','离散数学',2,'张小新','机械工业出版社',45.5,10),
('TP/3452','JSP程序设计案例',3,'刘城清','电子工业出版社',42.8,8),
('TH/2345','机械设计手册',7,'黄明凡','人民邮电出版社',40,10),
('R/345677','中医的故事',8,'李奇德','国防工业出版社',20.0,5);

insert into bookstorage values
('132782','TP39/1712','2009-08-10 00:00:00','在馆'),
('132789','TP39/1712','2009-08-10 00:00:00','借出'),
('145234','013452','2008-12-06 00:00:00','借出'),
('145321','TP/3452','2007-11-04 00:00:00','借出'),
('156833','TH/2345','2009-12-04 00:00:00','借出'),
('345214','R/345677','2008-11-03 00:00:00','在馆');

insert into readertype values
(1,'学生',10,30),
(2,'教师',20,60),
(3,'管理员',15,30),
(4,'职工',15,20);

insert into reader values
('0016','苏小东',123456,1,'1999-09-09 00:00:00','有效'),
('0017','张明',123456,1,'2010-09-10 00:00:00','有效'),
('0018','梁君红',123456,1,'2010-09-10 00:00:00','有效'),
('0021','赵清远',123456,2,'2010-07-01 00:00:00','有效'),
('0034','李瑞清',123456,3,'2009-08-03 00:00:00','有效'),
('0042','张明月',123456,4,'1997-04-23 00:00:00','有效');

insert into bookborrow values
('001328','132789','0017','2011-01-24 00:00:00','2011-02-28 00:00:00','已还'),
('001356','145234','0018','2011-02-12 00:00:00','2011-02-27 00:00:00','已还'),
('001432','132782','0016','2011-03-04 00:00:00','2011-04-05 00:00:00','已还'),
('001435','145321','0021','2011-08-09 00:00:00','2011-09-02 00:00:00','已还'),
('001578','156833','0034','2011-10-01 00:00:00','2011-11-01 00:00:00','未还'),
('001679','345214','0042','2011-02-21 00:00:00','2011-03-05 00:00:00','未还');



2.查询数据stucourse
-- 1.查询全体学生的学号, 姓名和年龄
select sid , sname , age  from student ;

-- 2.查询选修了课程的学生号
select distinct sid from scourse ;

-- 3.查询选修课程号c3的学号和成绩
select sid , score from scourse where cid ='c3';

-- 4.查询成绩高于85分的学生的学号,课程号和成绩
select  sid , cid, score from scourse where score > '85';

-- 5.查询没有选修C1也没有选修C2的学生学号,课程号和成绩
select sid , cid, score from scourse where cid != 'c1' and cid != 'c2';

-- 6.查询工资在1500~2000之间的教师的教师号,姓名和职称
select tname , tid , title from teacher where salary between '1500' and '2000';

-- 7.查询选修C1或C2的学生的学号,课程号和成绩
select score , b1.sid , cid from student as b1 LEFT JOIN scourse as b2 on b1.sid = b2.sid where cid = 'c1' or cid = 'c2';

-- 8.查询所有姓张的教师的教师号和姓名
select tid ,tname from teacher where tname like '张%';

-- 9.查询姓名中第2个汉字是力的教师号和姓名
select tid , tname from teacher where tname like '_力_';

-- 10.查询所有没有成绩的学生的学号和相应的课程号
#查询空值数据只能用is判断;
select sid , cid from scourse where score is null;

-- 11.查询选修C1的学生学号和成绩,并按照成绩降序排列
select sid , score from scourse  where cid = 'c1' ORDER BY score desc;

-- 12.查询选修C2,或者C3,或者C4,或者C5课程的学号,课程号和成绩, 查询结果按学号升序排列,学号相同,再按成绩降序排列
select sid , cid , score from scourse where cid != 'c1' order by sid asc , score desc ;

-- 13.查询选修C1的学生学号和成绩,并显示成绩前三的学生
select sid , score from scourse where cid = 'c1' order by score limit 3;

-- 14.查询计算机系学生的总数
select count(sid) as people from student where dept  = '计算机系' group by dept;

-- 15.查询每位学生的学号及其选修课的门数
select sid , count(cid) as '选修课门数' from scourse group by sid;

-- 16.在分组查询中使用having条件查询,平均成绩大于85的学生学号及平均成绩
select sid , avg(score) as '平均成绩'  from scourse  GROUP BY sid HAVING avg(score) > '85';

-- 17.查询选课在两门以上且各门课均及格的学生的学号及其总成绩, 查询结果按总成绩降序列出
select sum(score) , sid from scourse where score >= 60 group by sid HAVING count(cid) >= 2 ORDER BY sum(score) desc;

-- 18.查询所有选课学生的学号,姓名,选课名称及成绩
select b1.sid , b1.sname , b3.cname , b2.score  from student as b1 LEFT JOIN scourse as b2 on b1. sid = b2.sid LEFT JOIN courseinfo as b3 on b2.cid = b3.cid ;

-- 19.查询选修C1课程且成绩在60以上的所有学生的学号, 姓名和分数
select * from scourse as b1 LEFT JOIN student as b2 on b1.sid = b2.sid HAVING cid = 'c1' and score > '60';

-- 20.查询与李明教师职称相同的教师号, 姓名
select tid , tname from teacher where title = (select title from teacher where tname = '李明');

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
第二天 1、查询客户表,统计每个机构2000年之前开户数、2000~2005开户数(含头不含尾)、2005~2010开户数(含头不含尾)、2010之后开户数 展示字段:机构号、2000年之前开户数、2000~2005年开户数、2005~2010年开户数、2010年之后开户数 2、查询客户表,按年份统计,每年、每个机构开户数占全年开户数的占比 展示字段:年份、机构号、开户数、开户占比百分比(百分比) 3、统计所有客户的客户号、存款账户数、2011.12.31日的存款余额、2011.12存款月日均、贷款账户数、2011.12.31日的贷款余额、2011.12贷款月日均 备注:null置为0 第三天 1、统计所有客户的2011.12.31日的存款余额、存款比上日余额、存款比上月余额、、存款比上年余额 备注:存款比上日余额 = 2011.12.31日的存款余额-2011.12.30日的存款余额 存款比上月余额 = 2011.12.31日的存款余额-2011.11.30日的存款余额 存款比上年余额 = 2011.12.31日的存款余额-2010.12.31日的存款余额 只有2011.12.31这个日期可以写死,其他日期要通过2011.12.31这个日期来生成。 2、统计所有2011年存款年日均大于100的客户号、客户名称、存款账户数、2011年年日均 第四天 1、统计所有2011年存款年日均和2011年贷款年日均都大于100的客户号、存款账户数、2011年存款年日均、贷款账户数、2011年贷款年日均 2、统计所有客户的客户号、 存款标志(有存款账户的客户置为1、没存款账户的客户置为0)、 贷款标志(有贷款借据的客户置为1、没贷款借据的客户置为0)、 存款质量分类(2011年存款年日均>=10000置为优质、2011年存款年日均>=1000<10000 置为良好、2011年存款年日均=10000置为优质、2011年贷款年日均>=1000<10000 置为良好、2011年贷款年日均<1000置为普通)、 2011年贷款年日均 第五天 1、根据《事件表.xlsx》来建表,然后将excel中的数据导入到目标表中 2、根据客户表、存款信息表、事件表,统计每个客户2017年的客户号、 交易账户数(客户下有多少个账户有交易就是多少)、 当年有交易的天数(如果2017年有5天有过交易,则有交易天数为5)、 当年有交易总月数(如果2017的1、3、5月有交易,则有交易总月数为3)、 最大的月交易总金额(按月统计交易金额,存放最大的月交易金额)、 最大月交易金额的月份(按月统计交易金额,存放交易金额最大的月份)、 年总交易金额、 年交易金额排名(按客户排名,如果总交易金额为0,则不参与排名,排名置为9999)、 年总手续费、 年总手续费排名(按客户排名,如果总手续费为0,则不参与排名,排名置为9999)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值