本文主要讲一下笔者在工作中遇到的一些逻辑比较复杂的sql语句,下面是具体写法:

SELECT
IF (
LOCATE('familyKey', link, 1) = 0,
NULL,
SUBSTRING(
link,
LOCATE('familyKey', link, 1) + LENGTH('familyKey') + 1, IF (
LOCATE(
'&',
link,
LOCATE('familyKey', link, 1)
) = 0,
LENGTH(link),
LOCATE(
'&',
link,
LOCATE('familyKey', link, 1)
) - (
LOCATE('familyKey', link, 1) + LENGTH('familyKey') + 1
)
)
)
) familyKey
FROM
illustrations;

  这条语句是将illustrations表中的link字段,如:

  ...&episType=239&familyKey=90897&illustrationId=6837275...

  这样的字条串中familyKey=后面的90897这样的编号取出来,说白了就是将字符串按关键字截取,得到的数据可组成新表进行下一步数据分析工作。

我们也可以将其分拆一下,写成下面的语句:

SELECT IF(strbegin=0,NULL,SUBSTRING(link,strbegin+strlen+1,IF(strend=0,LENGTH(link),strend-(strbegin+strlen+1)))) familyKey,mainId
FROM (
SELECT mainId,link,strbegin,LOCATE('&',link,strbegin) strend, LENGTH('familyKey') strlen
FROM (
SELECT mainId,link,LOCATE('familyKey',link,1) strbegin
FROM illustrations
) tmp) tmp;

  这样看起来就有条理多了,两条语句中都涉及了IF条件判断这些所谓的动态查询的知识点,写完还是小有成就感。

下面介绍一下mysql5.7中的一大亮点改进——对Json数据类型的支持

CREATE TABLE maingroup_id_parentId AS
SELECT n1.id AS parentId,n2.id AS id
FROM nav n1,nav n2
WHERE n1.meta->'$.model' = n2.parent_meta->'$.model'
AND n1.meta->'$.spec' = n2.parent_meta->'$.spec'
AND n1.meta->'$.lang' = n2.parent_meta->'$.lang'
AND n1.meta->'$.startup' = n2.parent_meta->'$.startup'
AND n1.meta->'$.localMarketOnly' = n2.parent_meta->'$.localMarketOnly'
AND n2.nav_table = 'nav-mainGroup-table'
AND n1.nav_table <> 'nav-mainGroup-table';

  这条语句是将nav表中建立在以model,spec,lang,startup,localMarketOnly这几个关键字为联系的基础上的上下层级关系找出来,建成子表maingroup_id_parentId,然后做进一步数据整理。语句中用到了meta这个Json类型的字段,其使用方式简便、表义清晰,十分适合对类似带数据参数的请求地址的存储。在处理大数据量的表间关系时,上面的用法可能就不实用了,因为效率太差,一条语句可能很久都跑不出来,盲目地等待是没有任何意义的,我是不会做这种事情,所以我们必须找到更高效的关联方案。这里可将这些关键字对应的信息从Json字段中提出来单独作为一个字段,并建立索引,然后将它们进行匹配:

-- pnc字段关键字提取
ALTER TABLE pnc ADD pnc_number VARCHAR(20) generated always AS (json_extract(meta,'$.pnc')) virtual;
ALTER TABLE pnc ADD drawingVar VARCHAR(8) generated always AS (json_extract(meta,'$.drawingVar')) virtual;
ALTER TABLE pnc ADD drawing VARCHAR(8) generated always AS (meta->"$.drawing") virtual;
ALTER TABLE pnc ADD subGroup VARCHAR(8) generated always AS (json_extract(meta,'$.subGroup')) virtual;
ALTER TABLE pnc ADD mainGroup VARCHAR(8) generated always AS (json_extract(meta,'$.mainGroup')) virtual;
ALTER TABLE pnc ADD spec VARCHAR(150) generated always AS (json_extract(meta,'$.spec')) virtual;
ALTER TABLE pnc ADD model VARCHAR(50) generated always AS (json_extract(meta,'$.model')) virtual;
-- pnc建索引
ALTER TABLE pnc ADD INDEX link(pnc_number,drawingVar,drawing,subGroup,mainGroup,spec,model); -- 修改bom表
ALTER TABLE bom ADD pnc_number VARCHAR(20) generated always AS (json_extract(parent_meta,'$.pnc')) virtual;
ALTER TABLE bom ADD drawingVar VARCHAR(8) generated always AS (json_extract(parent_meta,'$.drawingVar')) virtual;
ALTER TABLE bom ADD drawing VARCHAR(8) generated always AS (parent_meta->"$.drawing") virtual;
ALTER TABLE bom ADD subGroup VARCHAR(8) generated always AS (json_extract(parent_meta,'$.subGroup')) virtual;
ALTER TABLE bom ADD mainGroup VARCHAR(8) generated always AS (json_extract(parent_meta,'$.mainGroup')) virtual;
ALTER TABLE bom ADD spec VARCHAR(150) generated always AS (json_extract(parent_meta,'$.spec')) virtual;
ALTER TABLE bom ADD model VARCHAR(50) generated always AS (json_extract(parent_meta,'$.model')) virtual;
-- bom建索引
ALTER TABLE bom ADD INDEX link(pnc_number,drawingVar,drawing,subGroup,mainGroup,spec,model); -- 造表间关系
DROP TABLE IF EXISTS pnc_bom_id;
CREATE TABLE pnc_bom_id
SELECT bom.id AS bomId,pnc.id AS pncId
FROM nissan_bom bom,nissan_pnc pnc
WHERE bom.pnc_number=pnc.pnc_number
AND bom.drawingVar=pnc.drawingVar
AND bom.drawing=pnc.drawing
AND bom.mainGroup=pnc.mainGroup
AND bom.subGroup=pnc.subGroup
AND bom.spec=pnc.spec
AND bom.model=pnc.model;

