实验八 SQL语句的综合使用

实验内容
1、    建立一图书借阅库(TSJY),并在在该库下建立以下四个表:
(1)    图书 (编号 C(6), 分类号 C(8), 书名 C(16), 作者 C(6), 出版单位 C(16), 单价N(7,2),总藏书量 INT,现有库存INT)
(2)    读者(借书证号 C(4), 单位 C(10), 姓名 C(6), 性别 C(2), 职称 C(6),  地址 C(16))
(3)    借阅(借书证号 C(4), 编号 C(6), 借书日期( D),还书日期( D)
(4)    管理员(职工号 C(6), 姓名 C(6), 性别 C(2), 出生日期 D, 职称 C(6), 基本工资 N(7,2))
说明:以上C表示char类型,N表示Numeric类型,D为datetime类型
答:代码如下:
create database TSJY;
use TSJY;
create table book(
编号 char(6) not null,
分类号 char(8),
书名 char(16),
作者 char(6),
出版单位 char(16),
单价 numeric(7,2),
总藏书量 int,
现有库存 int
);
create table reader(
借书证号 char(4) not null, 
单位 char(10), 
姓名 char(6), 
性别 char(2),
职称 char(6), 
地址 char(16)
);
create table borrow(
借书证号 char(4), 
编号 char(6),
借书日期 datetime,
还书日期 datetime,
);
create table administrator(
职工号 char(6) not null, 
姓名 char(6), 
性别 char(2), 
出生日期 datetime,
职称 char(6),
基本工资 numeric(7,2),
);
 
2、	数据定义(DDL)
(1)	要求为每个表建立一个主键。
答:因为需要设置borrow表中的借书证号和编号为主键,所以需要先将borrow表中的借书证号和编号设置为非空。代码如下:
alter table borrow
alter column 编号 char(6) not null;
alter table borrow
alter column 借书证号 char(4) not null;
为每个表设立主键:
代码如下:
--要求为每个表建立一个主键。
alter table borrow
add primary key (借书证号,编号);
alter table administrator
add primary key (职工号);
alter table book
add primary key (编号);
alter table reader
add primary key (借书证号);

 
(2)	建立“管理员”表时要求其“性别”一列的默认值为“男”。
答:代码如下:
--建立“管理员”表时要求其“性别”一列的默认值为“男”。
alter table administrator
add constraint Defaultsex default '男' for 性别;

(3)	为“图书”的“分类号”建立一个索引ts_flh。
答:代码如下:
--为“图书”的“分类号”建立一个索引ts_flh。
create index ts_flh on book(分类号);

(4)	为“借阅”表建立一唯一索引jycx,要求按“借书证号 ”升序,“借书日期 ” 降序。
答:代码如下:
--为“借阅”表建立一唯一索引jycx,要求
--按“借书证号 ”升序,“借书日期 ” 降序。
create unique index jycx on borrow(借书证号 asc, 借书日期 desc);

 
(5)	为“管理员”表建立一检查约束,要求“基本工资”在(100,10000)之间。
答:代码如下:
--为“管理员”表建立一检查约束,
--要求“基本工资”在(100,10000)之间。
alter table administrator
add constraint ck_pay check (基本工资 between 100 and 1000);

 
(6)	建立“借阅”与“图书”及“读者”表之间的参照关系。
答:代码如下:
--建立“借阅”与“图书”及“读者”表之间的参照关系。
alter table borrow
add foreign key (编号) references book(编号);
alter table borrow
add foreign key (借书证号) references reader (借书证号);

 
3、	数据操作(DML)
(1)	为每个表插入3-5条记录(记录数据自定)。
答:代码如下:
--为每个表插入3-5条记录(记录数据自定)。
insert into book values('001','5843','离散数学','耿素云','清华大学出版社',33.00,20,16),
					   ('002','6379','电子技术基础','康华光','高等教育出版社',59.90,20,10),
					   ('003','6538','新编大学英语','应惠兰','外语教学出版社',39.90,20,20),
					   ('004','7096','医药数据库','杜建强','中国中医药出版社',49.00,20,15)
					   
insert into reader values('110','浙中医大','张三','男','学生','立业园'),
					     ('111','浙中医大','李四','女','学生','立业园'),
					     ('112','浙中医大','王五','男','学生','立业园'),
					     ('113','浙中医大','赵六','女','学生','立业园'),
					     ('114','浙中医大','田七','男','学生','立业园')
					     
insert into borrow values('110','001','1999-11-19','1999-12-19'),
						 ('110','002','1992-11-06','1992-12-06'),
						 ('110','004','1997-10-29','1997-11-29'),
						 ('111','003','1998-11-19','1998-12-19'),
						 ('112','001','1997-10-22','1997-11-22'),
						 ('112','002','1999-11-25','1999-12-25'),
						 ('113','001','1996-10-01','1996-11-01'),
						 ('114','004','1999-11-18','1999-12-18')
						 
insert into administrator values('200','jack','男','1990-05-23','老师',800),
						('201','tom','男','1990-06-04','老师',900),
						('202','lucy','女','1990-03-18','老师',1000)

(2)	查询出“图书”数据库中作者姓“刘”的所有图书。
答:代码如下:
--查询出“图书”数据库中作者姓“刘”的所有图书。
insert into book values
('005','8023','数学分析','刘星武','清华大学出版社',33.00,20,16);
select * from book
where 作者 like '刘%';

 
(3)	查询出“图书”数据库中高等教育出版社出版的、单价低于25元的所有种类的图书。
答:代码如下:
--查询出“图书”数据库中高等教育出版社出版的、单价低于25元的所有种类的图书。
insert into book values('006','8024','线性代数','张文星','高等教育出版社',23.00,20,16);
select * from book where 出版单位='高等教育出版社' and 单价 < 25.0;

 
(4)	求出“读者”数据库中的总人数。
答:代码如下:
--求出“读者”数据库中的总人数。
select count(*) as 总人数
from reader;

 
(5)	求出“图书”数据库中的所有图书的最高价、最低价和平均价。
答:代码如下:
--求出“图书”数据库中的所有图书的最高价、最低价和平均价。
select max(单价) as 最高价,
min(单价) as 最低价,
avg(单价) as 平均价
from book;

 
(6)	求出“借阅”库中借书证号为“112”的所借图书的册数。
答:代码如下:
--求出“借阅”库中借书证号为“112”的所借图书的册数。
select count(借书证号) as 借书册数
from borrow
where 借书证号='112';

 
(7)	按分类号降序显示“图书”库中各种图书的分类号、书名合作者。
答:代码如下:
--按分类号降序显示“图书”库中各种图书的分类号、书名合作者。
select 分类号,书名,作者 
from book
order by
分类号 desc;
 
(8)	按单价升序显示“图书”库中的高等教育出版社出版的所有图书。
答:代码如下:
--按单价升序显示“图书”库中的高等教育出版社出版的所有图书。
select * from book
where 出版单位='高等教育出版社'
order by 单价 asc;

 
(9)	按单价升序显示出“图书”库中由清华大学出版社和电子工业出版社出版的所有图书。
答:代码如下:
--按单价升序显示出“图书”库中由清华大学出版社和电子工业出版社出版的所有图书。
select * from book
where 出版单位 in ('清华大学出版社','电子工业出版社')
order by 单价 asc;

 
(10)	按书名和作者分组统计出“图书”库中每种图书的数量。
答:代码如下:
--按书名和作者分组统计出“图书”库中每种图书的数量。
select 书名,作者,sum(总藏书量) as 数量
from book
group by 书名,作者;

 
(11)	统计出“图书”数据库中15至25元之间的图书数量。
答:代码如下:
--统计出“图书”数据库中15至25元之间的图书数量。
select sum(总藏书量) as 图书数量
from book
where 单价 between 15 and 25;

 
(12)	查询出“图书”数据库中书名中含有“应用基础”字串的所有图书。
答:代码如下:
/* 查询出“图书”数据库中书名中含有“应用基础”字串的所有图书。*/
insert into book values('007','8025','java应用基础','刘星星','高等教育出版社',13.00,21,15);
insert into book values('008','8026','应用基础c++','赵芳芳','高等教育出版社',9.00,26,15);
select * from book where 书名 like '%应用基础%';

 
(13)	分组统计出“借阅”数据库中每一种借书证号所借图书的册数。
答:代码如下:
--分组统计出“借阅”数据库中每一种借书证号所借图书的册数。
select 借书证号,count(*) as 借书册数
from borrow
group by 借书证号;

 
(14)	按单位分组统计出“读者”数据库中每个单位的人数。
答:代码如下:
--按单位分组统计出“读者”数据库中每个单位的人数。
select 单位,count(*) as 人数
from reader
group by 单位;

 
(15)	分组统计出1997年底以前借阅不低于2本图书的借书证号和数量。
答:代码如下:
--分组统计出1997年底以前借阅不低于2本图书的借书证号和数量。
select 借书证号,count(*) 数量
from borrow
where 借书日期<'1997-12-31'
group by 借书证号
having count(*) >=2

 
(16)	联接查询“借阅”库和“图书”,得到借阅每一本书的信息。
答:代码如下:
--联接查询“借阅”库和“图书”,得到借阅每一本书的信息。
select book.*,borrow.*
from book,borrow
where  borrow.编号=book.编号;

 
(17)	联接查询“借阅”库和“读者”库,得到每一个以借阅者的借书证号、姓名、单位。
答:代码如下:
--联接查询“借阅”库和“读者”库,得到每一个以借阅者的借书证号、姓名、单位。
select distinct reader.借书证号,姓名,单位
from reader,borrow
where borrow.借书证号=reader.借书证号;

 
(18)	联接查询“借阅”、“读者”、“图书”三个库,得到每一本所借图书的读者的借书证号、姓名、单位、书名。
答:代码如下:
--联接查询“借阅”、“读者”、“图书”三个库,
--得到每一本所借图书的读者的借书证号、姓名、单位、书名。
select reader.借书证号,姓名,单位,书名
from reader,borrow,book
where reader.借书证号=borrow.借书证号 and borrow.编号=book.编号 

 
(19)	从“图书”数据库中(通过对“借阅”库的嵌套)查询出所有被借图书的信息。
答:代码如下:
--从“图书”数据库中(通过对“借阅”库的嵌套)查询出所有被借图书的信息。
select * from book
where 编号 in(select 编号 from borrow);

 
(20)	按单位分组统计出被借图书的数量。
答:代码如下:
--按单位分组统计出被借图书的数量。
select 单位,count(*)
from reader,borrow
where reader.借书证号=borrow.借书证号
group by 单位;

 
(21)	按单位分组统计出借阅图书的人数。
答:代码如下:
--按单位分组统计出借阅图书的人数。
select 单位,count(*) 数量
from reader
where 借书证号 in(select distinct 借书证号 from borrow)
group by 单位;

 
(22)	从读者库中查询出每个借阅图书的读者的情况。
答:代码如下:
--从读者库中查询出每个借阅图书的读者的情况。
select * from reader
where 借书证号 in(select distinct 借书证号 from borrow);

(23)	查询‘管理员’表中职称为教授或副教授,并且在1950年(含该年)以后出生的所有职工记录。
答:代码如下:
--查询‘管理员’表中职称为教授或副教授,并且在1950年(含该年)以后出生的所有职工记录。
insert into administrator values('203','sara','男','1990-05-24','教授',1000);
select * from administrator
where 职称='教授' and year(出生日期)>=1950;

 
(24)	查询‘管理员’表中基本工资在250到380元之间的职工记录。
答:代码如下:
--查询‘管理员’表中基本工资在250到380元之间的职工记录
insert into administrator values('205','alice','男','1990-05-25','老师',320);
select * from administrator
where 基本工资 between 250 and 380;

 
(25)	将基本工资小于500的管理员,工资加上100元。
答:代码如下:
--将基本工资小于500的管理员,工资加上100元。
update administrator
set 基本工资+=100
where 基本工资<500;

 
(26)	列出藏书在十本以上的图书(书名、作者、出版社)。
答:代码如下:
--列出藏书在十本以上的图书(书名、作者、出版社)。
select 书名,作者,出版单位
from book
where 总藏书量>10;

 
(27)	“数据库系统原理教程,王珊编,清华大学出版社,1998年出版”还有几本?
答:代码如下:
--“数据库系统原理教程,王珊编,清华大学出版社,1998年出版”还有几本?
insert into book values('010','5846','数据库系统','王珊','清华大学出版社',33.00,20,16);
select 书名,现有库存
from Book where 书名='数据库系统' and 作者='王珊' and 出版单位='清华大学出版社';

你可能感兴趣的:(SQL数据库,sql,数据库)