关于Mysql子查询的三个应用场景

 更新时间:2023年07月03日 11:32:24   作者:榴莲小冰棍  
这篇文章主要介绍了关于Mysql子查询的三个应用场景,子查询是在一个完整的查询语句中,嵌套不同功能的小查询,从而完成复杂查询的一种编写形式,需要的朋友可以参考下

应用场景

一个select语句的查询结果能够作为另一个语句的输入值,主要有三种情况,分别为:

1.子查询可以出现在Where子句中,作为过滤条件

select 列名
from 表名
where 列 操作符 (select 列名 from 表名)

2.也可以出现在from子句中,作为一个临时表使用

select 列名
from (select 列名 from 表名)

3.能够出现在select list中,作为一个字段值来返回

select 列名,(select 列名 from 表名)
from 表名
where 列 操作符​​​​​

注意事项:

  • 子查询只能有一个字段的情况
    1. 子查询在select上面,一定是只能一个字段;如果超过一个字段,代码会报错
    2. 子查询在where后面,当做一个过滤条件,这个字段也必须有且只有一个
  • 可以有多个字段的情况
    1. 当子查询在from后面,是可以有多个字段的,因为他就是一张表;
    2. 注意:子查询在from后面做临时表来用,必须给子查询生成的临时表取别名,否则会报错
  • 时间型字符,在 where 过滤如果是常量,需要用''; 数字则不需要
  • 子查询中,表是可以不一样的

​​​​​​​子查询在Where中作过滤条件

2017年7月2号统计累计购买金额在100到200的会员,寻找这批会员的消费记录

  1. 先找出当日累计购买金额在100-200之间的会员 用having来筛选
  2. 用查找出来的会员做过滤条件,查找消费记录
-- 先找出当日累计购买金额在100-200之间的会员
SELECT dimMemberID 
      ,SUM(AMT) as money
FROM dw.fct_sales
where dimDateID ='20170702'
and dimMemberID <> 0
group by dimMemberID
-- having sum(AMT)>100 and sum(AMT)<200;
having money BETWEEN 100 and 200;
-- 用查找出来的会员做过滤条件,查找消费记录
SELECT *
FROM dw.fct_sales
where dimDateID = '20170702'
and dimMemberID <>0
and dimMemberID in (
                    SELECT dimMemberID 
                       -- ,SUM(AMT) as money    子查询在where后面,当做一个过滤条件,这个字段也必须有且只有一个,所以最后结果要返回过滤条件
                    FROM dw.fct_sales
                    where dimDateID ='20170702'
                    and dimMemberID <> 0
                    group by dimMemberID
                    having sum(AMT)>100 and sum(AMT)<200);
                    -- having money BETWEEN 100 and 200 );  不能直接用命名的列名money,要写全函数,因为前面语句没有出现money,所以为了避免报错,之后尽量写全函数

子查询在from中做临时表

2017年7月2日对每位会员累计购买金额进行分段

  1. 统计2017年7月2日每位会员的累计购买金额
  2. 把第一步统计出来的数据作为临时表,对统计出来的数据进行分组
-- 1、统计2017年7月2日每位会员的累计购买金额
SELECT dimMemberID 
      ,SUM(AMT) as money 
FROM dw.fct_sales
where dimDateID = '20170702'
and dimMemberID <> 0
group by dimMemberID ;
-- 2、把第一步统计出来的数据作为临时表,对统计出来的数据进行分段
SELECT dimMemberID 
      ,money 
      ,case when money <100 then 'D'
            when money >=100 and money <500 then 'C'
            when money >=500 and money <1000 then 'B'
            when money >=1000 then 'A'
            else '其它'
       end as type1
FROM (SELECT dimMemberID                      /*临时表可以生成多个字段,并不是每个字段都需要用也行*/
            ,SUM(AMT) as money 
      FROM dw.fct_sales
      where dimDateID = '20170702'
      and dimMemberID <> 0
      group by dimMemberID) as sn;            /*子查询在from后面做临时表来用,必须给这个子查询生成的临时表取一个表的别名,否则会报错*/

子查询在select作为一个字段来返回

2017年7月2日计算每个会员购买金额,以及每个会员购买金额占总体金额的比

  • 2017年7月2日每个会员购买金额
  • 总体金额
  • 合并两个表  

注意:在合并时where的条件要写全,不要遗漏,不然容易出现逻辑错误

-- 1、2017年7月2日每个会员购买金额
SELECT dimMemberID 
      ,SUM(AMT) as money
