oracle sql 分组函数

1.count(*)

SQL> select count(*) from emp; => 14
SQL> select count(empno) from emp; => 14
SQL> select count(comm) from emp; => 4 # count(*)不统计空值,COMM存在null
SQL> select count(nvl(comm,0)) from emp; => 14
  • 查看sql语句执行计划
SQL> set autot trace exp #打开显示执行计划
SQL> select count(*) from emp;
Execution Plan
----------------------------------------------------------
Plan hash value: 2937609675
-------------------------------------------------------------------
| Id  | Operation    | Name   | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT |    | 1 | 1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |    | 1 |        |      |
|   2 |   INDEX FULL SCAN| PK_EMP |    14 | 1   (0)| 00:00:01 |
-------------------------------------------------------------------
SQL> select count(empno) from emp;
Execution Plan
----------------------------------------------------------
Plan hash value: 2937609675
-------------------------------------------------------------------
| Id  | Operation    | Name   | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT |    | 1 | 1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |    | 1 |        |      |
|   2 |   INDEX FULL SCAN| PK_EMP |    14 | 1   (0)| 00:00:01 |
-------------------------------------------------------------------
SQL> select count(nvl(comm,0)) from emp;
Execution Plan   
----------------------------------------------------------
Plan hash value: 2083865914   # TABLE ACCESS FUL 全表扫描
---------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 1 | 2 | 3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      | 1 | 2 |        |      |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |    28 | 3   (0)| 00:00:01 |
---------------------------------------------------------------------------
SQL> set autot off  # 关闭显示执行计划

2.avg(*)

SQL> select avg(sal) asal from emp; #平均薪水
SQL> select sum(comm)/count(*) from emp; #平均奖金
SQL> select min(sal),max(sal),avg(sal) from emp;

  MIN(SAL)   MAX(SAL)   AVG(SAL)
---------- ---------- ----------
       800   5000 2073.21429

3.分组语句

  • group by 列名 分组列必须出现在select后面
SQL> select deptno,min(sal),max(sal) from emp group by deptno;

    DEPTNO   MIN(SAL)   MAX(SAL)
---------- ---------- ----------
    30    950       2850
    20    800       3000
    10   1300       5000
  • 工种最低薪水
SQL> select job,min(sal) from emp group by job;
JOB     MIN(SAL)
--------- ----------
CLERK        800
SALESMAN    1250
PRESIDENT   5000
MANAGER     2450
ANALYST     3000
  • having + 条件
SQL> select job,min(sal) from emp group by job having min(sal)>2000;
JOB     MIN(SAL)
--------- ----------
PRESIDENT   5000
MANAGER     2450
ANALYST     3000

#下面where虽然和上面having是不一样的,结果也不一定相同。

SQL> select job,min(sal) from emp where sal>2000 group by job;
# 这里先限制了sal>2000,过滤了2000以下的工资,然后进行分组的

你可能感兴趣的:(oracle sql 分组函数)