聚合分析 在访问数据库时,经常需要对表中的某列数据进行统计分析,如求其最大值、最小值、平均值等。所有这些针对表中一列或者多列数据的分析就称为聚合分析。 在SQL中,可以使用聚合函数快速实现数据的聚合分析。与第7章介绍的SQL中的函数不同,聚合函数是对列中的一系列数据进行处理,返回单个统计值;而前面的函数则是对列中的单个数据进行处理。 聚合函数
SUM() SELECT SUM(SAL) AS BOYSAL FROM TEACHER WHERE TSEX='男' 当对某列数据进行求和时,如果该列存在NULL值,则SUM函数会忽略该值。(加上all也对每列进行求和)
COUNT() 必须指定一个列的名称或者使用星号,星号表示计算一个表中的所有记录。两种使用形式如下。 COUNT(*),计算表中行的总数,即使表中行的数据为NULL,也被计入在内。 COUNT(column),计算column列包含的行的数目,如果该列中某行数据为NULL,则该行不计入统计总数. 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) 就可以 当列的类型是 字符串或者日期时
均值函数——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='女' |
|