SQL基础-->分组与分组函数

--=================================

--SQL基础-->分组与分组函数

--=================================

/*

一、分组:

    分组函数可以对行集进行操作,并且为每组给出一个结果。

   使用group by column1,column2,..按columm1,column2进行分组,即column1,column2组合相同的值为一个组

 

二、常用分组函数: */

    AVG([DISTINCT|ALL]n)        -- 求平均值,忽略空值

    COUNT({*|[DISTINCT|ALL]expr})  -- 统计个数,其中expr用来判定非空值(使用*计算所有选定行,包括重复行和带有空值的行)

    MAX([DISTINCT|ALL]expr)        -- 求最大值,忽略空值

    MIN([DISTINCT|ALL]expr)        -- 求最小值,忽略空值

    SUM([DISTINCT|ALL]n)        -- 求和,忽略空值

/*

三、分组函数语法:*/

    SELECT [column,] group_function(column), ...

    FROM table

    [WHERE condition]

    [GROUP BY column]

    [ORDER BY column];

/*

四、分组函数使用准则:

    DISTINCT 使函数只考虑非重复值,ALL则考虑包括重复值在内的所有值。默认为ALL.

  带有expr参数的函数的数据类型可以为CHAR,VARCHAR2,NUMBER,DATE.

    所有分组函数都忽略空值。可以使用NVL,NVL2,或COALESCE函数代替空值

    使用GROUP BY 时,Oralce服务器隐式地按照升序对结果集进行排序。可以使用ORDER BY 更改排序结果。 

 

     可以使用NVL 函数强制分组函数包含空值,如:*/

        select avg(nvl(comm,0)) from emp;  

/*    

五、GROUP BY 子句的语法:

    使用GROUP BY 子句可以将表中的行分成更小的组,然后使用分组函数返回每一组的汇总信息*/

    SELECT column, group_function(column)

    FROM table

    [WHERE condition]

    [GROUP BY group_by_expression]

    [ORDER BY column];

 

    GROUP BY  --group_by_expression 即为对哪些列进行分组

/* 

六、GROUP BY 使用准则:

    SELECT 中出现的列,如果未出现在分组函数中,则GROUP BY子句必须包含这些列

    WHERE 子句可以某些行在分组之前排除在外

    不能在GROUP BY 中使用列别名

    默认情况下GROUP BY列表中的列按升序排列

    GROUP BY 的列可以不出现在分组中 

   

七、分组过滤:

    使用having子句

   

    having使用的情况:

       行已经被分组

       使用了组函数

       满足having子句中条件的分组将被显示

 

八、演示:*/

--为数字数据使用AVG和SUM方法

    SQL> select min(sal) as min_sal,max(sal) as max_sal,

      2    avg(sal) as avg_sal,sum(sal) as sum_sal

      3  from scott.emp;

 

       MIN_SAL    MAX_SAL    AVG_SAL    SUM_SAL

    ---------- ---------- ---------- ----------

          800       5000 2073.21429      29025

 

--对于数字,字符和日期数据类型,你能使用MIN和MAX方法     

    SQL> select min(hiredate) as min_hiredate,max(hiredate) as max_hiredate from scott.emp;

 

    MIN_HIRED MAX_HIRED

    --------- ---------

    17-DEC-80 23-MAY-87

 

--使用count(*),count(expr),count(distinct expr)

--注意coung(*)包含空值、重复值,count(expr)过滤空值,count(distinct expr)即过滤空值,也过滤重复值

    SQL> select count(*),count(mgr),count(distinct mgr) from emp;

 

      COUNT(*) COUNT(MGR) COUNT(DISTINCTMGR)

    ---------- ---------- ------------------

           14         13                  6

 

--使用NVL 函数强制分组函数包含空值

    SQL> select avg(comm) ,avg(nvl(comm,0)) from emp;

 

     AVG(COMM) AVG(NVL(COMM,0))

    ---------- ----------------

          550       157.142857   

 

--使用group by 子句来分组

    SQL> select job ,avg(sal) from emp group by job;

 

    JOB         AVG(SAL)

    --------- ----------

    CLERK         1037.5

    SALESMAN        1400

    PRESIDENT       5000

    MANAGER   2758.33333

    ANALYST         3000

 

--GROUP BY 的列可以不出现在分组中  

    SQL> select avg(sal) from emp group by job order by avg(sal) desc;

 

      AVG(SAL)

    ----------

         5000

         3000

    2758.33333

         1400

       1037.5

 

--错误的用法,SELECT 中的有些列没有在GROUP BY子句中出现

    SQL> select job,avg(sal) from emp;

    select job,avg(sal) from emp

          *

    ERROR at line 1:

    ORA-00937: not a single-group group function 

 

--使用having子句过滤分组结果

--查询平均工资高于的部门号,及其平均工资。

 

    select deptno,avg(sal) from emp group by deptno

    having avg(sal)>2000;

 

--查出平均工资在以上的工种(job)

    select job,avg(sal) from emp group by job having avg(sal)>2000;

   

