一. 在命令行模式下登录MySQL数据库,使用SQL语句如下要求:
1. 创建留言数据库: blogdb。
2. 在blogdb数据库中创建会员表users和博客文章表blog,结构如下
3. 在会员表users中添加>=5条的测试数据。
4. 在blog博文信息表中添加>=10条的测试数据。
5. 最后将blogdb数据库中的信息导出,并以blogdb.sql文件存储待上交作业。
操作流程:
– 连接数据库
C:\Python>mysql -h localhost -u root -p
Enter password:
– 创建blogdb数据库
MariaDB [(none)]>create database if not exists blogdb;
– 选择进入blogdb数据库
MariaDB [(none)]>use blogdb;
– 创建users表格
MariaDB [blogdb]>create table users(
->id int unsigned auto_increment not null primary key comment ‘id号’,
->name varchar(32) not null unique comment ‘姓名’,
->email varchar(100) comment ‘邮箱地址’,
->cdate datetime comment ‘注册时间’);
– 查看users表结构
– 创建blog表格
MariaDB [blogdb]>create table blog(
->id int unsigned not null auto_increment primary key comment ‘id号’,
->title varchar(100) not null comment ‘标题’,
->abstract varchar(200) not null comment ‘摘要’,
->content text not null comment ‘博文内容’,
->uid int unsigned comment ‘用户标识’,
->pcount int unsigned default 0 comment ‘点赞数’,
->flag tinyint unsigned default 0 comment ‘0新建,1发布,2删除’,
->cdate datetime comment ‘创建时间’);
– 查看blog表结构
–添加users数据
MariaDB [blogdb]>insert into users values
->(1,‘测试姓名1’,‘测试邮箱地址1’,‘2018-09-05 14:56:30’),
->(null,‘测试姓名2’,‘测试邮箱地址2’,‘2018-09-10 09:21:45’),
->(null,‘测试姓名3’,‘测试邮箱地址3’,‘2018-08-25 10:09:15’),
->(null,‘测试姓名4’,‘测试邮箱地址4’,‘2018-09-12 12:30:41’),
->(null,‘测试姓名5’,‘测试邮箱地址5’,‘2018-07-20 21:51:32’),
->(null,‘测试姓名6’,‘测试邮箱地址6’,‘2018-09-11 08:03:52’),
->(null,‘测试姓名7’,‘测试邮箱地址7’,‘2018-09-13 10:29:14’),
->(null,‘测试姓名8’,‘测试邮箱地址8’,‘2018-09-13 16:47:29’),
->(null,‘测试姓名9’,‘测试邮箱地址9’,‘2018-09-20 12:16:34’);
– 查看users数据
–添加blog数据
MariaDB [blogdb]>insert into blog values
->(1,‘测试标题1’,‘测试摘要1’,‘测试博文内容1’,1,5,1,‘2018-09-13 08:50:20’),
->(null,‘测试标题2’,‘测试摘要2’,‘测试博文内容2’,2,18,1,‘2018-09-11 10:21:55’),
->(null,‘测试标题3’,‘测试摘要3’,‘测试博文内容3’,3,1,1,‘2018-08-30 14:51:13’),
->(null,‘测试标题4’,‘测试摘要4’,‘测试博文内容4’,4,153,1,‘2018-09-13 12:41:39’),
->(null,‘测试标题5’,‘测试摘要5’,‘测试博文内容5’,5,8,1,‘2018-08-02 19:40:51’),
->(null,‘测试标题6’,‘测试摘要6’,‘测试博文内容6’,6,54,1,‘2018-09-13 15:10:24’),
->(null,‘测试标题7’,‘测试摘要7’,‘测试博文内容7’,1,17,1,‘2018-09-10 17:20:31’),
->(null,‘测试标题8’,‘测试摘要8’,‘测试博文内容8’,2,22,1,‘2018-09-13 21:52:43’),
->(null,‘测试标题9’,‘测试摘要9’,‘测试博文内容9’,3,22,1,‘2018-09-13 21:52:43’),
->(null,‘测试标题10’,‘测试摘要10’,‘测试博文内容10’,4,102,1,‘2018-09-13 22:32:26’),
-> (null,‘测试标题11’,‘测试摘要11’,‘测试博文内容11’,5,0,0,‘2018-09-19 15:12:45’),
->(null,‘测试标题12’,‘测试摘要12’,‘测试博文内容12’,6,10,2,‘2018-09-17 10:22:31’),
->(null,‘测试标题13’,‘测试摘要13’,‘测试博文内容13’,7,0,0,‘2018-09-12 21:43:50’),
->(null,‘测试标题14’,‘测试摘要14’,‘测试博文内容14’,8,5,2,‘2018-09-15 19:31:22’);
– 查看blog数据
篇幅限制,后数据省略
– 将blogdb数据库中的信息导出blogdb.sql文件
C:\Users\Desktop>mysqldump -u root -p -B blogdb>blogdb.sql
该指令带建库语句-B
另外,在操作过程中有一个问题:如上所示,给users和blog表分别添加了8条和14条数据,因为两个表的id字段设置了自增(auto increment)属性,按理说,新添加数据的id字段可以不需要赋值或赋null值,系统会自动自增按序。但是在给两个表再新添加1条数据时,发现新添加的数据分别从10、12开始排序了,中间跳了1位,再添加数据后面就正常了。这种情况还没有找到原因,请大家不吝赐教!!
二、如第一题的表结构所示,按下面要求写出对应的SQL语句:
1.在users表中查询注册时间最早的十条会员信息。
2.从两个表中查询点赞数最高的5条博客信息,要求显示字段:(博文id,标题,点赞数,会员名)。
3.统计每个会员的发表博文数量(降序),要求显示字段(会员id号,姓名,博文数量)。
4.获取会员的博文平均点赞数量最高的三位。显示字段(会员id,姓名,平均点赞数)。
5.删除没有发表博文的所有会员信息。
具体操作:
1.在users表中查询注册时间最早的十条会员信息。
MariaDB [blogdb]>select * from users order by cdate asc limit 10;
– 查询结果
2.从两个表中查询点赞数最高的5条博客信息,要求显示字段:(博文id,标题,点赞数,会员名)。
MariaDB [blogdb]>select b.id 博文id,b.title 标题,b.pcount 点赞数,u.name 会员名 from blog b,users u where b.uid=u.id order by b.pcount desc limit 5;
– 查询结果
3.统计每个会员的发表博文数量(降序),要求显示字段(会员id号,姓名,博文数量)。
MariaDB [blogdb]>select u.id 会员id号,u.name 姓名,count(b.uid) 博文数量 from users u left join blog b on u.id=b.uid and b.flag=1 group by u.id order by 博文数量 desc;
需要注意的是:flag字段为0(新增)、2(删除)的博文,不能统计到发表博文数里面。
– 查询结果
4.获取会员的博文平均点赞数量最高的三位。显示字段(会员id,姓名,平均点赞数)。
MariaDB [blogdb]>select u.id 会员id,u.name 姓名,avg(b.pcount) 平均点赞数 from users u left join blog b on u.id=b.uid group by u.id order by 平均点赞数 desc limit 3;
– 查询结果
5.删除没有发表博文的所有会员信息。
MariaDB [blogdb]>delete from users where id in(select * from (select u.id from users u left join blog b on u.id=b.uid and b.flag=1 group by u.id having count(b.uid)=0) as temp);
需要注意的是:没有发表博文的会员包含2种情况,一是没有发布状态的博文,但有新建(flag=0)和删除(flag=2)状态的博文;二是注册了会员,但没有撰写过任何博文,users表有注册用户信息,blog表中没有任何记录。用删除语句时,主表users不能放在子查询里面,不然数据库会报错(Table ‘users’ is specified twice, both as a target for ‘DELETE’ and as a separate source for data),这里用了一个缓存表 select * from ((…)) as temp 来解决该问题。
– 查询结果
最好在执行删除操作前,先开启事务,可以通过rollback回滚恢复数据。
MariaDB [blogdb]> set autocommit = 0;
MariaDB [blogdb]> rollback;
MariaDB [blogdb]> set autocommit = 1;