FROM dw.fct_sales
where dimDateID = '20170702'
and dimMemberID <>0                   /*去除非会员,即 dimMemberID 为 0 的数据*/
group by dimMemberID ;
-- 2、总体金额
SELECT SUM(AMT) 
FROM dw.fct_sales
where dimDateID = '20170702';
-- 3、合并两个表   注意在合并时where的条件要写全,不要遗漏,不然容易出现逻辑错误
SELECT dimMemberID 
      ,SUM(AMT) as money
      ,(SELECT SUM(AMT)                                /*统计总金额*/
        FROM dw.fct_sales
        where dimDateID = '20170702'
        and dimMemberID<>0) as total_money
      ,CONCAT(                                         /*加上%号*/
       ROUND(                                          /*四舍五入保留4位小数,带%一定要思考保留小数位数*/
       SUM(AMT)/(SELECT SUM(AMT) 
                 FROM dw.fct_sales
                 where dimDateID = '20170702'
                 and dimMemberID<>0),4)*100,'%') 
       as member_rate                                  /*合并表,统计占比*/
FROM dw.fct_sales
where dimDateID = '20170702'
and dimMemberID <>0                                    /*去除非会员,即 dimMemberID 为 0 的数据*/
group by dimMemberID ;

到此这篇关于关于Mysql子查询的三个应用场景的文章就介绍到这了,更多相关Mysql子查询应用场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL优化方案参考

    MySQL优化方案参考

    今天小编就为大家分享一篇关于MySQL优化方案参考,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • mysql 5.7.18 zip版安装配置方法图文教程(win7)

    mysql 5.7.18 zip版安装配置方法图文教程(win7)

    这篇文章主要为大家详细介绍了win7下mysql 5.7.8 zip版安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • MySQL如何优雅的删除大表实例详解

    MySQL如何优雅的删除大表实例详解

    这篇文章主要给大家介绍了关于MySQL如何优雅的删除大表的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • mysql启动时报错:error while loading shared libraries: libncurses.so.5: cannot open shared object file的解决办法

    mysql启动时报错:error while loading shared li

    这篇文章主要给大家介绍了解决mysql启动时报错:error while loading shared libraries: libncurses.so.5: cannot open shared object file的方法,需要的朋友可以参考下
    2023-08-08
  • mysql limit 分页的用法及注意要点

    mysql limit 分页的用法及注意要点

    limit在mysql语句中使用的频率非常高,一般分页查询都会使用到limit语句,本文章向码农们介绍mysql limit 分页的用法与注意事项,需要的朋友可以参考下
    2016-12-12
  • Mysql CPU占用高的问题解决方法小结

    Mysql CPU占用高的问题解决方法小结

    最近发现php网站发布信息比较慢,而且同网站目录下的asp经常登录后立即就重新登录,立即考虑到服务器资源占用问题,所以进服务器看到原来mysql占用率较高 25-60%左右,偶尔能跑到100%,所有导致上述问题的发生
    2012-06-06
  • sql中with as用法以及with-as性能调优/with用法举例

    sql中with as用法以及with-as性能调优/with用法举例

    SQL中的WITH AS语法是一种强大的工具,可以简化复杂查询的编写,提高查询的可读性和维护性,这篇文章主要给大家介绍了关于sql中with as用法以及with-as性能调优/with用法的相关资料,需要的朋友可以参考下
    2024-01-01
  • MySQL 搭建双主复制服务并通过 HAProxy 负载均衡的过程详解

    MySQL 搭建双主复制服务并通过 HAProxy 负载均衡的过程详解

    在数据库管理中,数据的备份和同步是至关重要的环节,而双主复制(Dual Master Replication)作为一种高可用性和数据同步的解决方案,本文将介绍MySQL双主复制的配置过程并通过 HAProxy 负载均衡,感兴趣的朋友一起看看吧
    2024-03-03
  • MySQL启用SSD存储的实例详解

    MySQL启用SSD存储的实例详解

    这篇文章主要介绍了MySQL启用SSD存储的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • mysql将数据库中所有表结构和数据导入到另一个库的方法(亲测有效)

    mysql将数据库中所有表结构和数据导入到另一个库的方法(亲测有效)

    这篇文章主要给大家介绍了关于mysql将数据库中所有表结构和数据导入到另一个库的方法,文中通过代码介绍的非常详细,亲测有效,对同样遇到这个需求的朋友具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01

最新评论