一、实验目的
    1、理解SQL的特点;
    2、掌握SELECT命令的使用;
    3、掌握单表查询、集合查询、连接查询和嵌套查询;

    二、实验环境
    装有软件MySQL5.7或更高版本的PC电脑一台;

    三、实验步骤及实验要求
    按照下面的实验内容要求完成作业,将作业结果的每一步截图粘贴到word文档中即可。每一个实验都必须编写实验报告,要求如下:
    1、实验报告用word编写;
    2、word文件命名的格式统一要求:为以“杨健”同学19号为例,他所做的第4次实验的实验报告应该命令为:“DB实验4— 19号—杨健”(即格式是:实验序号—课内序号—姓名);课内序号现在是一个人一门课一个号,同一个人在不同课序号会不同,回头我会将课程名单发到群里,自己查阅你自己在本门课中的序号。
    3、实验报告用统一的封面,封面模板到时发给大家;
    4、报告中截取每题主要步骤结果的截图、实验结果截图
    5、实验报告最后要加上实验总结,总结部分必须写出自己的切身体会
    6、实验报告如有雷同、抄袭现象,后果自负;
    7、实验报告上交截止时间:上机后一周之内
    8、实验上交方式:由学委收集齐全后,统一交付老师:

    四、实验内容
    1、针对上述建立的“简易图书管理数据库”BooksDB,用SQL命令完成下述功能:
    1)单表查询
    image.png
    (1)查询所有读者的编号和姓名;

    1. SELECT rdID,rdName
    2. FROM reader_3;

    image.png
    (2)查询所有读者的编号、姓名和单位,要求修改查询结果的列名;

    1. SELECT rdID '编号',rdName '姓名',rdDept '单位'
    2. FROM reader_3;

    image.png
    (3)查询Reader表的全部列

    1. SELECT *
    2. FROM reader_3;
    3. SELECT rdID,rdType,rdName,rdDept,rdQQ,rdBorrowQty
    4. FROM reader_3;

    image.png
    (4)查询借阅过图书的读者的编号;

    1. SELECT rdID
    2. FROM reader_3
    3. WHERE rdBorrowQty > 0;

    image.png
    (5)查询单价大于30元的图书的书号和书名;

    1. SELECT *
    2. FROM book_3;
    3. SELECT bkID,bkName
    4. FROM book_3
    5. WHERE bkPrice > 30;

    image.png
    (6)查询单价不在30至40元之间的图书的书号、书名和作者;

    1. SELECT bkID,bkName,bkAuthor#,bkPrice
    2. FROM book_3
    3. WHERE bkPrice < 30 or bkPrice >40;

    image.png
    (7)查询既不是管理学院、也不是物理学院的读者的姓名和QQ;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT rdName,rdQQ
    4. FROM reader_3
    5. WHERE rdDept != "管理学院" AND rdDept != "物理学院";

    image.png
    (8)分别使用like 和 regexp查询所有姓“王”的读者的姓名、单位和QQ;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT rdName,rdDept,rdQQ
    4. FROM reader_3
    5. WHERE rdName LIKE '王%';
    6. SELECT rdName,rdDept,rdQQ
    7. FROM reader_3
    8. WHERE rdName REGEXP '^王';
    9. #like(模糊匹配)
    10. “%”:匹配0个或多个字符。
    11. _”:只能匹配一个字符。
    12. #regexp(匹配字符串)
    13. 1)‘^’匹配以该字符后面的字符开头的字符串。
    14. 2)‘$’匹配以该字符前面的字符结尾的字符串。
    15. 3)‘.’匹配任何一个单字符。
    16. 4)“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”或“b”或“c”。为了命名字符的范围,使用一个‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
    17. 5)‘*’匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的‘x’字符,“[0-9]*”匹配任何数量的数字,而“*”匹配任何数量的任何字符。

    image.png
    (9)分别使用like 和 regexp查询查询所有不姓“王”的读者的姓名、单位和QQ;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT rdName,rdDept,rdQQ
    4. FROM reader_3
    5. WHERE rdName NOT LIKE '王%';
    6. SELECT rdName,rdDept,rdQQ
    7. FROM reader_3
    8. WHERE rdName NOT REGEXP '^王';

    image.png
    (10)查询所有全名只有两个字的读者的姓名、单位和QQ;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT rdName,rdDept,rdQQ
    4. FROM reader_3
    5. WHERE rdName LIKE '__';

    image.png
    (11)查询所有图书还未归还的借阅信息;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT *
    4. FROM borrow_3;
    5. SELECT DISTINCT r.rdID,r.rdType,r.rdName,r.rdDept,r.rdQQ,r.rdBorrowQty
    6. FROM reader_3 r,borrow_3 b
    7. WHERE r.rdID = b.rdID;

    image.png
    (12)查询借阅了书号“bk2017001”的读者的编号和借书日期,查询结果按借书日期降序排列;

    1. SELECT *
    2. FROM borrow_3;
    3. SELECT rdID,DateLendPlan
    4. FROM borrow_3
    5. WHERE bkID = "bk2017001"
    6. ORDER BY DateLendPlan DESC;

    image.png
    (13)查询读者的总人数;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT COUNT(rdID)
    4. FROM reader_3;

    image.png
    (14)查询借阅过图书的读者人数;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT COUNT(rdID)
    4. FROM reader_3
    5. WHERE rdBorrowQty != 0;

    image.png
    (15)查询所有图书的最高单价;

    1. SELECT *
    2. FROM book_3;
    3. SELECT MAX(bkPrice)
    4. FROM book_3;

    image.png
    (16)查询各单位名及该单位的读者人数;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT DISTINCT rdDept,COUNT(rdDept)
    4. FROM reader_3
    5. GROUP BY rdDept;

    image.png
    (17)查询读者人数大于4的单位名及该单位的读者人数;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT DISTINCT rdDept,COUNT(rdDept)
    4. FROM reader_3
    5. GROUP BY rdDept
    6. HAVING COUNT(rdDept) > 4;

    image.png
    2)连接查询
    (18)查询类别名“教师”的所有读者的姓名和单位;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT *
    4. FROM readertype_3;
    5. SELECT r.rdName,r.rdDept
    6. FROM reader_3 r,readertype_3 rt
    7. WHERE r.rdType = rt.rdType
    8. AND rt.rdTypeName = "教师";

    image.png
    (19)查询管理学院所有读者的编号、姓名和可借书数量;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT *
    4. FROM readertype_3;
    5. SELECT r.rdID,r.rdName,rt.canLendQty
    6. FROM reader_3 r,readertype_3 rt
    7. WHERE r.rdType = rt.rdType
    8. AND r.rdDept = "管理学院";

    image.png
    (20)查询借阅了书号为“bk2017001”的读者的姓名、可借书数量和可借书天数;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT *
    4. FROM readertype_3;
    5. SELECT *
    6. FROM borrow_3;
    7. SELECT r.rdName,rt.canLendQty,rt.canLendDay
    8. FROM reader_3 r,readertype_3 rt,borrow_3 b
    9. WHERE r.rdType = rt.rdType
    10. AND r.rdID = b.rdID
    11. AND b.bkID = "bk2017001";

    image.png
    (21)查询每个读者及其借阅信息的情况(即使该读者没有借过书,也列出该读者的基本信息);

    1. SELECT *
    2. FROM reader_3;
    3. SELECT *
    4. FROM borrow_3;
    5. SELECT r.rdID,r.rdType,r.rdName,r.rdDept,r.rdQQ,r.rdBorrowQty,b.DateBorrow,b.DateLendPlan,b.DateLendAct
    6. FROM reader_3 r
    7. LEFT JOIN borrow_3 b
    8. ON r.rdID = b.rdID;

    image.png
    3)嵌套查询
    (22)查询借阅了书名为“高等数学”的读者的编号和姓名;

    1. SELECT *
    2. FROM reader_3;
    3. SELECT *
    4. FROM book_3;
    5. SELECT *
    6. FROM borrow_3;
    7. SELECT r.rdID
    8. FROM borrow_3 b,reader_3 r,book_3 bk
    9. WHERE b.rdID = r.rdID
    10. AND b.bkID = bk.bkID
    11. AND bk.bkName = "高等数学";
    12. SELECT rdID,rdName
    13. FROM reader_3
    14. WHERE rdID =
    15. (
    16. SELECT r.rdID
    17. FROM borrow_3 b,reader_3 r,book_3 bk
    18. WHERE b.rdID = r.rdID
    19. AND b.bkID = bk.bkID
    20. AND bk.bkName = '高等数学'
    21. );

    image.png
    (23)分别使用“无关子查询”和“相关子查询”来查询所有没借阅过书号为“bk2017004”的读者姓名;

    1. #无关子查询
    2. SELECT *
    3. FROM reader_3;
    4. SELECT *
    5. FROM borrow_3;
    6. SELECT rdID
    7. FROM borrow_3
    8. WHERE bkID = "bk2017004";
    9. SELECT rdName
    10. FROM reader_3
    11. WHERE rdID !=
    12. (
    13. SELECT rdID
    14. FROM borrow_3
    15. WHERE bkID = "bk2017004"
    16. );
    17. #相关子查询
    18. SELECT rdName
    19. FROM reader_3 r
    20. WHERE rdID NOT IN
    21. (
    22. SELECT rdID
    23. FROM borrow_3
    24. WHERE rdID = r.rdID
    25. AND bkID = "bk2017004"
    26. );

    image.png