mysql library DB实操练习
作者:mmseoamin日期:2023-12-05

1.1查询库存表中的书号和库存状态列,要求消除重复行

mysql> use librarydb;

Database changed

mysql> select distinct 书号,库存状态 from 库存表;

+-------+----------+

| 书号  | 库存状态 |

+-------+----------+

| A0120 | 在馆     |

| A0120 | 借出     |

| A0134 | 在馆     |

| A0134 | 借出     |

| B1101 | 在馆     |

| C1269 | 丢失     |

| C1269 | 借出     |

| C3256 | 借出     |

| C3256 | 在馆     |

+-------+----------+

9 rows in set (0.03 sec)

1.2 查询读者表中的姓名和单位列,显示的列标题改为姓名显示为“name”,单位显示为“college”

mysql> select 姓名 as name,单位 as college from 读者表;

+--------+----------+

| name   | college  |

+--------+----------+

| 张小东 | 软件学院 |

| 苏明   | 财经学院 |

| 梁小红 | 软件学院 |

| 赵明敏 | 传媒学院 |

| 李丰年 | 计财处   |

+--------+----------+

5 rows in set (0.03 sec)

1.3查询图书表中每种书的书名和金额

mysql> select 书名,数量*单价 as 金额 from 图书表;

+----------------+--------+

| 书名           | 金额   |

+----------------+--------+

| 庄子           |  92.50 |

| 唐诗三百首     | 280.00 |

| 西方经济学史   | 318.40 |

| 商业博弈       | 585.00 |

| 数据结构       | 580.00 |

| 品牌策划与推广 | 252.00 |

| C语言程序设计  | 404.80 |

| MySQL数据库    | 261.00 |

+----------------+--------+

8 rows in set (0.05 sec)

1.4 查询库存表中员工的条码和库存状态,要求库存状态值为在馆时显示为“1”,借出时显示为“0”,丢失时显示为“-1”

mysql> select 条码,

    -> case

    -> when 库存状态='借出' then '0'

    -> when 库存状态='在馆' then '1'

    -> else '-1'

    -> end as 库存状态

    -> from 库存表;

+--------+----------+

| 条码   | 库存状态 |

+--------+----------+

| 123412 | 1        |

| 123413 | 0        |

| 223410 | 1        |

| 223411 | 0        |

| 311231 | 1        |

| 321123 | -1       |

| 321124 | 0        |

| 411111 | 0        |

| 411112 | 0        |

| 411113 | 1        |

+--------+----------+

10 rows in set (0.04 sec)

2.1 查询图书表中数量大于10本的图书书名、数量和出版社

mysql> select 书名,数量,出版社 from 图书表 where 数量>10;

+---------------+------+----------------+

| 书名          | 数量 | 出版社         |

+---------------+------+----------------+

| 商业博弈      |   15 | 北京大学出版社 |

| 数据结构      |   20 | 高等教育出版社 |

| C语言程序设计 |   11 | 高等教育出版社 |

+---------------+------+----------------+

3 rows in set (0.07 sec)

2.2查询库存表的存放位置含有“A”且库存状态为“借出” 的图书信息

mysql> select * from 库存表 where 库存状态='借出' and 存放位置 like '%A%';

1054 - Unknown column '存放位置' in 'where clause'

mysql> select * from 库存表 where 库存状态='借出' and 位置 like '%A%';

+--------+-------+--------+----------+

| 条码   | 书号  | 位置   | 库存状态 |

+--------+-------+--------+----------+

| 123413 | A0120 | 1-A-57 | 借出     |

| 321124 | C1269 | 3-A-13 | 借出     |

+--------+-------+--------+----------+

2 rows in set (0.09 sec)

2.3 查询图书表中财经和文学类图书数量大于5本的图书信息

mysql> select * from 图书表 where 类别='财经' or 类别='文学' and 数量>5;

+-------+--------------+------+--------+----------------+-------+------+

| 书号  | 书名         | 类别 | 作者   | 出版社         | 单价  | 数量 |

+-------+--------------+------+--------+----------------+-------+------+

| A0134 | 唐诗三百首   | 文学 | 李平   | 安徽科学出版社 | 28.00 |   10 |

| B1101 | 西方经济学史 | 财经 | 莫竹芩 | 海南出版社     | 39.80 |    8 |

| B2213 | 商业博弈     | 财经 | 孔英   | 北京大学出版社 | 39.00 |   15 |

+-------+--------------+------+--------+----------------+-------+------+

