目录
--mysql查询不等于某值时容易错误的sql
场景描述:
现有如下表格'table_a',id为3的name为null,不是字符串'null'。
id | name |
1 | 张三 |
2 | 李四 |
3 | null |
当我们查询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 | 订单号 | 操作 | 错误信息 |
7 | DD123456 | 状态转变为已签收 | |
6 | DD123456 | 状态转变为已出库 | |
5 | DD123456 | 状态转变为已出库失败 | {“message”:"null ..."} |
4 | DD234567 | 状态转变为已签收失败 | {“message”:"null ..."} |
3 | DD234567 | 状态转变为已出库 | |
2 | DD234567 | 状态转变为已财务已审核 | |
1 | DD234567 | 状态转变为已审核 |
现要求找出订单中异常未被处理的订单,也就是找出所有订单中最后一条错误信息不为空的数据。我首先想到的就是用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。所以,创建索引需要权衡利弊,根据实际情况来决定。