• SQL中的5种聚集函数


      作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神、大牛到底是怎样炼成的啊,我这小菜鸟感觉这TMD要学的东西这多啊,然后就给自己定了许多许多要学习的东西,可是有人又不停地给你灌输:东西不在多而要精通!我也觉得很有道理,可是怎样才能精通呢?封神之路,在哪里啊 !!!

      这一天没有一个安静的心,基本是学不进去了,发现自己还是太功利了,急功近利!也许你只要学就行,管他是否能够立即让人见识到你的厉害,技术和知识这种东西也许还是要强调一个 底蕴的。既然自己最烦那种看了两篇文章就给你扯淡的人,拿自己也许就该一样一样去积累吧,管它是否现在眼前能用到?闲着也没事,上网就是那么点事情,看看新闻、看看dota视频、玩两局dota,没事了那就学吧,也许就不该给自己定太多的时间计划表,这东西!呵呵、、、、真不是人能坚持的,还是本着反正也没事我就是看看,能学多少是多少,反正暂时也不用。这样一想自己好多了,来学篇博客,叨叨两句完了继续上路。

      这段时间一直在学习sql相关的知识,原来在大学只是有一点sqlserver的基础,上班了,这些东西真的不够用啊! 公司现在用的是postgreSQL,这个数据库不知道国内有多少公司在用,所以我还是先以mysql学习吧,再说了sql这种语言是统一标准的,各家的东西只是有细微不同而已。忽然中间看看自己做的学习笔记已经22页了,其实还好,在这里就不发所有的笔记了,挑点坐看弄明白的东西,一小块一小块的总结,发出来,这样看着就不会很累,太长的博客真的会吓的很多的人,除非那些工作中需要这块的知识;这样的总结对自己也是一件好事,以后看的时候光看题目就行,不用再一篇很长很长的文章中找,闲话不多说了!进入正题:sql中的五种聚集函数

      下面的笔记是我在看了 燕十八php第二部-⑤ MySQL从入门到精通视频教程 (46集全) 之后,自己又看了一些书,总结的sql聚集函数注意的地方,

      一、先给大家分享写 sql 的顺序:

        表->where(去除符合条件的行数据,此时烈没有变化)->符合条件的中间结果表-> 分组统计运算或者投影运算:max、min、count、avg、group by->上步得到的新的结果集,这时就有可能产生新的列->having(筛选结果)->order by(得到排序结果表)->limit(限制条目)->最终结果表

                         所以说where->group by->having->order by/limit  ,这个就是写sql语句时的顺序

      二、常用的5个聚集函数:

                         Max               求最大

                         Min                求最小

                         Sum               求总和

                         Avg                求平均

                         Count            计算总行数

      

          1、sum 和 avg的输入必须是数值集,但是其他的运算符可以作用在非数值数据类型的集合上,如字符串

          2、null  max、min、sum、avg都是忽略null的,而count(*)统计的行数包括null,count(column)忽略null的行

                     3、all/distinct   all是默认的也就是不写的情况下,distinct是统计值不相同的行;对于count(distinct *)是错误的,对count使用distinct必须指明列;对于max和min使用distinct也是没有意义的,虽然技术上可以实现sql语法没有错误,但是一个列的最大值和最小值无论是否包含不同值都是相同的、不影响的

                  4、牢记把列看成变量,那么聚合函数也可以这样使用在一些列计算中

          

    mysql> select cat_id,sum(shop_price*goods_number)
                        -> from ecs_goods
                        -> group by cat_id;
    +--------+------------------------------+
    | cat_id | sum(shop_price*goods_number) |
    +--------+------------------------------+
    |      2 |                         0.00 |
    |      3 |                    356235.00 |
    |      4 |                      6891.00 |
    |      5 |                     29600.00 |
    |      8 |                      4618.00 |
    |     11 |                       790.00 |
    |     13 |                       134.00 |
    |     14 |                       162.00 |
    |     15 |                       190.00 |
    +--------+------------------------------+
    9 rows in set (0.00 sec)

          

          5、特别记忆count 的两种使用方式;

                         count(*) 对表中行的数目进行统计,不管列中是否包含null值 还是非空值

                         count(column)  对特定列中具有值的行进行计数,忽略null的值。

                         应特别注意:

                                count(column>值)这样的帅选并没有意义,count不会在这里根据你的条件统计,这样的填入,就相当于给入一个数值一样count(0)或者count(1)效果是一样的,当然count(数字) 这样的写法和count(*)也是同样的效果。所以这里我们只记住count()中填入列名时,是统计忽略null的行数,并且此时可以使用distinct

          实例

    mysql> select goods_id,goods_name,max(shop_price) from ecs_goods;
    +----------+------------+-----------------+
    | goods_id | goods_name | max(shop_price) |
    +----------+------------+-----------------+
    |        1 | KD876      |         5999.00 |
    +----------+------------+-----------------+
    1 row in set (0.11 sec)
    
    mysql> select min(shop_price) from ecs_goods;
    +-----------------+
    | min(shop_price) |
    +-----------------+
    |           18.00 |
    +-----------------+
    1 row in set (0.00 sec)
    
    mysql> select sum(goods_number) from ecs_goods;
    +-------------------+
    | sum(goods_number) |
    +-------------------+
    |               313 |
    +-------------------+
    1 row in set (0.04 sec)
    
    mysql> select avg(shop_price) from ecs_goods;
    +-----------------+
    | avg(shop_price) |
    +-----------------+
    |     1232.526774 |
    +-----------------+
    1 row in set (0.00 sec)
    
    mysql> select count(cat_id) from ecs_goods;
    +---------------+
    | count(cat_id) |
    +---------------+
    |            31 |
    +---------------+
    1 row in set (0.02 sec)

           

        Select count(*) from 表名       查询的就是绝对的行数,哪怕某一行所有字段全为空null,也就算在内

        而 select count(列名)from 表名

        查询的是该列不为null的所有行的行数

        用count(*),count(1)谁好呢?

        其实对于myisam 引擎的表,没有区别的

        这种引擎内部有一计算器在维护着行数

        Innodb 的表,count(*)直接读行数的话,效率很低,因为innodb它是一行一行数了一遍

      三、上面是5个统计函数,单独使用,意义不大,要和分组配合起来使用

                  Group by 分组查询

                         group by 子句给出一个或多个属性用来构造分组

                         严格的讲以group by    a,b,c为列则 select的列只能在a,b,c里选择,语义上才没有矛盾,所以在使用group by时,select的内容一定要仔细斟酌确保首先语义上没有错误

        

    mysql> select sum(goods_number)
                        -> from ecs_goods
                        -> group by cat_id;
    +-------------------+
    | sum(goods_number) |
    +-------------------+
    |                 0 |
    |               203 |
    |                 3 |
    |                 8 |
    |                61 |
    |                23 |
    |                 4 |
    |                 9 |
    |                 2 |
    +-------------------+
    9 rows in set (0.12 sec)
    
    mysql> select goods_id,sum(goods_number)
        -> from ecs_goods
        -> group by cat_id;
    +----------+-------------------+
    | goods_id | sum(goods_number) |
    +----------+-------------------+
    |       16 |                 0 |
    |        8 |               203 |
    |        1 |                 3 |
    |       23 |                 8 |
    |        4 |                61 |
    |        5 |                23 |
    |       25 |                 4 |
    |       29 |                 9 |
    |       27 |                 2 |
    +----------+-------------------+
    9 rows in set (0.00 sec)
    
    mysql> select cat_id,sum(goods_number)
        -> from ecs_goods
        -> group by cat_id;
    +--------+-------------------+
    | cat_id | sum(goods_number) |
    +--------+-------------------+
    |      2 |                 0 |
    |      3 |               203 |
    |      4 |                 3 |
    |      5 |                 8 |
    |      8 |                61 |
    |     11 |                23 |
    |     13 |                 4 |
    |     14 |                 9 |
    |     15 |                 2 |
    +--------+-------------------+
    9 rows in set (0.00 sec)

      就先写这些吧,写长了,大家也没耐心看,哈哈、、、、、太长的博客 ,我也静不下心来写,一点一点总结吧

  • 相关阅读:
    【转载】[030]◀▶ ArcEngine 一些实现代码
    C#获取FTP目录下文件夹、文件的方法,进而判断FTP下指定文件夹是否存在
    C# 命名空间"DevExpress.XtraReports.UserDesigner"中不存在类型或命名空间名称"XRTabbedMdiManager"。是否缺少程序集引用?
    C#欢迎界面的两种形式
    RibbonForm中Text显示不完整
    IDL波段分解与合成源代码
    Java多线程--synchronized(二)
    Java多线程--synchronized(一)
    Java多线程--基础(三)
    Java多线程--基础(二)
  • 原文地址:https://www.cnblogs.com/wxb0328/p/3888522.html
Copyright © 2020-2023  润新知