数据库|MySql笔记个人小记

MySQL虽然勉强算是初窥门径,但是里面知识点太多了,在这里记录下吧,毕竟好记性不如烂笔头。
1.union 与 union all 的区别union all 求并集,而且不去重,union的话是求并集,去重
2.select 查询中,查询条件 in 与not in放到一起不一定是全集。比如,select * from student where id_card in ('123',null)union all select * from student where id_card notin ('123',null). 这个时候查询的时候并不是student的全部数据。not in 中一旦有null存在,查询到的数量就会是0,也就是查询不到数据,所以查询的时候not in中的子查询一定要加上 XXX is not null。
3.case when 条件处理,在mysql 横纵表转换或者一些数据进行修改的时候,前置条件中的when条件一定要加到where后面的条件中,否则,整个查询语句会查询所有数据,然后进行分组归类,或者修改,这样就是对全部数据进行处理,很容易出错,比如:

SELECT max(case schedule_date when #{week.monday} then schedule_time else null end ) as schedule_time_one, max(case schedule_date when #{week.tuesday} then schedule_time else null end ) as schedule_time_two, max(case schedule_date when #{week.wednesday} then schedule_time else null end ) as schedule_time_three, max(case schedule_date when #{week.thursday} then schedule_time else null end ) as schedule_time_four, max(case schedule_date when #{week.friday} then schedule_time else null end ) as schedule_time_five, max(case schedule_date when #{week.saturday} then schedule_time else null end ) as schedule_time_six, max(case schedule_date when #{week.sunday} then schedule_time else null end ) as schedule_time_seven, max(user_name) user_name, #{week.monday} as monday FROM zn_schedule_detail

这种查询肯定要加上where处理,限定时间段的,不然查询的时候,直接扫描全部数据,会有很多除了user_name都为空的数据出现。如果你写的是update操作,又没在where中加上条件限制,那惨了,直接改全表,数据估计都乱套了。
4.数据初始换处理,一些数据表的初始化或者新增,需要查询其他表获取数据,然后进行插入。这个时候如果先用mapper查询出全部数据,然后进行处理之后再insert,这样数据如果超过万条的话,速度就会变得很慢,数据了更大的话,说不定还会卡顿。
这种初始化的操作,最好是直接在数据库搞定,不要将数据弄进计算机内存,然后在写入数据库,这样不管是对性能还是空间都不是很友好。插入数据可以直接使用insert into(...)select某某某,这样直接就能进行数据的初始话。
当然其中如果有数据处理,比如判断为空,数据限制,转换之类的,可以直接使用if函数处理或者是case when,也可以使用@i,存储临时变量,concat进行字符合并,
substring进行字符串截取,还有日期转换等等,都可以使用SQL语句实现的
5.数据库卡死,一个数据库可能有多个人在用,有些是代码问题,导致数据库锁死,还有的是同伴在debug中导致数据库表被锁。这个时候就要解锁了,看下几个主要的语句。
-- 查询进程列表 show processlist; -- 查询innerdb 的锁 select * from information_schema.innodb_locks; -- 查询事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; -- 干掉进程 kill6508635;

当然,这个主要是在测试中可以用的,生产上应该控制有超时时间,或者是看redo 和undo 日志了。
6.mysql mapper中,if判断test="name != null and name != ''" 是判断name不为空,如果判断name等于张三呢?
test="name == '张三'.toString() "

必须要加上toString处理。
7. 重复数据删除处理(根据条件筛选),数据连表查询,然后删除id小的或者id大的,最终保留唯一一条,最终实现数据的过滤删除,SQL示例:
DELETE a.* from schedule as a,(SELECT max(id) as id,schedule_date,depart_id,user_code from schedulewhere schedule_date1 ) as b where a.schedule_date = b.schedule_date and a.depart_id = b.depart_id and a.user_code = b.user_code and a.id

8.int 10位和11位的区别:这个数字是位数的区别,int是占了4Byte,也就是32 bit,最大的数据也就是2^32 -1 ,也就是4 294 967 295,也就是10位数字,也就是说int 10 和11 只是展示的限制不同,其实存储的大小是一样的。
【数据库|MySql笔记个人小记】9. 等待补充中。。。

    推荐阅读