MySQL常用查询模型

根据以往的MySQL使用经验总结了一些常用模型。

一、 “最”值问题

  1. 全局最值:使用聚合函数如max、min
  2. 组中最值:在1的基础上搭配group by
  3. 组间最值:
    • 法一:在2的基础上搭配having,使用some/any/all实现组的比较
    • 法二: 在2的基础上使用子查询

where 的筛选粒度为每一条记录,过滤行;having的筛选粒度为每一组,过滤组

二、排序问题

  1. 全局排序:
    • 法一:order by a, b
    • 法二:使用开窗函数,rank() over(partition by … order by …)
    • 法三:自联结生成笛卡尔积,通过where实现字段值筛选,借助group by、count获得排名列
  2. 组内排序(不聚合):group by搭配开窗函数,同上
  3. 前n问题:
    • 法一:在开窗函数基础上比较rank
    • 法二:在 笛卡尔积基础上比较having count(col) <=n

三、连续问题

  1. 连续n次问题:n表错位联结,行满足 id,id+1,id+2…同时满足该行对应的n个表的值相等(where)
  2. 连续n次>值:在1基础上选取
  3. 连续n次>值>关系:在1基础上使用where

四、重复问题

  1. 去除全局重复值:select distinct x
  2. 去除组内重复值:count distinct y

五、比较问题

  1. 组比较:having搭配搭配聚合函数
  2. 行比较:联结后使用where
  3. 行与组的比较:
    • 法一:聚合后与表联结,然后使用where,可用
    • 法二:聚合后放入where子查询中
    • 法三:直接使用开窗函数,然后进行同行比较,开窗函数需要建立新列

六、分组问题

  1. 查询多种聚合值:直接通过普通聚合函数实现
  2. 需要查询多种聚合值,同时每种聚合值还需要组内筛选:在查询的聚合函数中添加条件(嵌套子查询或case when
  3. 查询一种聚合值:直接使用聚合函数或在此基础上用having过滤组
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。