diff --git a/数据库系统原理与实践/平时作业/第五次作业.tex b/数据库系统原理与实践/平时作业/第五次作业.tex new file mode 100644 index 0000000..ee3c9c3 --- /dev/null +++ b/数据库系统原理与实践/平时作业/第五次作业.tex @@ -0,0 +1,215 @@ +\documentclass[全部作业]{subfiles} +\input{mysubpreamble} + +\begin{document} +\setcounter{chapter}{4} +\chapter{第四次作业} +\begin{enumerate} + \questionandanswer[]{ + 一、数据库介绍 + +Sakila 是一个由MySQL官方提供的示例数据库,主要设计用于电影租赁商店的业务场景。 + +Sakila数据库中,每个表的具体字段请参考官方文档中5.1 Tables中的解释:https://downloads.mysql.com/docs/sakila-en.a4.pdf + +二、数据导入 + +1. 在Navicat中创建一个新的数据库,命名为sakila。 + +2. 导入表结构与数据: + +方法一:右键新创建好的sakila数据库,选择“运行SQL文件”: + + + +在文件一栏中,先选择sakila-schema.sql文件进行导入,导入成功后关闭“运行SQL文件”的界面; + +同样的方法,再选择sakila-data.sql文件进行导入。 + +刷新数据库,检查表与表中的数据是否成功导入。 + +方法二:右键新创建好的sakila数据库,选择“命令列界面”。 + +执行如下两行命令: + +“source /Downloads/sakila-db/sakila-schema.sql;” + +“source /Downloads/sakila-db/sakila-data.sql;” + +刷新数据库,检查表与表中的数据是否成功导入。 + + +三、写出下面的查询语句,并保存到“实验五.docx”文件中。要求文件中除了提交SQL语句,还需有SQL语句对应的执行结果。 + }{ + + } + \questionandanswer[]{ + 请为 `rental` 表中的 `inventory_id` 添加一个外键约束,确保其引用 `inventory` 表中的 `inventory_id`,并且当 `inventory` 表中的记录被删除时,相应的 `rental` 记录也被删除。 + }{} + {\kaishu + \begin{minted}{SQL} +alter table rental add foreign key (inventory_id) references inventory (inventory_id) on delete cascade; + \end{minted} + \begin{minted}{text} +417 ms 中有 16,044 行受到影响 + \end{minted} + } + \questionandanswer[]{ + 在 `customer` 表中添加一个检查约束,确保 `active` 列的值只能是 0 或 1。 + }{} + {\kaishu + \begin{minted}{SQL} +alter table customer add check ( active in (0, 1) ); + \end{minted} + \begin{minted}{text} +102 ms 中有 599 行受到影响 + \end{minted} + } + \questionandanswer[]{ + 创建一个名为 `sakila_user` 的数据库用户,并授予其对 `film` 表的 SELECT 和 UPDATE 权限。 + }{} + {\kaishu + \begin{minted}{SQL} +create user sakila_user identified by random password; +grant select, update on film to sakila_user; + \end{minted} + \begin{csv} +,user,host,generated password +1,sakila_user,\%,"" + \end{csv} + \begin{minted}{text} +在 49 ms (execution: 36 ms, fetching: 13 ms) 内检索到从 1 开始的 1 行 +在 33 ms 内完成 + \end{minted} + } + \questionandanswer[]{ + 从 `sakila_user` 用户收回对 `film` 表的 UPDATE 权限。 + }{} + {\kaishu + \begin{minted}{SQL} +revoke update on film from sakila_user; + \end{minted} + \begin{minted}{text} +在 39 ms 内完成 + \end{minted} + } + \questionandanswer[]{ + 查询每个影片的租赁次数(包括影片名称),并按租赁次数降序排列。 + }{} + {\kaishu + \begin{minted}{SQL} +select film.title, count(*) as 租赁次数 +from film + join inventory using (film_id) + join rental using (inventory_id) +group by film.title +order by 租赁次数 desc; + \end{minted} + \begin{csv} + ,title,租赁次数 + 1,BUCKET BROTHERHOOD,34 + 2,ROCKETEER MOTHER,33 + 3,FORWARD TEMPLE,32 + 4,GRIT CLOCKWORK,32 + 5,JUGGLER HARDLY,32 + $\cdots$,$\cdots$,$\cdots$ + 954,SEVEN SWARM,5 + 955,TRAFFIC HOBBIT,5 + 956,HARDLY ROBBERS,4 + 957,MIXED DOORS,4 + 958,TRAIN BUNCH,4 + \end{csv} + } + \questionandanswer[]{ + 查询每个影片类别的租赁次数,并找出租赁次数最多的类别。 + }{} + {\kaishu + \begin{minted}{SQL} +select category.name, count(*) as 租赁次数 +from category + join film_category using (category_id) + join inventory using (film_id) + join rental using (inventory_id) +group by category.name +order by 租赁次数 desc; + \end{minted} + \begin{csv} +,name,租赁次数 +1,Sports,1179 +2,Animation,1166 +3,Action,1112 +4,Sci-Fi,1101 +5,Family,1096 +6,Drama,1060 +7,Documentary,1050 +8,Foreign,1033 +9,Games,969 +10,Children,945 +11,Comedy,941 +12,New,940 +13,Classics,939 +14,Horror,846 +15,Travel,837 +16,Music,830 + \end{csv} + + 可以看到租赁次数最多的类别是Sports。 + } + \questionandanswer[]{ + 查询每位客户的总支出金额(租赁费用),并按总支出金额降序排列。 + }{} + {\kaishu + \begin{minted}{SQL} +select concat(customer.first_name, " ", customer.last_name) 客户名称, + sum(amount) 总支出金额 +from customer + join payment using (customer_id) +group by customer_id +order by 总支出金额 desc; + \end{minted} + \begin{csv} +,客户名称,总支出金额 +1,KARL SEAL,221.55 +2,ELEANOR HUNT,216.54 +3,CLARA SHAW,195.58 +4,RHONDA KENNEDY,194.61 +5,MARION SNYDER,194.61 +$\cdots$,$\cdots$,$\cdots$ +595,ANNIE RUSSELL,58.82 +596,JOHNNY TURPIN,57.81 +597,BRIAN WYMAN,52.88 +598,LEONA OBRIEN,50.86 +599,CAROLINE BOWMAN,50.85 + \end{csv} + } + \questionandanswer[]{ + 查询出超过 6 个月没有被租赁的影片名称。 + }{} + {\kaishu + 这些影片的租赁日期都是2005年的,如果说是距离现在的话那都是超过6个月的了。但是按照题意那应该是这样写,所以筛选出了全部的电影名称。 + \begin{minted}{SQL} +select film.title +from film +where not exists(select * + from rental + right join inventory using (inventory_id) + where film.film_id = inventory.film_id + and rental_date >= date_sub(current_date, interval 6 month)); + \end{minted} + \begin{csv} +,title +1,ACADEMY DINOSAUR +2,ACE GOLDFINGER +3,ADAPTATION HOLES +4,AFFAIR PREJUDICE +5,AFRICAN EGG +$\cdots$,$\cdots$ +996,YOUNG LANGUAGE +997,YOUTH KICK +998,ZHIVAGO CORE +999,ZOOLANDER FICTION +1000,ZORRO ARK + \end{csv} + } +\end{enumerate} +\end{document} \ No newline at end of file