复杂sql语句集锦
本文主要讲一下笔者在工作中遇到的一些逻辑比较复杂的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语句集锦的更多相关文章
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- SqlServer教程:经典SQL语句集锦
SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRAN ...
- 经典SQL语句集锦
下列语句部分是MsSql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELET ...
- SQL语句集锦
-语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 ...
- mysql sql语句集锦
1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...
- 经典SQL语句集锦(收藏版)
文章来源:http://www.cnblogs.com/herbert/archive/2010/07/02/1770062.html SQL分类: DDL—数据定义语言(CREATE,ALTER,D ...
- MYSQL数据库SQL语句集锦
*特别说明:FILED代表数据表字段,CONDITIONS代表where之后的条件,TABLENAME代表数据表名 []中括号内的内容代表 可有可无. 创建数据库 create database ...
- Mysql 常用SQL语句集锦
基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day from table_name" ...
随机推荐
- CSS设置元素的隐藏和显示
常见的三种方式 display display: none 隐藏对象 display: block 除了转换为块级元素以外,同时还有显示元素的意思 特点:隐藏之后不保留位置 visibility 值h ...
- Emeditor代码编辑器常见的正则表达式总结
Emeditor 目前来说是我个人感觉非常不错的一款记事本软件, 其中查找替换功能由于支持正则表达式而显得非常强大. <tr[^>]*> 匹配:<tr xxxxxxxxxxxx ...
- nginx 设置静态下载界面
首先,官方设置链接:https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/ 下面贴一个配置文件: cha ...
- linux-2.6.38 input子系统(用输入子系统实现按键操作)
一.设备驱动程序 在上一篇随笔中已经分析,linux输入子系统分为设备驱动层.核心层和事件层.要利用linux内核中自带的输入子系统实现一个某个设备的操作,我们一般只需要完成驱动层的程序即可,核心层和 ...
- golang shell 交叉编译
#!/usr/bin/env bash set -e uname_s=`uname -s | awk '{print tolower($0)}'` uname_m=`uname -m` timeTag ...
- 面试题——SSM面试题
树木丛生红火火 树木丛生红火火 微信公众号:Java全栈开发大联盟 原文地址:https://note.youdao.com/ynoteshare1/index.html?id=3f81baea7 ...
- POI读取Excel数据
POI读取Excel表格数据 * {所需相关jar下载: * commons-collections4-4.4.jar * commons-compress-1.19.jar * poi-4.1.1. ...
- bug-- java.lang.RuntimeException: Type “Klass*"
使用jinfo查看jvm进程id为27523的信息 [java@xftest0 ~]$ jinfo 27523 Attaching to process ID 27523, please wa ...
- Ajax fileUpload
在项目开发中用到ajax 的 fileUpload,遇到onchange事件只触发一次 原因是fileUpload调用后将原有的file元素改变了,需要早upload后重新绑定元素 第一次绑定: $( ...
- flex布局详解
1.背景介绍 传统的布局解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C ...