zoukankan      html  css  js  c++  java
  • MySQL基础之汇总数据

    聚集函数

    经常需要汇总数据而不用把他们实际检索出来。这种类型的检索例子有以下几种

    • 确定表中的行数(或者满足某个条件或包含某个特定值的行数)
    • 获得表中行组的和
    • 找出表列(或所有行或某些特定的行)的最大值、最小值和平均值

    为了方便这种类型的检索, MySQL给出了5个聚集函数。

    聚集函数(aggregate function): 运行在行组上, 计算和返回单个值的函数 

    AVG函数

    AVG()通过对表中的行数计数并计算特定列值的和, 求得该列的平均值。AVG()可用来返回所有列的平均值, 也可以返回特定列或行的平均值

    例一: 返回所有产品的平均价格

    MariaDB [crashcourse]> SELECT AVG(prod_price) AS avg_price FROM products;
    +-----------+
    | avg_price |
    +-----------+
    | 16.133571 |
    +-----------+
    1 row in set (0.002 sec)
    
    MariaDB [crashcourse]> 

    例二: 返回特定供应商所提供的产品的平均价格

    MariaDB [crashcourse]> SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 1003;
    +-----------+
    | avg_price |
    +-----------+
    | 13.212857 |
    +-----------+
    1 row in set (0.002 sec)
    
    MariaDB [crashcourse]> 

    AVG()函数只能用于特定的数值列的平均值, 而且列名必须作为函数参数给出。为了获得多个列的平均值, 必须使用多个AVG()函数

    AVG函数忽略列值为NULL的行

    COUNT函数

    COUNT()函数可以确定表中行的数目或符合特定条件的行的数目

    COUNT()函数有两种使用方式

    • 使用COUNT(*)对表中行的数目进行计数, 不管表列中包含的是空值(NULL)还是非空值
    • 使用COUNT(column)对特定的列中具有值的行进行计数, 忽略NULL值

    例1: 返回customers表中客户的总数

    MariaDB [crashcourse]> SELECT COUNT(*) AS num_cust FROM customers;
    +----------+
    | num_cust |
    +----------+
    |        5 |
    +----------+
    1 row in set (0.001 sec)
    
    MariaDB [crashcourse]> 

    例2: 返回具有电子邮件地址的客户总数

    MariaDB [crashcourse]> SELECT COUNT(cust_email) AS num_cust FROM customers;
    +----------+
    | num_cust |
    +----------+
    |        3 |
    +----------+
    1 row in set (0.000 sec)
    
    MariaDB [crashcourse]> 

    如果指定列名, 则指定列的值为空的行被COUNT()函数忽略, 但如果COUNT()函数中用的是星号(*), 则不忽略

    MAX()函数

    MAX()函数返回指定列的最大值。MAX()要求指定列名

    MariaDB [crashcourse]> SELECT MAX(prod_price) AS max_price FROM products;
    +-----------+
    | max_price |
    +-----------+
    |     55.00 |
    +-----------+
    1 row in set (0.001 sec)
    
    MariaDB [crashcourse]> 

    MAX()函数忽略列值为NULL的行

    MIN()函数

    MIN()函数返回指定列的最小值。MIN()要求指定列名

    MariaDB [crashcourse]> SELECT MIN(prod_price) AS min_price FROM products;
    +-----------+
    | min_price |
    +-----------+
    |      2.50 |
    +-----------+
    1 row in set (0.000 sec)
    
    MariaDB [crashcourse]> 

    MIN()函数忽略列值为NULL的行

    SUM()函数

    SUM()用于返回指定列值的和(总计)

    MariaDB [crashcourse]> SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;
    +---------------+
    | items_ordered |
    +---------------+
    |            19 |
    +---------------+
    1 row in set (0.001 sec)
    
    MariaDB [crashcourse]> 

    SUM()也可以用来合计计算值

    MariaDB [crashcourse]> SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;
    +-------------+
    | total_price |
    +-------------+
    |      149.87 |
    +-------------+
    1 row in set (0.001 sec)
    
    MariaDB [crashcourse]> 

    SUM()函数忽略列值为NULL的行

    聚集不同的值

    以上5个聚集函数都可以如下使用:

    • 对所有的行进行计算, 指定ALL参数或不给参数(因为ALL是默认行为)
    • 只包含不同的值, 指定DISTINCT参数
    MariaDB [crashcourse]> SELECT AVG(DISTINCT prod_price)AS avg_price FROM products WHERE vend_id = 1003;
    +-----------+
    | avg_price |
    +-----------+
    | 15.998000 |
    +-----------+
    1 row in set (0.001 sec)
    
    MariaDB [crashcourse]> 

    注意: 如果指定列名, 则DISTINCT只能用于COUNT(), DISTINCT不能用于COUNT(*)。类似的, DISTINCT必须使用列名, 不能用于计算或表达式

    组合聚集函数

    SELECT语句可以根据需要包含多个聚集函数

    MariaDB [crashcourse]> SELECT COUNT(*) AS num_items,
        -> Min(prod_price) AS price_min,
        -> MAX(prod_price) AS price_max,
        -> AVG(prod_price) AS price_avg
        -> FROM products;
    +-----------+-----------+-----------+-----------+
    | num_items | price_min | price_max | price_avg |
    +-----------+-----------+-----------+-----------+
    |        14 |      2.50 |     55.00 | 16.133571 |
    +-----------+-----------+-----------+-----------+
    1 row in set (0.000 sec)
    
    MariaDB [crashcourse]> 

    在指定别名以包含某个聚集函数的结果时, 不应该用表中实际的列名。虽然这样做并非不合法, 但使用唯一的名字会使SQL更易于理解和使用

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/featherwit/p/13374273.html
Copyright © 2011-2022 走看看