复杂sql语句集锦的更多相关文章

  1. Mysql 常用 SQL 语句集锦

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  2. Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  3. SqlServer教程:经典SQL语句集锦

    SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRAN ...

  4. 经典SQL语句集锦

      下列语句部分是MsSql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELET ...

  5. SQL语句集锦

    -语 句                                功 能 --数据操作 SELECT      --从数据库表中检索数据行和列 INSERT      --向数据库表添加新数据行 ...

  6. mysql sql语句集锦

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

  7. 经典SQL语句集锦(收藏版)

    文章来源:http://www.cnblogs.com/herbert/archive/2010/07/02/1770062.html SQL分类: DDL—数据定义语言(CREATE,ALTER,D ...

  8. MYSQL数据库SQL语句集锦

    *特别说明:FILED代表数据表字段,CONDITIONS代表where之后的条件,TABLENAME代表数据表名   []中括号内的内容代表 可有可无. 创建数据库 create  database ...

  9. Mysql 常用SQL语句集锦

    基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day from table_name" ...

随机推荐

  1. git 分布式版本控制

    一.git版本控制 管理文件夹 安装省略 1. 进入要管理的文件夹 2. 初始化 (提名) 3. 管理 4. 生成版本 对应的命令: # 进入文件夹以后 右击选git bash here #初始化 g ...

  2. C++ STL 之 内建函数对象

    STL 内建了一些函数对象.分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数.这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能.使用内建函数对象 ...

  3. 使用2种python脚本工具将2个txt文档中的文字进行比较,并计算出Corr, WER正确率,准确率

    一.准备: linux服务器,src2mlf.py   rec2mlf.py   HResults文件,1份源文件和1份需要对比的文件.文件放置于本人云盘 二.使用方法: 1. 对比工具 HResul ...

  4. LCD1602 液晶

    它是一种专门用来显示字母.数字.符号的点阵型液晶模块 它是由若干个5x7或者5x10的点阵字符位组成 引脚 时序 操作步骤 初始化 写命令(RS=L)设置显示坐标 写数据(RS=H) 指令 清屏: 指 ...

  5. Spring源码解析 - springMVC核心代码

    一.首先来讲解下springMVC的底层工作流程 1.首先我们重点放在前端控制器(DispatcherServlet) 其类图: 因为从流程图看,用户的请求最先到达就是DispatcherServle ...

  6. vue父组件传值和子组件触发父组件方法

    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> <scr ...

  7. Redis汇总

    开源项目 https://www.cnblogs.com/yswenli/p/9460527.html

  8. 将windows当做linux/Mac来用 scoop强大的包管理工具

    在Linux中有apt-get.yum这些包安装管理 安装相当方便:如ubuntu安装一个mysql5.7,只需要一个简单的命令: apt-get 而在windows中需要在MySQL官网下载对应版本 ...

  9. 如何正确清理C盘?

    Windows电脑操作系统一般是安装在磁盘驱动器的C盘中,一旦运行,便会产生许多垃圾文件,C盘空间在一定程度上都会越来越小.伴随着电脑工作的时间越久,C盘常常会提示显示其内存已不足.那么C盘容量不足对 ...

  10. java——Servlet

    类要实现Servlet接口: 主要功能,生成动态网页内容: HttpServlet重写doGet和doPost方法或者重写Service方法,完成对请求的响应: 如:get.post等请求的响应. - ...