3 rows in set (0.08 sec)

2.3

mysql> select * from 图书表 where (类别='财经' or 类别='文学') and 数量>5;

+-------+--------------+------+--------+----------------+-------+------+

| 书号  | 书名         | 类别 | 作者   | 出版社         | 单价  | 数量 |

+-------+--------------+------+--------+----------------+-------+------+

| A0134 | 唐诗三百首   | 文学 | 李平   | 安徽科学出版社 | 28.00 |   10 |

| B1101 | 西方经济学史 | 财经 | 莫竹芩 | 海南出版社     | 39.80 |    8 |

| B2213 | 商业博弈     | 财经 | 孔英   | 北京大学出版社 | 39.00 |   15 |

+-------+--------------+------+--------+----------------+-------+------+

3 rows in set (0.07 sec)

2.4 查询借阅表中还书日期为空 的记录

mysql> select * from 借阅表 where 还书日期 is null;

+--------+--------+----------+------------+----------+----------+

| 借阅号 | 条码   | 读者编号 | 借阅日期   | 还书日期 | 借阅状态 |

+--------+--------+----------+------------+----------+----------+

| 100001 | 123413 | 0001     | 2020-11-05 | NULL     | 借阅     |

| 100003 | 321123 | 1001     | 2020-07-01 | NULL     | 过期     |

| 100005 | 321124 | 0001     | 2020-10-15 | NULL     | 借阅     |

| 100006 | 223411 | 2001     | 2020-10-16 | NULL     | 借阅     |

| 100008 | 411111 | 0001     | 2020-09-25 | NULL     | 借阅     |

| 100009 | 411111 | 1001     | 2020-10-08 | NULL     | 借阅     |

+--------+--------+----------+------------+----------+----------+

6 rows in set (0.09 sec)

3.1查询“张小东”的基本状况和图书借阅情况

mysql> select * from 读者表,借阅表 where 读者表.读者编号=借阅表.读者编号 and 读者表.姓名='张小东';

+----------+--------+--------+----------+--------+--------+--------+----------+------------+----------+----------+

| 读者编号 | 姓名   | 类别号 | 单位     | 有效性 | 借阅号 | 条码   | 读者编号 | 借阅日期   | 还书日期 | 借阅状态 |

+----------+--------+--------+----------+--------+--------+--------+----------+------------+----------+----------+

| 0001     | 张小东 | 1      | 软件学院 | 有效   | 100001 | 123413 | 0001     | 2020-11-05 | NULL     | 借阅     |

| 0001     | 张小东 | 1      | 软件学院 | 有效   | 100005 | 321124 | 0001     | 2020-10-15 | NULL     | 借阅     |

| 0001     | 张小东 | 1      | 软件学院 | 有效   | 100008 | 411111 | 0001     | 2020-09-25 | NULL     | 借阅     |

+----------+--------+--------+----------+--------+--------+--------+----------+------------+----------+----------+

3 rows in set (0.08 sec)

3.2查询借阅状态为“借阅”的图书的书号和条码

mysql> select 库存表.书号,借阅表.条码 from 库存表,借阅表  where 借阅表.条码=库存表.条码 and 借阅表.借阅状态='借阅';

+-------+--------+

| 书号  | 条码   |

+-------+--------+

| A0120 | 123413 |

| C1269 | 321124 |

| A0134 | 223411 |

| C3256 | 411111 |

| C3256 | 411111 |

+-------+--------+

5 rows in set (0.09 sec)

3.3查询每位读者的姓名、单位、可借天数和可借数量

mysql> select 读者表.姓名,读者表.单位,读者类型表.可借天数,读者类型表.可借数量 from 读者表,读者类型表 where 读者表.类别号=读者类型表.类别号;

+--------+----------+----------+----------+

| 姓名   | 单位     | 可借天数 | 可借数量 |

+--------+----------+----------+----------+

| 张小东 | 软件学院 |       30 |       10 |

| 苏明   | 财经学院 |       30 |       10 |

| 梁小红 | 软件学院 |       60 |       20 |

| 赵明敏 | 传媒学院 |       60 |       20 |

| 李丰年 | 计财处   |       20 |       15 |

+--------+----------+----------+----------+

5 rows in set (0.09 sec)

3.4查询每个读者的借阅信息、包括读者姓名、书名、借阅日期、借阅状态

