1查找借阅了ISBN为“4-6045-1023-4”的借书证号,读者姓名,专业名和借书时间
use tsgl
go
select Reader.Lno,Rname,Spec,Lend.Bordate
FROM Reader,Lend
WHERE Reader.Lno=Lend.Lno AND ISBN = '4-6045-1023-4'
2查找借阅了《数据库原理》一书的借阅信息,结果显示借书证号,读者姓名,专业名,借书时间(要求用WHERE方法实现)
use tsgl
go
select Reader.Lno,Rname,Spec,Lend.Bordate
FROM Reader,Lend,Book
WHERE Reader.Lno=Lend.Lno AND Lend.ISBN = Book.ISBN AND Bname = '数据库原理'
3查询读者的借阅信息,显示借书证号、姓名、专业名、ISBN、书名、借书时间,并按借阅时间降序排序(要求用JOIN方法实现)
USE tsgl
GO
SELECT Reader.Lno, Rname, Spec, Lend.ISBN, Bname, Lend.Bordate
FROM Reader
INNER JOIN Lend ON Reader.Lno = Lend.Lno
INNER JOIN Book ON Lend.ISBN = Book.ISBN
ORDER BY Lend.Bordate DESC
4从Lend表中查询至少被两名同学借阅的图书,显示ISBN号、书名、和借阅人数。
USE tsgl
GO
SELECT Lend.ISBN, Bname, count(Lend.Lno) AS 借阅人数
FROM Lend JOIN Book
ON Lend.ISBN=Book.ISBN
GROUP BY Lend.ISBN ,Book.Bname Having count(Lend.Lno)>=2
5 查询与“王朋”同一专业的读者信息
USE tsgl
GO
SELECT *
FROM Reader
WHERE Dept = (
SELECT Dept
FROM Reader
WHERE Rname = '王朋'
)
如果已知王朋是哪个系
USE tsgl
GO
SELECT *
FROM Reader
WHERE Dept = '计算机系'
结果是一样的
6 查询从来没有借阅过图书的学生信息
USE tsgl
GO
SELECT *
FROM Reader
WHERE Lno NOT IN(
SELECT DISTINCT Lno
FROM Lend
WHERE Lno IS NOT NULL
)
一开始我写的没有让Lend里的Lno不等于NULL时查询出来的是空我很纳闷
USE tsgl
GO
SELECT *
FROM Reader
WHERE Lno NOT IN(
SELECT DISTINCT Lno
FROM Lend
)
然后问gpt说可能我的Lno 存在空值:如果 Reader 表或 Lend 表中的 Lno 列中存在 NULL 值,则导致该查询无法正确匹配,结果集为空。您可以使用 IS NOT NULL 运算符或 INNER JOIN 语句的方式规避这个问题。
于是我查了一下Lend的Lno发现真的存在NULL值我也不知道为什么!!!
7 查询没有借书未还的读者信息(利用Lend和Reader表的外连接实现查询)
USE tsgl
GO
SELECT *
FROM Reader FULL JOIN Lend ON Reader.Lno = Lend.Lno
WHERE Lend.Lno IS NULL
第七题有点儿不懂可能写的不对hhh
8 查询曾借阅了同一种图书的所有读者对
USE tsgl
GO
SELECT L1.Lno, L2.Lno
FROM Lend L1
INNER JOIN Lend L2 ON L1.ISBN = L2.ISBN AND L1.Lno < L2.Lno
WHERE L1.ISBN IN (
SELECT ISBN
FROM Lend
GROUP BY ISBN
HAVING COUNT(*) > 1
)
感觉这个题有点儿坑,因为三个人借了同一本书有三个读者对,两个人借了同一本书只有一个读者对,只有一个人借了同一本书就没有读者对,也不知道我理解的对不对~
9从lend表和Reader表中查询各专业读者的人数,平均借阅册数,结果显示专业名、专业人数和人均节约图书册数、统计借阅册数不要直接使用Reader表中的Bornum属性值来实现。
USE tsgl
GO
SELECT Reader.Spec AS 专业名, COUNT(DISTINCT Reader.Lno) AS 专业人数,
ROUND(COUNT(Lend.ISBN) / COUNT(DISTINCT Reader.Lno),2) AS 人均借阅册数
FROM Reader
LEFT JOIN Lend
ON Reader.Lno = Lend.Lno
GROUP BY Reader.Spec;
人数是没错的,但人均借阅册数我不知道对不对
10 列出有超期还书记录的读者的借书证号、姓名及书名
USE tsgl
GO
SELECT L.Lno, R.Rname, B.Bname
FROM Lend L
JOIN Reader R ON L.Lno = R.Lno
JOIN Book B ON L.ISBN = B.ISBN
WHERE DATEDIFF(day, L.Bordate, GETDATE()) > 60
仅供个人参考后面几题我也不知道对不对