导入大SQL文件
[mysqld]
# 大批量导入优化
bulk_insert_buffer_size=1G
max_allowed_packet=1G
innodb_autoextend_increment=512M
innodb_buffer_pool_size=4G
innodb_log_buffer_size=4G
innodb_log_file_size=4G
动态行列转换
DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_score(id INT(11) NOT NULL auto_increment,userid VARCHAR(20) NOT NULL COMMENT '用户id',subject VARCHAR(20) COMMENT '科目',score DOUBLE COMMENT '成绩',PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET = utf8;
INSERT INTO tb_score(userid,subject,score) VALUES ('001','语文',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','数学',92);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','英语',80);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','语文',88);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','数学',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','英语',75.5);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','语文',70);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','数学',85);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','英语',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','政治',82);
select * from test.tb_score;selectuserid,sum(if(subject='语文', score, 0)) as '语文',sum(if(subject='数学', score, 0)) as '数学',sum(if(subject='英语', score, 0)) as '英语'
from test.tb_score
group by userid;SET @EE='';
select @EE :=CONCAT(@EE,'sum(if(subject= \'',subject,'\',score,0)) as ',subject, ',') AS aa FROM (SELECT DISTINCT subject FROM tb_score) A ;SET @QQ = CONCAT('select ifnull(userid,\'TOTAL\')as userid,',@EE,' sum(score) as TOTAL from tb_score group by userid WITH ROLLUP');
-- SELECT @QQ;PREPARE stmt FROM @QQ;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
递归
开发中经常会遇到树形结构,例如菜单、分类等,我们通常需要在代码中使用递归的方式组织树形数据。
现在有一张课程分类表,需要查询给定分类的所有子分类。
课程表如下:
create table course_category
(id varchar(20) not null comment '主键'primary key,name varchar(32) not null comment '分类名称',label varchar(32) null comment '分类标签默认和名称一样',parentid varchar(20) default '0' not null comment '父结点id(第一级的父节点是0,自关联字段id)',is_show tinyint null comment '是否显示',orderby int null comment '排序字段'
)comment '课程分类' charset = utf8;
- 现在系统中最多只有三级分类,可以直接进行两次表关联实现。
select a.name, b.name, c.name
from course_category ajoin course_category b on a.id = b.parentidjoin course_category c on b.id = c.parentid
where a.id = '1';
- 使用Mysql递归语法。
上面的方法显然不够通用,随着分类层级的变化SQL也需要更改,在Mysql 8.0中提供了递归语法,轻松实现树形结构的查询。
with recursive t1 as (-- 递归的上下文变量select 1 as nunion all-- 递归的查询,每次递归都会基于该sql的结果继续,直到where条件不满足停止递归。select n + 1 from t1 where n < 5
)
select * from t1;
执行上面的sql将会得到:
n |
---|
1 |
2 |
3 |
4 |
5 |
想要查询id='1’的分类(根节点)下所有的子分类的SQL如下:
with recursive t1 as (select * from course_category where id = '1'union allselect a.* from course_category a join t1 on t1.id = a.parentid
)
select * from t1;