MySQL,记录我的一些失误操作,预防以后再遇到(持续更新)

发布于:2022-12-17 ⋅ 阅读:(198) ⋅ 点赞:(0)

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. 某些框架对前端传入的搜索条件进行了处理,使得搜索条件被改变。导致全查查得到的数据,输入搜索条件之后查不到了

查询条件是'(有限公司)',传到后端被转为了'\&#40;有限公司\&#41;'

解决: 在后端执行查询操作之前使用 HtmlUtils.htmlUnescape(searchParams) 转义一下,这种问题在用不同的数据进行测试的时候容易遇到

4. 更新表中字段,值为1的变为2,值不为1的变为3,可以简写如下

update table set if(type=1,2,3)

应用场景:根据值变更状态

5. 判断该字段值是否为奇数,查出该行

1

select * from stu 
where mod(class,2)=1;

2

应用场景:查出为奇数的行,或者为某个固定倍数的行

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


网站公告

今日签到

点亮在社区的每一天
去签到