问题

插入存在即更新

INSERT INTO `students` (`name`, `age`) VALUES ('ruesin', '20') ON DUPLICATE KEY UPDATE `has` = '1';

批量插入

INSERT INTO `students` (`name`, `age`)
VALUES
('xiaoming', '21'),
('ermao', '22');

INSERT INTO `students`
VALUES
('huniu', '21'),
('goudan', '22');

INSERT INTO `students` (`name`, `age`) VALUES ('xiaohu','22'),('xiaoming','21') ON DUPLICATE KEY UPDATE `age` = `age`;

批量更新

replace into students (`name`, `age`) values ('xiaohu','22'),('xiaoming','21');

insert into test_tbl (`name`, `age`) values ('xiaohu','22'),('xiaoming','21') on duplicate key update `age`=values(`age`);

int、varchar长度

int类型数据的字节大小是固定的4个字节;

但是int(5)和int(11)区别在于,显示的数据位数一个是5位一个是11位,在开启zerofill(填充零)情况下,若int(5)存储的数字长度是小于5的则会在不足位数的前面补充0,但是如果int(5)中存储的数字长度大于5位的话,则按照实际存储的显示(数据大小在int类型的4个字节范围内即可),也就是说int(M)的M不代表数据的长度;

varchar(20)中的20表示的是varchar数据的数据长度最大是20,超过则数据库不会存储;

总结: int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据; varchar(M) M表示的是varchar类型数据在数据库中存储的最大长度,超过则不存;

统计大于N的次数

where的条件是字段;而having 的条件可以是字段,也可以是聚集函数;

重要的是,where是筛选源数据,having多与group by 一起使用,并且条件常常是聚集函数;当有group by 时,having在group by 条件的后面,而where 在group by的前面。

聚集函数:sum,count,avg ...等等;

-- 查询每个年级总分数大于200的用哪些;
select  grade ,sum(score) from tables group by grade having sum(score) >200; 

-- 及格两门以上的学生
select count(`name`) as cnt from tables where score > 60 group by `grade` having cnt > 2;

无限极分类

实现无限级的基本方案是构建树,Tree的核心思想是递归。

最简单的方案为三个字段:

  • ID:主键
  • NAME:名称
  • PID:父ID

扩展后方便查询:

  • ID:主键
  • NAME:名称
  • PID:父ID
  • PIDS:父ID列表,如:1,3,7
  • Depth:深度,如父ID为0的顶层分类深度为1

预排序遍历树算法:

  • ID:主键
  • NAME:名称
  • PID:父ID
  • LFT:左下标,此节点所有子节点的ID都大于LFT。
  • RGT:右下标,此节点所有子节点的ID都小于LFT。
powered by Gitbook更新时间: 2021-05-27 10:52:40

results matching ""

    No results matching ""