count用法
count用法在 MySQL 中,COUNT 是一个聚合函数,用于统计行数或计算特定列中非 NULL 值的数量。它是数据分析中非常常用的函数,可以帮助你快速了解数据集中的记录数量。 基本语法123sql复制代码COUNT(expression) expression :可以是一个列名、 1* 或其他表达式。 使用 * 时,COUNT 会统计所有行数,包括 NULL 值。 使用列名时,COUNT 只会统计该列中非 NULL 的值。 使用其他表达式时,COUNT 会统计表达式结果非 NULL 的行数。 示例假设我们有一个表 employees,结构如下: id name department 1 Alice HR 2 Bob IT 3 Charlie NULL 4 David HR 5 Eve IT 统计总行数 使用 * 来统计表中所有行的数量: 123sql复制代码SELECT COUNT(*) FROM employees; 结果:5 统计特定列的非 NULL 值数量 统计 department 列中非 NULL...
round用法
round用法在 MySQL 中,ROUND 是一个用于对数值进行四舍五入的函数。它允许你指定精度,从而对数值进行取整或保留一定的小数位数。 语法123sql复制代码ROUND(number, decimals) number:要进行四舍五入的数字。 decimals:保留的小数位数。如果省略此参数,则默认对整数部分进行四舍五入(即保留 0 位小数)。 示例 对整数进行四舍五入 123sql复制代码SELECT ROUND(123.456); 结果:123 保留 2 位小数 123sql复制代码SELECT ROUND(123.456, 2); 结果:123.46 保留 0 位小数(等价于对整数四舍五入) 123sql复制代码SELECT ROUND(123.456, 0); 结果:123 负数的小数位数参数如果 decimals 是负数,则 ROUND 会对整数部分的位数进行四舍五入。例如: 123sql复制代码SELECT ROUND(12345.678, -2); 结果:12300 注意事项 如果 decimals 超出范围,MySQL...
多表查询的连接
多表查询的连接 inner join:2表值都存在 outer join:附表中值可能存在null的情况。 总结: ①A inner join B:取交集 ②A left join B:取A全部,B没有对应的值,则为null ③A right join B:取B全部,A没有对应的值,则为null ④A full outer join B:取并集,彼此没有对应的值为null 上述4种的对应条件,在on后填写。
HAVING 用法
HAVING 用法在 MySQL 中,HAVING 子句用于对聚合函数的结果进行过滤。它通常与 GROUP BY 子句一起使用,以过滤分组后的数据。与 WHERE 子句不同,WHERE 用于在分组之前过滤记录,而 HAVING 用于在分组之后过滤分组结果。 基本语法12345SELECT column1, column2, aggregate_function(column3)FROM table_nameWHERE conditionGROUP BY column1, column2HAVING aggregate_condition; aggregate_condition:这是一个条件,用于过滤聚合函数的结果(如 SUM、COUNT、AVG 等)。 示例假设我们有一个表...
连接远程服务器上的Redis
连接远程服务器上的Redis1,下载, 可以利用宝塔面板下载 2,配置 3,设置安全组,在阿里云服务器上 4,连接
使用Redis的Stream结构作为消息队列,实现的异步秒杀下单
使用Redis的Stream结构作为消息队列,实现的异步秒杀下单需求: 创建一个Stream类型的消息队列,名为stream.orders 修改之前的秒杀下单Lua脚本,在认定有抢购资格后,直接向stream.orders中添加消息,内容包含voucherId、userId、orderId 项目启动时,开启一个线程任务,尝试获取stream.orders中的消息,完成下单\ 修改了lua表达式 新增以下内容 12-- 订单idlocal...
Redis中的各种消息队列
Redis中的各种消息队列基于list结构模拟消息队列 基于PubSub的消息队列 基于Stream的消息队列Stream 是 Redis 5.0 引入的一种新数据类型,可以实现一个功能非常完善的消息队列。 发送消息的命令: 例如: 读取消息的方式之一:XREAD 例如,使用XREAD读取第一个消息: XREAD阻塞方式,读取最新的消息: 在业务开发中,我们可以循环的调用XREAD阻塞方式来查询最新消息,从而实现持续监听队列的效果,伪代码如下 注意:当我们指定起始ID为$时,代表读取最新的消息,如果我们处理一条消息的过程中,又有超过1条以上的消息到达队列,则下次获取时也只能获取到最新的一条,会出现漏读消息的问题 STREAM类型消息队列的XREAD命令特点: 消息可回溯 一个消息可以被多个消费者读取 可以阻塞读取 有消息漏读的风险 基于Stream的消息队列-消费者组消费者组(Consumer...
基于阻塞队列实现的异步秒杀
基于阻塞队列实现的异步秒杀大体思路 lua脚本 初始化 123456private static final DefaultRedisScript<Long> SECKILL_SCRIPT;static { SECKILL_SCRIPT=new DefaultRedisScript<>(); SECKILL_SCRIPT.setLocation(new ClassPathResource("seckill.lua")); SECKILL_SCRIPT.setResultType(Long.class);} 代码实现 12345678910111213141516171819local voucherId=ARGV[1]local userId=ARGV[2]local stockKey='seckill:stock:' .. voucherIdlocal orderKey='seckill:order:' .....
关于在mp静态代码块中使用条件构造器造成的错误
关于在mp静态代码块中使用条件构造器造成的错误错误代码 12345boolean flag = seckillVoucherService.update(new LambdaUpdateWrapper<SeckillVoucher>() .eq(SeckillVoucher::getVoucherId, voucherId) .gt(SeckillVoucher::getStock, 0) .setSql("stock = stock - 1")); 错误信息 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression ‘ew.sqlSegment != null and ew.sqlSegment != ‘’ and ew.nonEmptyOfWhere’. Cause:...
Redission锁的MutiLock原理
Redission锁的MutiLock原理为了提高redis的可用性,我们会搭建集群或者主从,现在以主从为例 此时我们去写命令,写在主机上, 主机会将数据同步给从机,但是假设在主机还没有来得及把数据写入到从机去的时候,此时主机宕机,哨兵会发现主机宕机,并且选举一个slave变成master,而此时新的master中实际上并没有锁信息,此时锁信息就已经丢掉了。 为了解决这个问题,redission提出来了MutiLock锁,使用这把锁咱们就不使用主从了,每个节点的地位都是一样的, 这把锁加锁的逻辑需要写入到每一个主丛节点上,只有所有的服务器都写入成功,此时才是加锁成功,假设现在某个节点挂了,那么他去获得锁的时候,只要有一个节点拿不到,都不能算是加锁成功,就保证了加锁的可靠性。 那么MutiLock 加锁原理是什么呢? 当我们去设置了多个锁时,redission会将多个锁添加到一个集合中,然后用while循环去不停去尝试拿锁,但是会有一个总共的加锁时间,这个时间是用需要加锁的个数 * 1500ms...






