2021-12-01 数据库综合实验

先声明,本博客为个人作业不一定为标准答案,仅供参考,很有可能有错误,自己就发现了错误哈哈。。。

1、数据导入及数据清洗

(1)将原始数据文件导入到Mysql,表结构自定

导入的方式:1、通过mysql的可视化工具进行导入(navicat等);2、通过代码实现导入(python等)

我选择navicat导入txt,步骤如下:

(1)单击右键,选择导入向导

(2)选择文本文件(保存的train_data为txt文件),点击下一步

(3)选择保存好的train_data文件,导入,点击下一步

(4)因train_data文件采用制表符将各个数据隔开,所以选择制表符作为字段分隔符,点击下一步

(5)train_data文件第一行为字段名,第二行为数据开始行,与默认行数一致,不修改,点击下一步

(6)源表名为train_data,目标表名也设置为train_data,点击下一步

(7)向导已对表结构进行猜测,而train_data文件title与content数据过长,修改为longtext类型,点击下一步

(8)点击下一步

(9)单击开始,将train_data文件导入Navicat

(10)当显示Finished successfully时,导入成功,关闭

(2)清除标题或者内容是404的数据

DELETE
FROM train_data
WHERE title='404' OR content='404'

(3)清除内容是null或者是字符串null的数据

DELETE
FROM train_data
WHERE content='NULL' OR content IS NULL

清洗完数据后表如下:

 (十多万行)


12.06更新:在开始之前我一定要说,clicktime是用户的点击时间!!不是次数!!(我之前理解错了写错了,大概也只有我会错。。)

2、数据统计

(1)计算该网站每天的pv、uv,按各自的大小从高到低排序。

pv:页面浏览量或点击量

SELECT newsid,FROM_UNIXTIME(clicktime,"%Y年%m月%d日") AS time,COUNT(userid) AS pv
FROM train_data
GROUP BY FROM_UNIXTIME(clicktime,"%Y年%m月%d日")
ORDER BY pv DESC
LIMIT 5

uv:浏览网站的访客个数,一天多次访问仅算一次

SELECT newsid,FROM_UNIXTIME(clicktime,"%Y年%m月%d日") AS time,COUNT(DISTINCT userid) AS pv
FROM train_data
GROUP BY FROM_UNIXTIME(clicktime,"%Y年%m月%d日")
ORDER BY pv DESC
LIMIT 5

FROM_UNIXTIME(unix_timestamp,format)

unix_timestamp为从'1970-01-01 00:00:00' GMT开始的秒数值

format格式:

%M 月名字(January……December)

%W 星期名字(Sunday……Saturday)

%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)

%Y 年, 数字, 4 位

%y 年, 数字, 2 位

%a 缩写的星期名字(Sun……Sat)

%d 月份中的天数, 数字(00……31)

%e 月份中的天数, 数字(0……31)

%m 月, 数字(01……12)

%c 月, 数字(1……12)

%b 缩写的月份名字(Jan……Dec)

%j 一年中的天数(001……366)

%H 小时(00……23)

%k 小时(0……23)

%h 小时(01……12)

%I 小时(01……12)

%l 小时(1……12)

%i 分钟, 数字(00……59)

%r 时间,12 小时(hh:mm:ss [AP]M)

%T 时间,24 小时(hh:mm:ss)

%S 秒(00……59)

%s 秒(00……59)

%p AM或PM

%w 一个星期中的天数(0=Sunday ……6=Saturday )

%U 星期(0……52), 这里星期天是星期的第一天

%u 星期(0……52), 这里星期一是星期的第一天

%% 一个文字“%”

LIMIT 起始位置,末尾位置  用于展示部分数据

(2)查询3月份十大热点新闻,列出ID及标题

注:热点新闻:访问用户最多(非访问量)的新闻。

SELECT newsid,title,COUNT(DISTINCT userid) AS uv
FROM train_data
WHERE FROM_UNIXTIME(clicktime,"%m")='03'
GROUP BY newsid
ORDER BY uv DESC
LIMIT 10

 (3)查询3月份的排名前三的忠实用户

注:忠实用户:每天都访问网站的用户

