含有<<SQL必知必会(第5版)>> <
select school, teacher_age from xin_teacher_t
select distinct school, teacher_age from xin_teacher_t
select distinct school, teacher_age, id from xin_teacher_t
默认是升序
select teacher_age from xin_teacher_t order by teacher_age
select teacher_age, id from xin_teacher_t order by teacher_age ,id desc
第一条件相同时再按第二个条件排序,第一个条件没指明升序或者降序,第二个指明了,这种情况第一个条件还是默认升序
utf8_bin:是以二进制值比较,也就是区分大小写
utf_8_general_ci:一般比较,不区分大小写
虚拟列不支持insert和update
`a_name_obj` text comment '';
`a_name` varchar(200) character set uft8 collate utf8_bin generated always as (json_unquote(json_extract(`a_name_obj, '$.pid'`))) virtual comment '';
插入a_name列数据{“pid”:“111”},列a_name会自动插入值111
name = upper(#{name}):索引不会失效
upper(name) = #{name}:索引会失效
重复率低的字段在前,因为更有区分度,索引更好的起到作用,当使用到部分索引时,前面的使用度更高
mysql中字段值是null,java属性值映射为null;
mysql中字段值是“”,java属性值映射为“”;
且StringUtils.equals(null, “”) = false,但实际业务中我们应该认为它没有改变
# mysql函数:按name字段排列,排序时'xiaohua’在前
order by field (name, 'xiaohua', 'xiaowang')
# mysql函数:按name字段排列,排序时'xiaowang’在前
order by field (name, 'xiaohua', 'xiaowang') desc
右表不为空时尽量用join(inner join,同join)
因为多条数据会返回1条,所以有多条数据有脏数据的场景就被规避了
第一范式(1NF):每列都是原子性的,不可再拆分
第二范式(2NF):每行都唯一的,且非主属性与主属性关联
第三范式(3NF):非主属性与主属性都是直接关联,而非间接关联
间接关联:小明 -> 租房 -> 价格,小明与租房价格就是间接关联
主属性:一般都是指主键,有的表没有主键,唯一代表每行的列就是主属性
要求:尽量满足第一、第二范式,第三范式可以不满足,增加一些冗余字段,与主属性无直接关系也是可以的
只要有一个where条件用到了索引,那么就只是锁满足这个条件的那些行,而不会锁整个表,所以update时要在where条件中包含索引列,不包含时可以先查出满足条件的id,再update,这样就用到了覆盖索引,避免回表,且不会锁表了。
主要是为了全库备份,防止各表数据不统一
开始事务:start transaction;
提交事务:commit
回滚事务:rollback
退出事务:quit
开启两个事务:打开两个界面,执行start transaction
表字段状态、阶段等都应该用单个字符(推荐varchar类型的数字)来表示,在注释维护好含义,因为这样匹配时更轻量级
对字段单独设置字符集:collate utf8_bin
alter table table1 convert to character set utf8 collate utf8_general_ci
连接字段核对字符集不同;
左表较大
a表3行4列,b表2行5列;
select * from a, b;
笛卡尔积查询结果:3*2=6行
4+5=9列
mysql join的实现是通过nested loop join算法,通过驱动表作为基础数据,循环这些基础数据一条一条的作为条件到另一个表查询数据,然后合并结果,如果还有第三个参与join,将前两个表join的结果集作为查询条件去这张表查询,所以基础驱动表越小越好;
join时,mysql在没有其他过滤条件的情况下,一般选择小表作为驱动表,而left join一般选择左表作为驱动表,所以尽量不要用left join,而用inner join;
总结:
show engine innodb status 查询存储引擎日志
当列字段not null改为default null不会有问题,当default null改为not null时,若没有null值不会有问题,
若有null,会报错;但新建一列为非空时,值默认设为0;设为非空时,插入一条记录时,非空列一定要设值,否则会报错