过年红包统计

说明

如题,我昨天晚上睡不着想到这个事的。就是看自己那一大家子每年发红包,但是想看看谁发了多少,抢了多少,又损失了多少。我本来想直接用现成的,但是没找到,如果有的话请告诉我。
然后就做了这个小小的项目,由于数据的输入比较复杂,所以我就暂时输入了两个红包的数据。以后会慢慢补齐,就从2020年往后的吧。
还有,我感觉“麻雀虽小五脏俱全”,虽然数据少,但我甚至用上了powerdesigner工具,还有类似它的国内开源工具PDManer,也算是熟悉怎么设计了。数据库上,什么日期,金额,还有主键,外键,explain,用select 结果update等等,我也都加上了,真的是自己动手把所有的知识和技能都复习了一遍。本来还想用触发器,但是一想到找工作的时候没人问过触发器,所以怀疑是不是工作中不让用,然后就没用触发器。后面会提到

数据库

三张表

家庭成员,红包信息还有领取信息。就特别想上学书上那个学生,教师,选课表,成绩的例子。感慨,经典就是经典

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for family_member
-- ----------------------------
DROP TABLE IF EXISTS `family_member`;
CREATE TABLE `family_member`  (
  `MEMBER_ID` int(32) NOT NULL AUTO_INCREMENT COMMENT '家庭成员编号',
  `MEMBER_RELATIONSHIP` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '家庭成员关系',
  PRIMARY KEY (`MEMBER_ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '家庭成员' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of family_member
-- ----------------------------
INSERT INTO `family_member` VALUES (1, '父亲');
INSERT INTO `family_member` VALUES (2, '母亲');
INSERT INTO `family_member` VALUES (3, '姐姐');
INSERT INTO `family_member` VALUES (4, '自己');
INSERT INTO `family_member` VALUES (5, '弟弟');

SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for hongbao_info
-- ----------------------------
DROP TABLE IF EXISTS `hongbao_info`;
CREATE TABLE `hongbao_info`  (
  `HONGBAO_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '红包编号',
  `MEMBER_ID` int(11) NOT NULL COMMENT '红包发出人',
  `SENT_TIME` datetime(0) NOT NULL COMMENT '红包发出时间',
  `HONGBAO_AMOUNT` decimal(24, 2) NOT NULL DEFAULT 0.00 COMMENT '红包金额',
  `LOST_AMOUNT` decimal(24, 2) NOT NULL DEFAULT 0.00 COMMENT '红包损失',
  PRIMARY KEY (`HONGBAO_ID`) USING BTREE,
  INDEX `foreignKeys_1`(`MEMBER_ID`) USING BTREE,
  CONSTRAINT `foreignKeys_1` FOREIGN KEY (`MEMBER_ID`) REFERENCES `family_member` (`MEMBER_ID`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '红包信息' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of hongbao_info
-- ----------------------------
INSERT INTO `hongbao_info` VALUES (1, 1, '2023-02-05 16:29:50', 200.00, 196.00);
INSERT INTO `hongbao_info` VALUES (2, 2, '2023-02-05 16:36:03', 200.00, 143.75);

SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for receive_info
-- ----------------------------
DROP TABLE IF EXISTS `receive_info`;
CREATE TABLE `receive_info`  (
  `RECEIVE_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '领取编号',
  `HONGBAO_ID` int(11) NOT NULL COMMENT '红包编号',
  `MEMBER_ID` int(11) NOT NULL COMMENT '红包领取人',
  `RECEIVED_AMOUNT` decimal(24, 2) NOT NULL DEFAULT 0.00 COMMENT '红包领取金额',
  PRIMARY KEY (`RECEIVE_ID`) USING BTREE,
  INDEX `hongbao_receive_fk`(`HONGBAO_ID`) USING BTREE,
  INDEX `hongbao_member_fk`(`MEMBER_ID`) USING BTREE,
  CONSTRAINT `hongbao_receive_fk` FOREIGN KEY (`HONGBAO_ID`) REFERENCES `hongbao_info` (`HONGBAO_ID`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `hongbao_member_fk` FOREIGN KEY (`MEMBER_ID`) REFERENCES `family_member` (`MEMBER_ID`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '领取信息' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of receive_info
-- ----------------------------
INSERT INTO `receive_info` VALUES (1, 1, 1, 4.00);
INSERT INTO `receive_info` VALUES (2, 1, 2, 67.84);
INSERT INTO `receive_info` VALUES (3, 1, 3, 16.60);
INSERT INTO `receive_info` VALUES (4, 1, 4, 16.97);
INSERT INTO `receive_info` VALUES (5, 1, 5, 94.59);
INSERT INTO `receive_info` VALUES (6, 2, 4, 11.51);
INSERT INTO `receive_info` VALUES (7, 2, 3, 32.69);
INSERT INTO `receive_info` VALUES (8, 2, 1, 38.07);
INSERT INTO `receive_info` VALUES (9, 2, 2, 56.25);
INSERT INTO `receive_info` VALUES (10, 2, 4, 61.48);

SET FOREIGN_KEY_CHECKS = 1;

红包怎么翻译

英语红包怎么说我也是查了一下,有直接翻译的,有用lucky money的。但是我觉得,就是发红包的习俗好像只有咱有,就像饺子那种东西可以翻译成Jiaozi,那我也用拼音了。

其他SQL命令

毫无保留地复制过来

INSERT INTO `test`.`receive_info`(`HONGBAO_ID`, `MEMBER_ID`, `RECEIVED_AMOUNT`) 
VALUES (2, 1, 38.07),(2, 2, 56.25),(2, 4, 61.48)

explain SELECT receive_info.HONGBAO_ID, SUM(RECEIVED_AMOUNT) as '总和'
from hongbao_info, receive_info
where hongbao_info.HONGBAO_ID = receive_info.HONGBAO_ID
GROUP BY hongbao_info.MEMBER_ID

SELECT receive_info.*
from hongbao_info, receive_info
where hongbao_info.HONGBAO_ID = receive_info.HONGBAO_ID
GROUP BY hongbao_info.MEMBER_ID

UPDATE `test`.`hongbao_info` SET `LOST_AMOUNT` = 200 WHERE `HONGBAO_ID` = 2

-- 为了计算红包发出的人损失了多少的SQL,本来想用触发器,但是一想到找工作的时候没人问过触发器,所以怀疑是不是工作中不让用,然后就没用触发器
UPDATE hongbao_info
INNER JOIN (SELECT receive_info.*
from hongbao_info, receive_info
WHERE hongbao_info.HONGBAO_ID = receive_info.HONGBAO_ID 
) c ON hongbao_info.HONGBAO_ID = c.HONGBAO_ID and hongbao_info.MEMBER_ID = c.MEMBER_ID
SET hongbao_info.LOST_AMOUNT = hongbao_info.HONGBAO_AMOUNT -c.RECEIVED_AMOUNT

SELECT receive_info.*
from hongbao_info, receive_info
WHERE hongbao_info.HONGBAO_ID = receive_info.HONGBAO_ID 

select * from hongbao_info
INNER JOIN (SELECT receive_info.*
from hongbao_info, receive_info
WHERE hongbao_info.HONGBAO_ID = receive_info.HONGBAO_ID 
) c ON hongbao_info.HONGBAO_ID = c.HONGBAO_ID and hongbao_info.MEMBER_ID = c.MEMBER_ID

explain

挺重要的,之前自己一直逃避,现在该补救了。

先上例子

UPDATE hongbao_info
INNER JOIN (SELECT receive_info.*
from hongbao_info, receive_info
WHERE hongbao_info.HONGBAO_ID = receive_info.HONGBAO_ID 
) c ON hongbao_info.HONGBAO_ID = c.HONGBAO_ID and hongbao_info.MEMBER_ID = c.MEMBER_ID
SET hongbao_info.LOST_AMOUNT = hongbao_info.HONGBAO_AMOUNT -c.RECEIVED_AMOUNT

在这里插入图片描述

详细解释

expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

id

SELECT识别符。这是SELECT的查询序列号

  1. id相同时,执行顺序由上至下
  2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
  3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
select_type

示查询中每个select子句的类型
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
。。。。。。

table

显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,也可能是第几步执行的结果的简称

type

对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
index: Full Index Scan,index与ALL区别为index类型只遍历索引树
range:只检索给定范围的行,使用一个索引来选择行
ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null,我这里就是)
该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

Key

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中
如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好

ref

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows

估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

Extra

该列包含MySQL解决查询的详细信息,有以下几种情况:
Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
No tables used:Query语句中使用from dual 或不含任何from子句

最后

EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
EXPLAIN不考虑各种Cache
EXPLAIN不能显示MySQL在执行查询时所作的优化工作
部分统计信息是估算的,并非精确值
EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值