--求人数在人以上的部门

    select deptno,count(*) from emp group by deptno having count(*)>5;

   

--使用分组函数的嵌套

    SQL> select max(avg(sal)) from emp group by deptno;

 

    MAX(AVG(SAL))

    -------------

       2916.66667

/*

九、更多 */

Oracle 数据库实例启动关闭过程

 

Oracle 10g SGA 的自动化管理

 

使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例

 

Oracle实例和Oracle数据库(Oracle体系结构)

 

SQL 基础-->常用函数

 

SQL基础-->过滤和排序

 

SQL 基础-->SELECT 查询

 

时间: 2024-12-22 16:13:37

SQL基础-->分组与分组函数的相关文章

SQL基础4——分组与分组函数

/* 一.分组:     分组函数可以对行集进行操作,并且为每组给出一个结果.    使用group by column1,column2,..按columm1,column2进行分组,即column1,column2组合相同的值为一个组   二.常用分组函数: */     AVG([DISTINCT|ALL]n)        -- 求平均值,忽略空值     COUNT({*|[DISTINCT|ALL]expr})  -- 统计个数,其中expr用来判定非空值(使用*计算所有选定行,包括

sql 对相对数据进行分组查询语句

sql 对相对数据进行分组查询语句 /* | section | province | area   | zone | postcode | cardtype                 | telco  | | 1879728 | 青海      | 共和         | 0974 | 813000   | 移动187卡                   | 移动   | | 1879741 | 湖南      | 长沙         | 0731 | 410000   | 移动1

分组后分组合计以及总计SQL语句(稍微整理了一下)

今天看到了这个文章感觉内容挺多的,就是比较乱,实在不好整理,脚本之家小编就简单整理了一下,希望大家能凑合看吧 分组后分组合计以及总计SQL语句   1)想一次性得到分组合计以及总计,sql: SELECT 分组字段 FROM 表 GROUP BY 分组字段 compute sum(COUNT(*)) 2)分组合计1: SELECT COUNT(*) FROM (SELECT 分组字段 FROM 表 GROUP BY 分组字段 )别名 3)分组合计2: SELECT COUNT(*) FROM (

SQL 基础-->常用函数

--================================== --SQL 基础-->常用函数 --================================== /* 一.函数的分类     SQL函数一般分为两种     单行函数 基于单行的处理,一行产生一个结果     多行函数 基于多行的处理,对多行进行汇总,多行产生结果   二.函数形式     function_name [(arg1, arg2,...)]   三.常用的单行函数:  1. 字符函数:     lo

数据库-sql语句按年怎样分组 求大神支招

问题描述 sql语句按年怎样分组 求大神支招 比如下面:比如字段两列 A B2011 1002011 602011 702012 2002012 2502013 3002013 400 我想最后得到分组结果 比如:2011年的为一个数组 array( 2011 => 100 2011 => 60 2011 => 70 )然后 2012和2013 和2011 一个道理求大神支招 解决方案 --> 测试数据:[tb]if object_id('[tb]') is not null dr

图片-SQL查询,急急急急,关于分组,平均值的问题

问题描述 SQL查询,急急急急,关于分组,平均值的问题 图: 主键-地区-销售人员-销售金额 问题是: 查询出所有超过本地区销售金额平均值 的销售金额 解决方案 SELECT 表名.* from 表名, (select avg(total) t,region from 表名 group by region) ta where 表名.region=ta.region and 表名.total>ta.t 解决方案二: select total from 表名 group by region havi

树状结构 求和-sql 按树状结构 分组求和 父节点包括所有字节点的值

问题描述 sql 按树状结构 分组求和 父节点包括所有字节点的值 有一个表存树状结构: 值 上级节点 所属级数 001 * 1 00101 001 2 00102 001 2 0010203 00102 3 ... 00103 001 2 ... 在其他表中存储对应的数据,有[金额]和[数状表的字节点值]. 如: 100.00 / 0010203 现在想做出求和的效果如下 码值 合计 001 161 00101 61 0010101 50 0010101 11 00102 100 0010203

《MySQL DBA修炼之道》——3.3 SQL基础

3.3 SQL基础 SQL是一种高级查询语言,它是声明式的,也就是说,只需要描述希望怎么获取数据,而不用考虑具体的算法实现.3.3.1 变量 MySQL里的变量可分为用户变量和系统变量.1.用户变量 用户变量与连接有关.也就是说,一个客户端定义的变量不能被其他客户端看到或使用.当客户端退出时,该客户端连接的所有变量将自动释放.这点不同于在函数或存储过程中通过DECLARE语句声明的局部变量,局部变量的生存周期在它被声明的"BEGIN-END"块内.对于用户变量的值,可以先保存在用户变量

SQL 基础--> 子查询

--========================= --SQL 基础--> 子查询 --=========================     /* 一.子查询     子查询就是位于SELECT.UPDATE.或DELETE语句中内部的查询     二.子查询的分类     单行子查询         返回零行或一行     多行子查询         返回一行或多行     多列子查询         返回多列     相关子查询         引用外部SQL语句中的一列或多列