mysql> select 读者表.姓名,图书表.书名,借阅表.借阅日期,借阅表.借阅状态 from 读者表 join 借阅表 on 读者表.读者编号=借阅表.读者编号 join 库存表 on 借阅表.条码=库存表.条码  join 图书表 on 库存表.书号=图书表.书号;

+--------+-------------+------------+----------+

| 姓名   | 书名        | 借阅日期   | 借阅状态 |

+--------+-------------+------------+----------+

| 张小东 | 庄子        | 2020-11-05 | 借阅     |

| 张小东 | 数据结构    | 2020-10-15 | 借阅     |

| 张小东 | MySQL数据库 | 2020-09-25 | 借阅     |

| 苏明   | 唐诗三百首  | 2020-09-28 | 已还     |

| 梁小红 | 数据结构    | 2020-07-01 | 过期     |

| 梁小红 | MySQL数据库 | 2020-10-08 | 借阅     |

| 赵明敏 | MySQL数据库 | 2020-09-01 | 已还     |

| 李丰年 | 数据结构    | 2020-10-09 | 已还     |

| 李丰年 | 唐诗三百首  | 2020-10-16 | 借阅     |

+--------+-------------+------------+----------+

9 rows in set (0.10 sec)

3.5查询库存表中每本书的条码、位置和借阅的读者编号。没有借阅的,读者编号用null表示

mysql> select 库存表.条码,库存表.位置,借阅表.读者编号,借阅表.借阅状态 from 库存表 left join 借阅表 on (库存表.条码=借阅表.条码);

+--------+--------+----------+----------+

| 条码   | 位置   | 读者编号 | 借阅状态 |

+--------+--------+----------+----------+

| 123412 | 1-A-56 | NULL     | NULL     |

| 123413 | 1-A-57 | 0001     | 借阅     |

| 223410 | 2-B-01 | NULL     | NULL     |

| 223411 | 2-B-02 | 0002     | 已还     |

| 223411 | 2-B-02 | 2001     | 借阅     |

| 311231 | 2-C-23 | NULL     | NULL     |

| 321123 | 3-A-12 | 1001     | 过期     |

| 321124 | 3-A-13 | 2001     | 已还     |

| 321124 | 3-A-13 | 0001     | 借阅     |

| 411111 | 3-B-01 | 1002     | 已还     |

| 411111 | 3-B-01 | 0001     | 借阅     |

| 411111 | 3-B-01 | 1001     | 借阅     |

| 411112 | 3-B-02 | NULL     | NULL     |

| 411113 | 3-B-03 | NULL     | NULL     |

+--------+--------+----------+----------+

14 rows in set (0.10 sec)

4.1 按单位统计出该单位的读者人数

mysql> select 单位,count(*) from 读者表 group by 单位;

+----------+----------+

| 单位     | count(*) |

+----------+----------+

| 软件学院 |        2 |

| 财经学院 |        1 |

| 传媒学院 |        1 |

| 计财处   |        1 |

+----------+----------+

4 rows in set (0.08 sec)

4.2查找读者数量在2人及以上的部门名称和读者人数

mysql> select 单位,count(*) as 读者人数 from 读者表 group by 单位 having count(*)>=2;

+----------+----------+

| 单位     | 读者人数 |

+----------+----------+

| 软件学院 |        2 |

+----------+----------+

1 row in set (0.02 sec)

4.3分别统计各出版社的图书平均单价和总金额

mysql> select 出版社,avg(单价) as '平均单价',sum(单价*数量) as '总金额' from 图书表 group by 出版社;

+----------------+-----------+--------+

| 出版社         | 平均单价  | 总金额 |

+----------------+-----------+--------+

| 吉林大学出版社 | 18.500000 |  92.50 |

| 安徽科学出版社 | 28.000000 | 280.00 |

| 海南出版社     | 39.799999 | 318.40 |

| 北京大学出版社 | 39.000000 | 585.00 |

| 高等教育出版社 | 32.900000 | 984.80 |

| 人民邮电出版社 | 42.000000 | 252.00 |

| 电子工业出版社 | 29.000000 | 261.00 |

+----------------+-----------+--------+

7 rows in set (0.05 sec)

4.4对借阅表先按照读者编号吗,再按照条码统计图书的借阅次数,并显示小计

mysql> select 读者编号,条码,count(*) as '借阅次数' from 借阅表 group by 读者编号,条码 order by count(*);

+----------+--------+----------+

| 读者编号 | 条码   | 借阅次数 |

+----------+--------+----------+

| 0002     | 223411 |        1 |

