广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQL写法--行行比较
  • 506
分享到

SQL写法--行行比较

2024-04-02 19:04:59 506人浏览 八月长安
摘要

目录环境准备需求背景循环查询混查过滤行行比较总结环境准备   数据库版本:Mysql 5.7.20-log   建表 sql DROP TABLE IF EXISTS `t_w

环境准备

  数据库版本:Mysql 5.7.20-log

  建表 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='商品销售统计';

  初始化数据

    准备了769063条数据

需求背景

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

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

  具体点,类似如下

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

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

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

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

循环查询

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

  具体的 SQL 类似如下

  SQL 能走索引

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

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

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

OR 拼接

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

  具体的 SQL 类似如下

  SQL 也能走索引

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

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

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

混查过滤

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

  具体的 SQL 类似如下

  SQL 也能走索引

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

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

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

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

行行比较

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

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

  具体的 SQL 类似如下

  SQL 同样能走索引

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

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

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

总结

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

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

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

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

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

参考

  《SQL进阶教程

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

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

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

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

--结束END--

本文标题: SQL写法--行行比较

本文链接: https://www.lsjlt.com/news/132985.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL写法--行行比较
    目录环境准备需求背景循环查询混查过滤行行比较总结环境准备   数据库版本:MySQL 5.7.20-log   建表 SQL DROP TABLE IF EXISTS `t_w...
    99+
    2022-11-12
  • 如何进行DB2 和SQL Server自增列比较
    如何进行DB2 和SQL Server自增列比较,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。最近由于对SQL Server的自增列理解不够好...
    99+
    2022-10-19
  • sql 行转列 case when (简洁版) —— group by 行与行比较【mysql】【全网最全】
    目录 group by 搭配 max(case when..then..end) as field 一、需求 二、准备工作 1.建表  2.数据 3.查询结果 三、sql写法 1.0版本 2.0版本 3.0版本 之前写了一版使用 g...
    99+
    2023-09-26
    行转列 sql group 比较 case when
  • 如何进行ABAP OPEN SQL中OPEN CURSOR和SELECT的比较
    本篇文章为大家展示了如何进行ABAP OPEN SQL中OPEN CURSOR和SELECT的比较,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 我写了一...
    99+
    2022-10-19
  • python中有哪些进行比较的方法
    python中有哪些进行比较的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、说明比较操作符in和not in检查一个值是否在一个序列中出现。操作符is和is not比较...
    99+
    2023-06-15
  • java进行数据的比较的实例方法
    1、说明 比较基本类型==,比较对象值推荐equals或compareTo。 首先,Java中的数据存储在JVM中,而基本类型的数据存储在JVM的局部变量表中,也可以理解为所谓的“栈...
    99+
    2022-11-12
  • 如何进行equals()方法和==异同的比较
    如何进行equals()方法和==异同的比较,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。equals()方法是Object类的方法,所有的类都集成了此方法,还...
    99+
    2023-06-02
  • MySQL如何进行区分大小写的字符串比较?
    As we know that MySQL is not case-sensitive while comparing characters but it can be changed i.e. MySQL can perform case...
    99+
    2023-10-22
  • php字符串如何进行大小写不敏感比较
    这篇文章主要讲解了“php字符串如何进行大小写不敏感比较”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php字符串如何进行大小写不敏感比较”吧!方法:1、用“strcasecmp(strin...
    99+
    2023-06-20
  • 怎么进行unix和windows比较
    怎么进行unix和windows比较,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。unix:最成功的字符界面,生命力非常顽强,资源站用少,设计简洁,依然是各种pc操作系统,嵌入...
    99+
    2023-06-17
  • java如何用equals进行比较
    在Java中,可以使用equals()方法来比较两个对象是否相等。equals()方法是Object类的一个方法,可以在所有的Jav...
    99+
    2023-08-22
    java equals
  • python执行系统命令4种方法与比较
    Python中执行系统命令常见的方法有以下4种 注意:以下实例代码在Python3.5下运行通过。 一、os.system方法 os.system(cmd) 在子终端运行系统命令...
    99+
    2022-11-12
  • 比较流行的ASP IDE有哪些?
    ASP是一种基于服务器端脚本语言的网页开发技术,它可以让开发者快速地创建动态网页。而ASP IDE则是一种能够帮助开发者更加高效地开发ASP网站的集成开发环境。本文将介绍一些比较流行的ASP IDE,以及它们的优缺点。 Visual St...
    99+
    2023-08-26
    关键字 对象 ide
  • 如何进行JSON和XML的比较
    这篇文章给大家介绍如何进行JSON和XML的比较,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JSON VS XML 的基本方法是前台载入后台声明JavaScript对象的字符串,用e...
    99+
    2022-10-19
  • MySQL:查询时进行时间比较
    MySQL:查询时进行时间比较 前言一、查询距离当前时间多久以前二、查询特定时间范围 前言 在 MySQL 中查数据的时候,往往需要对记录的创建时间进行筛选,比如只需要查询今年1-5月份的,或者查询距离当前时间多久以前的。 本...
    99+
    2023-08-19
    mysql 数据库 时间筛选
  • 关于sql String类型的日期数据如何进行比较查询
    我们运用date_format把String数据库中的String 类型的日期格式化成datetime. 上代码: SELECT SQL_CALC_FOUND_ROWS     *  FROM     table_name  ...
    99+
    2019-02-03
    关于sql String类型的日期数据如何进行比较查询
  • BigDecimal值在java中进行比较的方法有哪些
    这篇文章主要介绍了BigDecimal值在java中进行比较的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、使用equals()方法不但要求两个BigDecim...
    99+
    2023-06-15
  • mysql时间是varchar类型进行比较
    一般情况下数据库时间类型都是以datetime、timestamp等格式进行存储的 , 但有时也会出现varchar类型 , 这个时候在sql中比较时间类型就需要用到函数STR_TO_DATE(str, format);...
    99+
    2023-04-21
    mysql时间varchar类型比较 mysql varchar比较
  • 如何在PHP中进行类型比较
    PHP是一种流行的服务器端脚本语言,常用于开发动态网站和Web应用程序。一种常见的任务是比较不同类型的值。在PHP中,可以使用一系列比较运算符来比较int,float,string和其他类型的值。本文将介绍如何在PHP中进行类型比较。1.比...
    99+
    2023-05-14
    php 比较运算符
  • 如何进行Keras vs PyTorch框架比较
    如何进行Keras vs PyTorch框架比较,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在 Keras 与 PyTorch 的对比中,作者还给出了相同神经...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作