MySQL自己一些容易失误的操作
1.被查询字段可能包含特殊值,如null、特殊字符
eg:需要查出某字段值为2的列数据,易写出select * from table where value = 2,但要查出不为2的数据,select * from table where value != 2就容易被背刺一刀了,此时该字段的值若为null的数据是查不出来的,原因是MySQL不能使用=、!=、>、<等运算符计算null数据
解决: 在可能出现null数据的字段使用is null或is not null判断
应该用下面这种写法:
select * from table where value != 2 and value is null
或者
select * from table where ifnull(value,0)!=2
2.被查询字段使用了模糊查询,该数据包含模糊查询的特殊值,需要使用\进行转义
特殊值: %
解决: 加 \ 进行转义
SELECT * FROM stu where class like '%';
SELECT * FROM stu where class like '\%';
3. 某些框架对前端传入的搜索条件进行了处理,使得搜索条件被改变。导致全查查得到的数据,输入搜索条件之后查不到了
查询条件是'(有限公司)',传到后端被转为了'\(有限公司\)'
解决: 在后端执行查询操作之前使用 HtmlUtils.htmlUnescape(searchParams) 转义一下,这种问题在用不同的数据进行测试的时候容易遇到
4. 更新表中字段,值为1的变为2,值不为1的变为3,可以简写如下
update table set if(type=1,2,3)
应用场景:根据值变更状态
5. 判断该字段值是否为奇数,查出该行
select * from stu
where mod(class,2)=1;
应用场景:查出为奇数的行,或者为某个固定倍数的行
6.被查询字段需要行锁,加上for update来查询,如下:
@Select
("SELECT * from bill_table WHERE bill_no=#{billNo} for update")
Bill lockByBillNo(@Param("billNo") String billNo);
- 加了for update后,在这个查询语句执行完之前,其他的会话不能更改或删除这些被where指定到的行,直到该语句的事务被commit或rollback,前提是where查询的字段加有索引
- 无索引的话则整张表被锁起来直到这个查询语句执行完。
7.被查询字段按指定状态排序
SELECT * from table
order by case table.status
when '成功' then 0 when '失败' then 1
when '异常' then 2 else 3 end asc
最后更新:2022.9.15