| 2001     | 321124 |        1 |

| 2001     | 223411 |        1 |

| 0001     | 411111 |        1 |

| 0001     | 123413 |        1 |

| 1001     | 321123 |        1 |

| 0001     | 321124 |        1 |

| 1002     | 411111 |        1 |

| 1001     | 411111 |        1 |

+----------+--------+----------+

9 rows in set (0.09 sec)

4.5 将图书表按照数量从小到大排列

mysql> select * from 图书表 order by 数量 desc;

+-------+----------------+--------+--------+----------------+-------+------+

| 书号  | 书名           | 类别   | 作者   | 出版社         | 单价  | 数量 |

+-------+----------------+--------+--------+----------------+-------+------+

| C1269 | 数据结构       | 计算机 | 李刚   | 高等教育出版社 | 29.00 |   20 |

| B2213 | 商业博弈       | 财经   | 孔英   | 北京大学出版社 | 39.00 |   15 |

| C3182 | C语言程序设计  | 计算机 | 李学刚 | 高等教育出版社 | 36.80 |   11 |

| A0134 | 唐诗三百首     | 文学   | 李平   | 安徽科学出版社 | 28.00 |   10 |

| C3256 | MySQL数据库    | 计算机 | 孙季红 | 电子工业出版社 | 29.00 |    9 |

| B1101 | 西方经济学史   | 财经   | 莫竹芩 | 海南出版社     | 39.80 |    8 |

| C3121 | 品牌策划与推广 | 计算机 | 张晓红 | 人民邮电出版社 | 42.00 |    6 |

| A0120 | 庄子           | 文学   | 庄周   | 吉林大学出版社 | 18.50 |    5 |

+-------+----------------+--------+--------+----------------+-------+------+

8 rows in set (0.09 sec)

4.6将借阅表按照借阅状态排序,状态相同的再按照借阅日期从小到大排序

mysql> select 读者编号,条码,count(*) as '借阅次数' from 借阅表 group by 读者编号,条码 order by 借阅次数;

+----------+--------+----------+

| 读者编号 | 条码   | 借阅次数 |

+----------+--------+----------+

| 0002     | 223411 |        1 |

| 2001     | 321124 |        1 |

| 2001     | 223411 |        1 |

| 0001     | 411111 |        1 |

| 0001     | 123413 |        1 |

| 1001     | 321123 |        1 |

| 0001     | 321124 |        1 |

| 1002     | 411111 |        1 |

| 1001     | 411111 |        1 |

+----------+--------+----------+

9 rows in set (0.07 sec)

mysql> select * from 借阅表 order by 借阅状态,借阅日期;

+--------+--------+----------+------------+------------+----------+

| 借阅号 | 条码   | 读者编号 | 借阅日期   | 还书日期   | 借阅状态 |

+--------+--------+----------+------------+------------+----------+

| 100008 | 411111 | 0001     | 2020-09-25 | NULL       | 借阅     |

| 100009 | 411111 | 1001     | 2020-10-08 | NULL       | 借阅     |

| 100005 | 321124 | 0001     | 2020-10-15 | NULL       | 借阅     |

| 100006 | 223411 | 2001     | 2020-10-16 | NULL       | 借阅     |

| 100001 | 123413 | 0001     | 2020-11-05 | NULL       | 借阅     |

| 100007 | 411111 | 1002     | 2020-09-01 | 2020-09-24 | 已还     |

| 100002 | 223411 | 0002     | 2020-09-28 | 2020-10-13 | 已还     |

| 100004 | 321124 | 2001     | 2020-10-09 | 2020-10-14 | 已还     |

| 100003 | 321123 | 1001     | 2020-07-01 | NULL       | 过期     |

+--------+--------+----------+------------+------------+----------+

9 rows in set (0.07 sec)

4.7对借阅表中读者按照类别组进行分组,同类别的再按照单位分别统计借阅次数,并按照次数从小到大排列

mysql> select  类别号,单位,count(*) as '借阅次数' from 借阅表,读者表 where 借阅表.读者编号=读者表.读者编号 group by 类别号,单位 order by 借阅次数 desc;

+--------+----------+----------+

| 类别号 | 单位     | 借阅次数 |

+--------+----------+----------+

| 1      | 软件学院 |        3 |

| 2      | 软件学院 |        2 |

| 3      | 计财处   |        2 |

| 1      | 财经学院 |        1 |

| 2      | 传媒学院 |        1 |

+--------+----------+----------+