mysql笔记

目录

--mysql查询不等于某值时容易错误的sql

--mysql分组后获取id最小的数据

--mysql索引


--mysql查询不等于某值时容易错误的sql

场景描述:

        现有如下表格'table_a',id为3的name为null,不是字符串'null'。

idname
   1 张三
2李四
3null

        当我们查询name不等于‘张三时’

select * from table_a where name != '张三';

        按照我的理解来说,应该查询出id=2,3的结果,但是mysql中只查出id=2的数据。

解决方法:

        只需要记住,不等于某个值查询不出结果为null的数据。因为在SQL中,null是一种特有的数据类型,其等价于没有任何值,是未知数。null与0、空字符串、空格都不同。只有is null和is not null能查询到。

        所以上面的sql应该改为:

select * from table_a where name != '张三' and name is null;

--mysql分组后获取id最小的数据

场景描述:

        现有表log_a,如果订单有操作失败,则错误信息字段不为空。

id订单号操作错误信息
7DD123456状态转变为已签收
6DD123456状态转变为已出库
5DD123456状态转变为已出库失败{“message”:"null ..."}
4DD234567状态转变为已签收失败{“message”:"null ..."}
3DD234567状态转变为已出库
2DD234567状态转变为已财务已审核
1DD234567状态转变为已审核

        现要求找出订单中异常未被处理的订单,也就是找出所有订单中最后一条错误信息不为空的数据。我首先想到的就是用group by,其实group by是用来解决数据分组求和,但细心的同学肯定发现,如果分组后没有求和等操作,mysql还是会给出一条数据,该数据为分组后数据中的一条(暂不清楚是哪一条)。

-- 下面sql会显示两条数据,一条为订单号为DD123456的其中一条,
-- 另一条为订单号为DD234567的其中一条
select * from log_a group by 订单号;

        那么我们如何获取分组后最后一条数据的错误信息不为空的一条呢?下面给出sql:

select
    * 
from log_a 
where id in (
-- 该子查询为获取每个订单中最新的一条
    select
        max(id)
    from log_a group by 订单号
) and 错误信息 is not null;

        上述为mysql5.7的方法,mysql8.0后有窗口函数可以使用,有感兴趣的请查阅。

--mysql索引

查询:索引可以大大提高数据的查询速度,这是使用索引最主要的原因。通过创建索引,MySQL可以直接定位到满足查询条件的数据行,而无需逐行扫描整个表。

插入:当向表中插入新数据时,MySQL需要将这些新数据添加到索引中。如果表中有多个索引,那么每个索引都需要更新。这可能会使插入操作变慢。

更新:当更新表中的数据时,MySQL可能需要更新索引。这是因为索引存储了指向每行数据的指针,如果数据的位置发生了变化(例如,因为数据的大小发生了变化),那么索引就需要更新。

删除:当从表中删除数据时,MySQL需要从索引中删除相应的条目。

因此,虽然索引可以提高查询速度,但也需要占用额外的存储空间,且在插入、更新和删除操作时,索引需要维护,可能会影响性能12。所以,创建索引需要权衡利弊,根据实际情况来决定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值