• sql语句 之聚合函数


     

     

       聚合分析

      在访问数据库时,经常需要对表中的某列数据进行统计分析,如求其最大值、最小值、平均值等。所有这些针对表中一列或者多列数据的分析就称为聚合分析。

      在SQL中,可以使用聚合函数快速实现数据的聚合分析。与第7章介绍的SQL中的函数不同,聚合函数是对列中的一系列数据进行处理,返回单个统计值;而前面的函数则是对列中的单个数据进行处理。

       聚合函数

       函 数 名称

         函 数 功 能

     SUM()

        返回选取结果集中所有值的总和

     MAX()

        返回选取结果集中所有值的最大值

     MIN()

        返回选取结果集中所有值的最小值

     AVG()

        返回选取结果集中所有值的平均值

     COUNT()

        返回选取结果集中行的数目

    SUM()

    SELECT  SUM(SAL) AS BOYSAL FROM  TEACHER WHERE   TSEX='男'

    当对某列数据进行求和时,如果该列存在NULL值,则SUM函数会忽略该值。(加上all也对每列进行求和)

     

    COUNT()

    必须指定一个列的名称或者使用星号,星号表示计算一个表中的所有记录。两种使用形式如下。

    * COUNT(*),计算表中行的总数,即使表中行的数据为NULL,也被计入在内。

    * COUNT(column),计算column列包含的行的数目,如果该列中某行数据为NULL,则该行不计入统计总数.

     

     

     

     

     注意

    COUNT(*)函数将准确地返回表中的总行数,而仅当COUNT()函数的参数列没有NULL值时,才返回表中正确的行计数,所以仅当受NOT NULL限制的列作为参数时,才可使用COUNT( )函数代替COUNT(*)函数。

    SELECT  COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME, COUNT(SAL) AS TOTAL_SAL

    FROM  TEACHER

    使用COUNT( )函数对多列中的数据计数

    对多列计数,则需要将要计数的多列通过连接符连接后,作为COUNT( )函数的参数

    (暂时无例子 以后补充上来)

     

    最大/最小值函数—MAX()/MIN()

    列中的数据可以是数值、字符串或是日期时间数据类型。MAX()/MIN()函数将返回与被传递的列同一数据类型的单一值

    这里举一个例子,有典型性的.

    SELECT MAX (AGE) AS MAXAGE FROM    TEACHER (取年纪最大的老师)

    但是通常取出来后是要看老师的基本信息的,如姓名,性别,工作的年限等.

    然而SQL不支持如下的SELECT语句

    SELECT TNAME, DNAME, TSEX, MAX (AGE) FROM    TEACHER

    那该怎么办了?

    SELECT TNAME, DNAME, TSEX,SAL ,AGE FROM    TEACHER

    WHERE   AGE=MAX (AGE)  就可以

    当列的类型是 字符串或者日期时

     

    字符串

    对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。

    日期

    其大小排列就是日期时间的早晚,越早认为其值越小

     

    均值函数——AVG()

    AVG()函数的执行过程实际上是将一列中的值加起来,再将其和除以非NULL值的数目。所以,与SUM( )函数一样,AVG()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。

    SELECT  AVG (column_name) FROM    table_name

    当你想显示 其他信息时,如姓名,年纪,方法如下

    SELECT  * FROM  TEACHER

    WHERE   AGE >= (SELECT AVG (AGE) FROM    TEACHER)

    ORDER BY    AGE

     

    聚合分析的重值处理

    5种聚合函数,可以作用于所选列中的所有数据(不管列中的数据是否有重置),也可以只对列中的非重值进行处理,即把重复的值只取一次进行聚合分析。当然,对于MAX()/MIN()函数来讲,重值处理意义不大。

    可以使用ALL关键字指明对所选列中的所有数据进行处理,使用DISTINCT关键字指明对所选列中的非重值数据进行处理。以AVG()函数为例,语法如下。

    SELECT  AVG ([ALL/DISTINCT] column_name)

    FROM    table_name

    与聚合函数分不开的东西那算是分组了

    GROUP BY子句创建分组

    SELECT               column, SUM(column)

    FROM                 table

    GROUP BY             column

    说明:GROUP BY子句依据column列里的数据对行进行分组,即具有相同的值的行被划为一组。它一般与聚合函数同时使用。当然,这里的SUM()函数也可以是其他聚合函数。所有的组合列(GROUP BY子句中列出的列)必须是来自FROM子句列出的表,不能根据实际值、聚合函数结果或者其他表达式计算的值来对行分组。

    GROUP BY子句根据多列组合行

    SELECT             DNAME,TSEX, COUNT(*) AS TOTAL_NUM

    FROM               TEACHER

    GROUP BY           DNAME,TSEX

    ROLLUP运算符和CUBE运算符  主要用语扩展,暂时不写.以后添加.

     

    HAVING子句

    GROUP BY子句分组,只是简单地依据所选列的数据进行分组,将该列具有相同值的行划为一组。而实际应用中,往往还需要删除那些不能满足条件的行组,为了实现这个功能,SQL提供了HAVING子句。语法如下。

    SELECT           column, SUM(column)

    FROM             table

    GROUP BY        column

    HAVING        SUM(column) condition value

    说明:HAVING通常与GROUP BY子句同时使用。当然,语法中的SUM()函数也可以是其他任何聚合函数。DBMS将HAVING子句中的搜索条件应用于GROUP BY子句产生的行组,如果行组不满足搜索条件,就将其从结果表中删除。

    HAVING子句与WHERE子句

    HAVING子句和WHERE子句的相似之处在于,它也定义搜索条件。但与WHERE子句不同,HAVING子句与组有关,而不是与单个的行有关。

    *   如果指定了GROUP BY子句,那么HAVING子句定义的搜索条件将作用于这个GROUP BY子句创建的那些组。

    *   如果指定WHERE子句,而没有指定GROUP BY子句,那么HAVING子句定义的搜索条件将作用于WHERE子句的输出,并把这个输出看作是一个组。

    *   如果既没有指定GROUP BY子句也没有指定WHERE子句,那么HAVING子句定义的搜索条件将作用于FROM子句的输出,并把这个输出看作是一个组。

    1.

    SELECT           DNAME, COUNT(TSEX) AS num_girl

    FROM             TEACHER

    WHERE            TSEX='女'

    GROUP BY         DNAME

    2.

    SELECT           DNAME, COUNT(TSEX) AS num_girl

    FROM             TEACHER

    GROUP BY         DNAME

    HAVING           TSEX='女'

  • 相关阅读:
    Hdu 1257 最少拦截系统
    Hdu 1404 Digital Deletions
    Hdu 1079 Calendar Game
    Hdu 1158 Employment Planning(DP)
    Hdu 1116 Play on Words
    Hdu 1258 Sum It Up
    Hdu 1175 连连看(DFS)
    Hdu 3635 Dragon Balls (并查集)
    Hdu 1829 A Bug's Life
    Hdu 1181 变形课
  • 原文地址:https://www.cnblogs.com/huangyibo/p/3673666.html
Copyright © 2020-2023  润新知