当前位置: 首页 > news >正文

MySQL 究极奥义·动态乾坤大挪移·无敌行列转换术

导入大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;
  1. 现在系统中最多只有三级分类,可以直接进行两次表关联实现。
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';
  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;
http://www.xdnf.cn/news/1038061.html

相关文章:

  • SSH参数优化与内网穿透技术融合:打造高效远程访问解决方案
  • Android 获取签名 keystore 的 SHA1和MD5值
  • transactional-update原子性更新常用命令
  • 数据库期末
  • LangChain开发智能问答(RAG)系统实战教程:从零构建知识驱动型AI助手
  • 推荐一个轻量级跨平台打包工具 PakePlus:重塑前端项目桌面化体验
  • 微软云注册被阻止怎么解决?
  • uniapp 腾讯地图服务
  • 【DSP笔记 · 第3章】数字世界的“棱镜”:离散傅里叶变换(DFT)完全解析
  • 自定义 eslint 规则
  • 基于Java开发的浏览器自动化Playwright-MCP服务器
  • 图表工具 ECharts vs Chart.js 对比
  • 问题记录_如何让程序以root权限启动_如何无视系统的路径问题
  • 从零开始:VMware上的Linux与Java开发环境配置
  • Python训练营-Day31-文件的拆分和使用
  • 自编码模型原理
  • SpringBoot源码解析(十二):@ConfigurationProperties配置绑定的底层转换
  • 【卫星通信】高通提案S2-2504588解读-基于控制平面优化的GEO卫星IMS语音解决方案
  • 介绍常见的图像和视频存储格式以及其优劣势
  • vulnhub-Earth
  • 深度解析JavaScript闭包:从原理到高级应用
  • Java 单例模式实现方式
  • 偶数项收敛半径
  • 地理数据库 gdb mdb sde 名称的由来
  • uni-app项目实战笔记10--设置页面全局渐变线性渐变背景色
  • 深入解析ArrayList源码:从短链项目实战到底层原理
  • windterm no match for method encryption client
  • 盟接之桥EDI软件安全机制及工作原理详解
  • uni-app项目实战笔记11--定义scss颜色变量方便页面引用
  • 论文略读: CITYANCHOR: CITY-SCALE 3D VISUAL GROUNDING WITH MULTI-MODALITY LLMS