SQL写法--行行比较


Posted in SQL Server onAugust 23, 2021

环境准备

  数据库版本:MySQL 5.7.20-log

SQL写法--行行比较

  建表 SQL

DROP TABLE IF EXISTS `t_ware_sale_statistics`;
CREATE TABLE `t_ware_sale_statistics` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `business_id` bigint(20) NOT NULL COMMENT '业务机构编码',
  `ware_inside_code` bigint(20) NOT NULL COMMENT '商品自编码',
  `weight_sale_cnt_day` double(16,4) DEFAULT NULL COMMENT '平均日销量',
  `last_thirty_days_sales` double(16,4) DEFAULT NULL COMMENT '最近30天销量',
  `last_sixty_days_sales` double(16,4) DEFAULT NULL COMMENT '最近60天销量',
  `last_ninety_days_sales` double(16,4) DEFAULT NULL COMMENT '最近90天销量',
  `same_period_sale_qty_thirty` double(16,4) DEFAULT NULL COMMENT '去年同期30天销量',
  `same_period_sale_qty_sixty` double(16,4) DEFAULT NULL COMMENT '去年同期60天销量',
  `same_period_sale_qty_ninety` double(16,4) DEFAULT NULL COMMENT '去年同期90天销量',
  `create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_user` bigint(20) DEFAULT NULL COMMENT '最终修改人',
  `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最终修改时间',
  `is_delete` tinyint(2) DEFAULT '2' COMMENT '是否删除,1:是,2:否',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_business_ware` (`business_id`,`ware_inside_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='商品销售统计';

SQL写法--行行比较

  初始化数据

    准备了769063条数据

SQL写法--行行比较

需求背景

  业务机构下销售商品,同个业务机构可以销售不同的商品,同个商品可以在不同的业务机构销售,也就说:业务机构与商品是多对多的关系

  假设现在有 n 个机构,每个机构下有几个商品,如何查询出这几个门店下各自商品的销售情况?

  具体点,类似如下

SQL写法--行行比较

  如何查出100001下商品1000、1001、1003100002下商品1003、1004100003下商品1006、1008、1009的销售情况

  相当于是双层列表(业务机构列表中套商品列表)的查询;业务机构列表和商品列表都不是固定的,而是动态的

  那么问题就是:如何查询多个业务机构下,某些商品的销售情况

  (问题经我一描述,可能更模糊了,大家明白意思了就好!)

循环查询

  这个很容易想到,在代码层面循环业务机构列表,每个业务机构查一次数据库,伪代码如下:

SQL写法--行行比较

  具体的 SQL 类似如下

SQL写法--行行比较

  SQL 能走索引

SQL写法--行行比较

 

  实现简单,也好理解,SQL 也能走索引,一切看起来似乎很完美

  然而现实是:部门开发规范约束,不能循环查数据库

  哦豁,这种方式只能放弃,另寻其他方式了

OR 拼接

  通过MyBatis的动态 SQL功能,进行 SQL 拼接,类似如下

SQL写法--行行比较

  具体的 SQL 类似如下

SQL写法--行行比较

  SQL 也能走索引

SQL写法--行行比较

  实现简单,也好理解,SQL 也能走索引,而且只查询一次数据库,貌似可行

  唯一可惜的是:有点费 OR,如果业务机构比较多,那 SQL 会比较长

  作为候选人之一吧,我们接着往下看

混查过滤

  同样是利用Mybatis的动态 SQL,将business_id列表拼在一起、ware_inside_code拼在一起,类似如下

SQL写法--行行比较

  具体的 SQL 类似如下

SQL写法--行行比较

  SQL 也能走索引

SQL写法--行行比较

  实现简单,也好理解,SQL 也能走索引,而且只查询一次数据库,似乎可行

  但是:查出来的结果集大于等于我们想要的结果集,你品,你细品!

  所以还需要对查出来的结果集进行一次过滤,过滤出我们想要的结果集

  姑且也作为候选人之一吧,我们继续往下看

行行比较

  SQL-92 中加入了行与行比较的功能,这样一来,比较谓词 = 、< 、> 和 IN 谓词的参数就不再只是标量值了,还可以是值列表了

  当然,还是得用到Mybatis的动态 SQL,类似如下

SQL写法--行行比较

  具体的 SQL 类似如下

SQL写法--行行比较

  SQL 同样能走索引

SQL写法--行行比较

  实现简单,SQL 也能走索引,而且只查询一次数据库,感觉可行

  只是:有点不好理解,因为我们平时这么用的少,所以这种写法看起来很陌生

  另外,行行比较是 SQL 规范,不是某个关系型数据库的规范,也就说关系型数据库都应该支持这种写法

总结

  1、最后选择了 行行比较 这种方式来实现了需求

    别问我为什么,问就是逼格高!

  2、某一个需求的实现往往有很多种方式,我们需要结合业务以及各种约束综合考虑,选择最合适的那个

  3、行行比较是 SQL-92 中引入的,SQL-92 是 1992 年制定的规范

    行行比较不是新特性,而是很早就存在的基础功能!

参考

  《SQL进阶教程》

  神奇的 SQL 之 MySQL 执行计划 → EXPLAIN,让我们了解 SQL 的执行过程!

  神奇的 SQL 之性能优化 → 让 SQL 飞起来

  神奇的 SQL 之擦肩而过 → 真的用到索引了吗

到此这篇关于SQL写法--行行比较的文章就介绍到这了,更多相关SQL 行行比较内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SQL Server连接查询的实用教程
Apr 07 SQL Server
解决sql server 数据库,sa用户被锁定的问题
Jun 11 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL Server中搜索特定的对象
May 25 SQL Server
SQL Server使用PIVOT与unPIVOT实现行列转换
May 25 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
May 25 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
一次SQL查询优化原理分析(900W+数据从17s到300ms)
Jun 10 SQL Server
SQL Server数据库备份和恢复数据库的全过程
Jun 14 SQL Server
SQL语句中JOIN的用法场景分析
sql通过日期判断年龄函数的示例代码
Jul 16 #SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
SqlServer数据库远程连接案例教程
数据库之SQL技巧整理案例
Jul 07 #SQL Server
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
Jul 07 #SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
You might like
超级简单的发送邮件程序
2006/10/09 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
2016/04/08 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
python实现神经网络感知器算法
2017/12/20 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
《最大的“书”》教学反思
2014/02/14 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
如何写早恋检讨书
2014/09/10 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
慰问信格式规范
2015/03/23 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python
python 闭包函数详细介绍
2022/04/19 Python