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 not  in ('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;

-- 干掉进程
kill  6508635;

 当然,这个主要是在测试中可以用的,生产上应该控制有超时时间,或者是看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 schedule  where 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 只是展示的限制不同,其实存储的大小是一样的。

9. 等待补充中。。。

你可能感兴趣的:(数据库,mysql,数据库,随笔,小知识)