• 周日. 5月 26th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

SQL中的5种聚集函数

admin

11月 28, 2021

  作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神、大牛到底是怎样炼成的啊,我这小菜鸟感觉这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)

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

《SQL中的5种聚集函数》有一个想法
  1. Wow, superb blog layout! How long have you been blogging for?

    you made blogging glance easy. The whole glance of your web site
    is fantastic, let alone the content material!
    You can see similar here najlepszy sklep

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注