一、课程名称: 数据库原理
二、实验名称:实验4 SQL语句——复杂查询及数据更新
三、实验地点与实验环境:
装有MySQL的PC机。
四、实验内容
数据查询:
1. 查询在2004年1月1日之前借书读者的编号、书名、借阅日期的信息。
2. 查询借阅了“应用文写作”这本书的读者的编号、姓名。
3. 使用子查询求其它类别中比管理类图书总藏书量都少的类别、书名、总藏书量。
4. 使用子查询in:找出借阅了1001号书的读者姓名,单位。
5. 使用相关子查询找出借了两本书的读者编号,姓名,单位。
6. 使用相关子查询找出每个出版社价格最贵的图书书名、出版社、价格信息。
7. 用相关子查询exists:找出没有借过书的读者编号及姓名。
数据更新:
8. 将管理类的书籍提价10%。
9. 将1009号读者的单位改为“计算机学院”。
10. 添加读者信息,读者编号:1022,姓名:李思思,单位:信息学院,性别:女。
11. 将1022号读者信息删除。
12. 1008号读者在2012年3月5号下午4点20分借了1002号图书1本,假设此图书的库存足够,请用SQL语句完成上述借书操作。
13. 1010号读者在2001年5月26日上午9点50分归还借阅的1005号图书1本,请用SQL语句完成上述还书操作。
五、实验步骤、结果或结论:
1. 查询在2004年1月1日之前借书读者的编号、书名、借阅日期的信息。
select reader_number,book_name,borrow_time
from borrow_book,book
where borrow_book.book_number=book.book_number AND
borrow_time <"2004.01.01";
或
select reader_number,book_name,borrow_time
FROM borrow_book natural join book
WHERE borrow_time<'2004-01-01';
2. 查询借阅了“应用文写作”这本书的读者的编号、姓名。
select reader.reader_number,name
from book,borrow_book,reader
where reader.reader_number=borrow_book.reader_number AND
borrow_book.book_number=book.book_number AND
book_name='应用文写作';
或
SELECT reader.reader_number,name
FROM borrow_book natural join book natural join reader
WHERE book_name='应用文写作';
3. 使用子查询求其它类别中比管理类图书总藏书量都少的类别、书名、总藏书量。
select category,book_name,book_total
from book
where book_total<ALL(select book_total
from book
where category='管理')
AND category!='管理';
或
select category,book_name,book_total
from book
where book_total<(select MIN(book_total)
from book
where category='管理')
AND category!='管理';
4. 使用子查询in:找出借阅了1001号书的读者姓名,单位。
select name,department
from reader
where reader_number in(select reader_number
from borrow_book
where book_number='1001');
5. 使用相关子查询找出借了两本书的读者编号,姓名,单位。
select reader_number,name,department
from reader
where reader_number in (select reader_number
from borrow_book
group by reader_number
having count(*)=2);
SELECT reader_number,name,department
FROM reader
WHERE (SELECT COUNT(reader_number)
FROM borrow_book
WHERE reader.reader_number=borrow_book.reader_number)=2;
6. 使用相关子查询找出每个出版社价格最贵的图书书名、出版社、价格信息。
select book_name,publisher,price
from book x
where price = (select MAX(price)
from book y
where y.publisher = x.publisher);
7. 用相关子查询exists:找出没有借过书的读者编号及姓名。
select reader_number,name
from reader
where not exists(select *
from borrow_book
where reader.reader_number=borrow_book.reader_number);
更新前
8. 将管理类的书籍提价10%。
update book
set price=price*1.1
where category='管理';
9. 将1009号读者的单位改为“计算机学院”。
update reader
set department = '计算机学院'
where reader_number='1009';
10. 添加读者信息,读者编号:1022,姓名:李思思,单位:信息学院,性别:女。
insert into reader (reader_number,name,department,gender)
values ('1022', '李思思', '信息学院', '女');
11. 将1022号读者信息删除。
delete from reader
where reader_number='1022';
12. 1008号读者在2012年3月5号下午4点20分借了1002号图书1本,假设此图书的库存足够,请用SQL语句完成上述借书操作。
(1)添加借阅记录
insert into borrow_book
values('1008','1002','2012-03-05-16:20');
(2)更新库存
update book
set inventory=inventory-1
where book_number='1002';
13. 1010号读者在2001年5月26日上午9点50分归还借阅的1005号图书1本,请用SQL语句完成上述还书操作。
(1)更新库存
update book
set inventory=inventory+1
where book_number='1005';
(2)删除借阅记录
DELETE from borrow_book
WHERE book_number='1005' AND reader_number='1010';
(3)添加已还记录
insert into return_book
values('1010','1005','2001-05-26 09:50');