MySql 数据库设计与应用 第七章项目练习

阶段项目——QQ数据库管理

任务概述: 模拟QQ在线聊天系统

  • 后台数据库的创建

  • 基本数据表的创建

  • 表约束、 表间关系的添加

  • 进行数据增加、 删除、 修改、 查询

    一.创建表

创建QQUser表

  1. # 创建数据库
  2. CREATE DATABASE `mysqlqq`;
  3. #打开数据库
  4. USE `mysqlqq`;
  5. #创建QQUser表
  6. CREATE TABLE `qquser` (
  7. `QQID` BIGINT(15) NOT NULL COMMENT 'QQ号',
  8. `passWord` VARCHAR(50) NOT NULL COMMENT '密码',
  9. `lastLogTime` DATETIME NOT NULL COMMENT '最后一次登录时间',
  10. `online` INT NOT NULL COMMENT '在线状态',
  11. `level` INT(50) DEFAULT'0' NOT NULL COMMENT '用户等级',
  12. PRIMARY KEY (`QQID`)
  13. ) ENGINE=INNODB DEFAULT CHARSET=utf8;

创建Baseinfo表

  1. 创建Baseinfo
  2. CREATE TABLE `baseinfo` (
  3. `QQID` BIGINT(15) DEFAULT NULL COMMENT 'QQ号',
  4. `nickName` VARCHAR(50) NOT NULL COMMENT '昵称',
  5. `sex` INT DEFAULT NULL COMMENT '性别',
  6. `age` INT DEFAULT NULL COMMENT '年龄',
  7. `province` VARCHAR(50) DEFAULT NULL COMMENT '省份',
  8. `city` VARCHAR(50) DEFAULT NULL COMMENT '城市',
  9. `address` VARCHAR(50) DEFAULT NULL COMMENT '详细地址',
  10. `phone` VARCHAR(50) DEFAULT NULL COMMENT '联系方式',
  11. KEY `QQID` (`QQID`)
  12. ) ENGINE=INNODB DEFAULT CHARSET=utf8;

创建Relation表

  1. 创建Relation
  2. CREATE TABLE `relation` (
  3. `QQID` BIGINT(15) NOT NULL COMMENT '用户A的QQ号',
  4. `RelationQQID` BIGINT(15) NOT NULL COMMENT '用户B的QQ号',
  5. `RelationStatus` INT NOT NULL COMMENT '用户关系:0表示B是A的好友,1表示B是A的黑名单',
  6. PRIMARY KEY (`QQID`,`RelationQQID`)
  7. ) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • 二.添加约束

  • QQ密码不得少于6位

  • 在线状态的值必须为0、 1、 2, 0表示在线, 1表示离线, 2表示隐身

  • 用户关系只能是数字0、 1, 0表示好友, 1表示黑名单人物

  • 性别允许为空值, 如果输入值就必须为0或1,0表示男, 1表示女

  • 用户等级默认值为0

  • 年龄必须是在1~100之间的整数

    1. -- 添加`qquser`表约束
    2. ALTER TABLE `qquser` ADD CONSTRAINT CHECK(`QQID`>=6);
    3. ALTER TABLE `qquser` ADD CONSTRAINT CHECK(`online`IN(0,1,2));
    4. -- 添加`baseinfo`表约束
    5. ALTER TABLE `baseinfo` ADD CONSTRAINT CHECK(`QQID`>=6);
    6. ALTER TABLE `baseinfo` ADD CONSTRAINT CHECK(`sex`IN(NULL,0,1));
    7. ALTER TABLE `baseinfo` ADD CONSTRAINT CHECK(`age`>=1 AND `age`<=100);
    8. -- 添加`relation`表约束
    9. ALTER TABLE `relation` ADD CONSTRAINT CHECK(`RelationStatus`IN(0,1,2));
    10. ALTER TABLE `relation` ADD CONSTRAINT CHECK(`QQID`>=6);
    11. ALTER TABLE `relation` ADD CONSTRAINT CHECK(`RelationQQID`>=6);

    三.建立表间关系

  1. -- 建立表关系
  2. ALTER TABLE `baseinfo` ADD CONSTRAINT FOREIGN KEY(`QQID`) REFERENCES `qquser` (`QQID`);
  3. ALTER TABLE `relation` ADD CONSTRAINT FOREIGN KEY(`QQID`) REFERENCES `qquser` (`QQID`);
  4. ALTER TABLE `relation` ADD CONSTRAINT FOREIGN KEY(`RelationQQID`) REFERENCES `qquser` (`QQID`);