SELECT DISTINCT userid
FROM train_data
WHERE FROM_UNIXTIME(clicktime,"%m")='03' AND userid IN
(SELECT DISTINCT userid
FROM train_data
GROUP BY userid
HAVING COUNT(DISTINCT FROM_UNIXTIME(clicktime,"%Y年%m月%d日"))=31)
GROUP BY userid
ORDER BY COUNT(userid) DESC
LIMIT 3

(4)请根据3月份的数据计算24小时内各时段(以小时为单位)的总访问量(自己定义什么是访问量),给出该网站的用户访问习惯结论

SELECT FROM_UNIXTIME(clicktime,"%H") as 时间段,COUNT(userid) AS 访问量
FROM train_data
GROUP BY 时间段
ORDER BY 时间段

 

 (5)同时查询具有特定词语的新闻如:“存款”和“余额宝”,“中国”和“工行”,“马航”和“飞机”等等,有什么样的实现方式(SQL、优化等等)。因为数据量不足原因,理论上的优化也可以。

SELECT *
FROM train_data
WHERE content REGEXP "存款|余额宝"

SELECT *
FROM train_data
WHERE content REGEXP "中国|工行"

SELECT *
FROM train_data
WHERE content REGEXP "马航|飞机"

这里使用了正则表达式模糊查询数据,用法如下:

WHERE 字段名 REGEXP ‘操作符’

模式匹配模式
^字符串的开始
$字符串的结尾
.任何单个字符
[. . . ]在方括号内的字符列表
[^ . . . ]非列在方括号内的任何字符
p1 | p2 | p3交替匹配任何模式p1,p2或p3
*零个或多个前面的元素
+前面的元素的一个或多个实例
{n}前面的元素的n个实例
{m , n}m到n个实例前面的元素

或者使用like语句:

SELECT *
FROM train_data
WHERE content LIKE '%存款%' AND content LIKE '%余额宝%'

SELECT *
FROM train_data
WHERE content LIKE '%中国%' AND content LIKE '%工行%'

SELECT *
FROM train_data
WHERE content LIKE '%马航%' AND content LIKE '%飞机%'

部分结果:


其他知识点:(做错的时候学到的)

SUBSTR(字符串,截取起始位置,截取长度)函数用于截取字符串,mysql里面字符串从1开始,且中文字符也代表1个长度

STR_TO_DATE(字符串,'字符串中日期的表现形式')用于将字符串转化为date格式

STR_TO_DATE()会自动把没有时分秒的数据添上00:00:00

DATE_FORMAT(date,date展示的形式)函数用于以不同的格式显示日期/时间数据

格式描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时 (00-23)
%h小时 (01-12)
%I小时 (01-12)
%i分钟,数值(00-59)
%j年的天 (001-366)
%k小时 (0-23)
%l小时 (1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间, 24-小时 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,与 %X 使用
%v周 (01-53) 星期一是一周的第一天,与 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,与 %V 使用
%x年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y年,4 位
%y年,2 位

本次记录就到这~~这次出错真是太触目惊心了,害怕误导到别人,下次我一定好好检查再发出。。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库是一个用来存储和管理数据的系统,数据库系统设计综合实验C主要是数据库系统设计方面的综合实验。这个实验通常会包括数据库的设计、搭建、测试和优化等多个环节,旨在让学生在实际操作中掌握数据库系统设计的全流程。 数据库系统设计综合实验C的主要内容包括: 1. 数据库设计:根据实际需求,对数据库进行设计,包括确定数据表的结构、设置主键、外键等约束条件,设计适当的索引等。 2. 数据库搭建:根据设计好的数据库结构,使用数据库管理系统(如MySQL、Oracle等)搭建数据库,创建数据表,插入数据等。 3. 数据库测试:对搭建好的数据库进行系统测试,包括对数据的增删改查操作、性能测试、安全性测试等。 4. 数据库优化:通过分析数据库性能瓶颈等问题,进行适当的优化,包括修改索引设计、优化SQL语句等。 通过这个实验,学生将能够掌握数据库系统设计的基本原理和方法,了解数据库设计的实际应用,为将来从事数据库相关工作打下坚实的基础。同时,实验还将培养学生的团队合作能力和问题解决能力,提高他们的实际操作能力。 总的来说,数据库系统设计综合实验C是一个重要的实践环节,对于学生来说具有非常重要的意义,是他们将理论知识应用到实际工作中的一个非常好的机会。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值