四.插入测试数据

  • 打开navicat
  • 导入文件
  • 插入成功

五.查询数据

  • 查询昵称为“小笨猪” 的用户信息

    1. -- 查询昵称为“小笨猪” 的用户信息
    2. SELECT *
    3. FROM `baseinfo`
    4. WHERE `nickName`='小笨猪';
  • 查询QQ号码为88662753的用户的所有好友信息

    显示QQ号码( QQID) 、 昵称( NickName) 、 年龄( Age)

    1. -- 查询QQ号码为88662753的用户的所有好友信息 显示QQ号码( QQID 昵称( NickName 年龄( Age
    2. SELECT r.`QQID` AS 'QQ号', b.`QQID` AS '好友QQ号',b.`nickName` AS '昵称',b.`age` AS '年龄'
    3. FROM `relation` AS r,`baseinfo` AS b
    4. WHERE r.`QQID`='88662753' AND r. `RelationStatus`= 0 AND r.`RelationQQID`= b.`QQID`;
  • 查询当前在线用户信息

    1. -- 查询当前在线用户信息
    2. SELECT q.`QQID` AS 'QQ号' , b.`nickName` AS '昵称', b.`sex` AS '性别', b.`age` AS '年龄', b.`province` AS '省份',b.`city` AS '城市'
    3. FROM `qquser` AS q ,`baseinfo` AS b
    4. WHERE `online`=0 AND b.`QQID`=q.`QQID`;
  • 查询北京市、 年龄在18-45岁之间的在线用户的信息

    1. -- 查询北京市、 年龄在18-45岁之间的在线用户的信息
    2. SELECT q.`QQID` AS 'QQ号' , b.`nickName` AS '昵称', b.`sex` AS '性别', b.`age` AS '年龄', b.`province` AS '省份',b.`city` AS '城市'
    3. FROM `qquser` AS q,`baseinfo` AS b
    4. WHERE b.`city` LIKE '%北京%' AND (b.`age`BETWEEN 18 AND 45) AND `online`=0 AND b.`QQID`=q.`QQID`;
  • 查询QQ号码为54789625的用户的好友中每个省份的总人数

    按总人数由大到小排序

    1. -- 查询QQ号码为54789625的用户的好友中每个省份的总人数 按总人数由大到小排序
    2. SELECT b.`province` AS '省份',COUNT(*) AS '总人数'
    3. FROM`relation` AS r,`baseinfo` AS b
    4. WHERE r.`QQID`='54789625'AND r.`RelationStatus`= 0 AND b.`QQID`=r.`RelationQQID`
    5. GROUP BY b.`province`
    6. ORDER BY COUNT(*) DESC;
  • 查询至少有1000天未登录QQ账号的用户信息

    显示QQ号码、 最后一次登录时间、 等级、 昵称、 年龄

    按时间降序排序

    1. -- 查询至少有1000天未登录QQ账号的用户信息 显示QQ号码、 最后一次登录时间、 等级、 昵称、 年龄 按时间降序排序
    2. SELECT b.`QQID` AS 'QQ号码',q.`lastLogTime` AS '最后一次登录时间', q.`level` AS '用户等级',b.`nickName` AS '昵称',b.`age` AS '年龄'
    3. FROM `baseinfo` AS b,`qquser` AS q
    4. WHERE DATEDIFF(NOW(),`lastLogTime`)>1000 AND b.`QQID`= q.`QQID`
    5. ORDER BY `lastLogTime` DESC ;
  • 查询QQ号码为54789625的好友中等级为10级以上的“月亮” 级

    用户信息

    1. -- 查询QQ号码为54789625的好友中等级为10级以上的“月亮” 用户信息
    2. SELECT r.`QQID` AS 'QQ号' ,r.`RelationQQID` AS '好友QQ号', b.`nickName` AS '昵称', b.`sex` AS '性别', b.`age` AS '年龄',q.`level` AS '等级'
    3. FROM `baseinfo` AS b
    4. JOIN `qquser` AS q ON b.`QQID` =q.`QQID`
    5. JOIN `relation` AS r ON r.`RelationQQID`=q.`QQID`
    6. WHERE r.`QQID`='54789625' AND `RelationStatus` =0 AND q.`level`>=10 ;
  • 查询QQ号码为54789625的好友中隐身的用户信息

    显示QQ号、 好友QQ号、 昵称、 年龄

    1. -- 查询QQ号码为54789625的好友中隐身的用户信息 显示QQ号、 好友QQ号、 昵称、 年龄
    2. SELECT r.`QQID` AS 'QQ号',r.`RelationQQID` AS '好友QQ号',b.`nickName` AS '好友昵称',b.`age` AS '年龄'
    3. FROM `relation` AS r
    4. JOIN `baseinfo` AS b ON b.`QQID` =r.`RelationQQID`
    5. JOIN `qquser` AS q ON r.`RelationQQID`=q.`QQID`
    6. WHERE r.`QQID`='54789625' AND r.`RelationStatus`=0 AND q.`online`=2;
  • 查询好友超过20个的用户QQ号码及其好友总数

    1. -- 查询好友超过20个的用户QQ号码及其好友总数
    2. SELECT `QQID` AS 'QQ号码',COUNT(*) AS '好友总数'
    3. FROM `relation` AS r
    4. WHERE `RelationStatus` =0
    5. GROUP BY `QQID`
    6. HAVING COUNT(*)>20;
  • 查看信誉度统计

    1. -- 查询好友超过20个的用户QQ号码及其好友总数
    2. SELECT `QQID` AS 'QQ号码',COUNT(*) AS '好友总数'
    3. FROM `relation` AS r
    4. WHERE `RelationStatus` =0
    5. GROUP BY `QQID`
    6. HAVING COUNT(*)>20;
  • 管理员需要查询被当作黑名单人物次数排名前10的用户

    1. -- 查看信誉度统计 管理员需要查询被当作黑名单人物次数排名前10的用户
    2. SELECT `RelationQQID` AS 'QQ号',COUNT(*) AS 黑名单次数
    3. FROM Relation
    4. WHERE `RelationStatus` = 1
    5. GROUP BY RelationQQID
    6. ORDER BY COUNT(*) DESC
    7. LIMIT 10 ;

六.修改数据

  • 假设我的QQ号码为8855678, 今天我隐身登录

    1. -- 假设我的QQ号码为8855678 今天我隐身登录
    2. SELECT *
    3. FROM `qquser`
    4. WHERE `QQID`='8855678';
    5. UPDATE `qquser` SET `online`=2,`lastLogTime`=NOW()
    6. WHERE `QQID`='8855678';
  • 假设我的QQ号码为8855678

    修改我的昵称为“被淹死的鱼” , 地址为“解放中路6号院106室”

    1. -- 假设我的QQ号码为8855678 修改我的昵称为“被淹死的鱼” 地址为“解放中路6号院106室”
    2. SELECT *
    3. FROM `baseinfo`
    4. WHERE `QQID` ='8855678';
    5. UPDATE `baseinfo` SET `nickName`='被淹死的鱼',`address`='解放中路6号院106室'
    6. WHERE `QQID` ='8855678';
  • 假设我的QQ号码为8855678

    将我的好友“248624066” 拖进黑名单

    1. -- 假设我的QQ号码为8855678 将我的好友“248624066 拖进黑名单
    2. SELECT *
    3. FROM `relation`
    4. WHERE `QQID`='8855678' AND `RelationQQID`='248624066';
    5. UPDATE `relation` SET `RelationStatus` =1
    6. WHERE `QQID`='8855678' AND `RelationQQID`='248624066';
  • 为了提高QQ用户的聊天积极性

    把等级小于6级的用户等级都提升1个级别

    1. -- 为了提高QQ用户的聊天积极性 把等级小于6级的用户等级都提升1个级别
    2. SELECT *
    3. FROM `qquser`
    4. WHERE `level`<6;
    5. UPDATE `qquser`SET`level`=`level`+1
    6. WHERE`level`<6;
  • 管理员将超过365天没有登录过的QQ锁定

    将等级设定为-1

    1. -- 管理员将超过365天没有登录过的QQ锁定 将等级设定为-1
    2. SELECT *
    3. FROM `qquser`
    4. WHERE (NOW()-`lastLogTime`)>=365;
    5. UPDATE `qquser` SET`level`=-1
    6. WHERE (NOW()-`lastLogTime`)>=365;
  • 为了奖励用户, 将好友数量超过20的用户等级提升1个级别

    1. -- 为了奖励用户, 将好友数量超过20的用户等级提升1个级别
    2. SELECT *
    3. FROM `qquser`
    4. WHERE `QQID` IN(
    5. SELECT `QQID`
    6. FROM `relation`
    7. WHERE `RelationStatus`=0
    8. GROUP BY `QQID`
    9. HAVING COUNT(*)>20);
    10. UPDATE `qquser` SET `level`=`level`+1
    11. WHERE`QQID`IN(
    12. SELECT `QQID`
    13. FROM `relation`
    14. WHERE `RelationStatus`=0
    15. GROUP BY `QQID`
    16. HAVING COUNT(*)>20);
  • 把QQ号码为286314的用户的好友“嘟嘟鱼” 拖进黑名单中

    1. -- QQ号码为286314的用户的好友“嘟嘟鱼” 拖进黑名单中
    2. SELECT *
    3. FROM `baseinfo` AS b ,`relation` AS r
    4. WHERE r.`QQID`='286314' AND `RelationStatus` =0 AND `RelationQQID`IN(SELECT `QQID`
    5. FROM `baseinfo`
    6. WHERE `nickName`='嘟嘟鱼');
    7. UPDATE `relation` SET`RelationStatus` =1
    8. WHERE `RelationQQID`IN(SELECT `QQID`
    9. FROM `baseinfo`
    10. WHERE `nickName`='嘟嘟鱼') AND `RelationStatus` =0;

七.删除数据

  • 把QQ号码为54789625的用户的黑名单中的用户删除

    1. -- QQ号码为54789625的用户的黑名单中的用户删除
    2. SELECT *
    3. FROM `relation`
    4. WHERE `QQID`='54789625'AND`RelationStatus`=1;
    5. DELETE FROM `relation`
    6. WHERE `QQID`='54789625'AND`RelationStatus`=1;
  • QQ号码为622009019的用户多次在QQ中发布违法信息

    造成了很坏的影响, 因此管理员决定将其删除

    1. -- QQ号码为622009019的用户多次在QQ中发布违法信息造成了很坏的影响, 因此管理员决定将其删除
    2. SELECT *
    3. FROM `baseinfo`
    4. WHERE `QQID`='622009019';
    5. DELETE FROM `relation`
    6. WHERE `QQID`='622009019' OR`RelationQQID`='622009019';
    7. DELETE FROM `baseinfo`
    8. WHERE `QQID`='622009019';
    9. DELETE FROM `qquser`
    10. WHERE `QQID`='622009019';
  • 删除超过1000天没有登录过的QQ用户信息

    1. -- 删除超过1000天没有登录过的QQ用户信息
    2. SELECT `QQID`
    3. FROM `qquser`
    4. WHERE DATEDIFF(NOW(),`lastLogTime`)>1000;
    5. DELETE FROM `relation`
    6. WHERE `QQID` IN(SELECT `QQID`
    7. FROM `qquser`
    8. WHERE DATEDIFF(NOW(),`lastLogTime`)>1000) OR `RelationQQID` IN(SELECT `QQID`
    9. FROM `qquser`
    10. WHERE DATEDIFF(NOW(),`lastLogTime`)>1000);
    11. DELETE FROM `baseinfo`
    12. WHERE `QQID` IN(SELECT `QQID`
    13. FROM `qquser`
    14. WHERE DATEDIFF(NOW(),`lastLogTime`)>1000);
    15. DELETE FROM `qquser`
    16. WHERE DATEDIFF(NOW(),`lastLogTime`)>1000;
    17. SELECT `QQID`
    18. FROM `qquser`
    19. WHERE DATEDIFF(NOW(),`lastLogTime`)>1000;

Mysql阶段性项目——QQ数据库管理的更多相关文章

  1. 连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的,

    连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的, 2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factor ...

  2. 云服务器+tomcat+mysql+web项目搭建部署

    云服务器+tomcat+mysql+web项目搭建部署 1.老样子,开头墨迹两句. 作为我的第二篇文章,有很多感慨,第一篇人气好低啊,有点小丧气,不过相信我还是经验少,分享的都是浅显的,所以大家可能不 ...

  3. springboot成神之——springboot+mybatis+mysql搭建项目简明demo

    springboot+mybatis+mysql搭建项目简明demo 项目所需目录结构 pom.xml文件配置 application.properties文件配置 MyApplication.jav ...

  4. EF6 + MySql 建立项目引用失败

    EF6 + MySql 建立项目 步骤 在项目中使用” NuGet” 包添加 EntityFramework 和 MySql.Data ,如下图 (1)       在NuGet界面中的“浏览”选项卡 ...

  5. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

  6. freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建

    今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...

  7. Eclipse+Spring+SpringMVC+Maven+Mybatis+MySQL+Tomcat项目搭建

    ---恢复内容开始--- 1. 建表语句及插入数据 CREATE TABLE `book_user` ( user_id INT(11) NOT NULL AUTO_INCREMENT, user_n ...

  8. php+mysql+apache项目运行所遇到的一系列配置问题

    今天运行一个php项目时,突然发现访问不了了.起因应该是mac系统升级,导致apache配置文件完全恢复到了默认状态,一切归零.作为一个经验尚欠的前端,对这些后台配置完全是一窍不通,赶紧微信联系了小胖 ...

  9. SpringMVC+Mybatis+Mysql实战项目学习--环境搭建

    1.开发IDE:Spring Tool Suite(自带maven插件) 下载地址https://spring.io/tools/sts/all 在STS.ini配置信息中加下面一行 保证编码格式为u ...

随机推荐

  1. 监控pos收银机

    1.打开pos收银机snmp功能 控制面板-->程序和功能-->启用或关闭windows功能→简单网络管理协议(SNMP) 2.配置snmp服务 控制面板-->管理工具-->服 ...

  2. 微服务探索之路04篇k8s增加子节点,metrics资源监控,ingress-nginx域名配置及https配置

    1 k8s增加子节点 1.1 子节点服务器安装docker,使用脚本自动安装 curl -fsSL https://get.docker.com | bash -s docker --mirror A ...

  3. Linux文本三剑客-grep

    Global search REgular expression and Print out the line 全局搜索正则表达式并打印行 作用: 对标准输入的行进行分析,过滤指定的行. 模式: 格式 ...

  4. 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容

    写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...

  5. NC23046 华华教月月做数学

    NC23046 华华教月月做数学 题目 题目描述 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽快和月月继续聊天,就提出帮她做一部分作业. 月月 ...

  6. c语言编译器介绍

    目录 一.IDE(集成开发环境) 1.windows 编译器 2.Mac中使用 二.环境安装 1.windows安装gcc A.进入安装所在目录,找到MinGW. B.找到我的电脑,右键选择属性. C ...

  7. 5-8 Resource 静态资源服务器

    静态资源服务器 什么是静态资源服务器 我们无论做什么项目,都会有一些页面中需要显示的静态资源,例如图片,视频文档等 我们一般会创建一个单独的项目,这个项目中保存静态资源 其他项目可以通过我们保存资源的 ...

  8. React中useEffect的简单使用

    学习hooks 在 React 的世界中, 组件有函数组件和类组件 UI 组件我们可以使用函数,用函数组件来展示 UI. 而对于容器组件,函数组件就显得无能为力. 我们依赖于类组件来获取数据,处理数据 ...

  9. 部署yum仓库

    YUM介绍 YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器. 基于RPM包管理,能够从指定的 ...

  10. OptaPlanner 发展方向与问题

    ​ 最近一段时间,因为忙于[易排(EasyPlan)规划平台]的设计与开发工作,平台的一些功能设计,需要对OptaPlanner的各种特性作更深入的研究与应用.慢慢发现,OptaPlanner进入8. ...