`

SQL:Group Functions,GROUP BY,HAVING

阅读更多
http://superman-chenzs.itpub.net/post/29327/276061

GROUP FUNCTIONS operate on sets of rows to give one result per group.

Types:
- AVG
- COUNT
- MAX
- MIN
- STDDEV:标准偏差
- SUM
- VARIANCE:方差
Syntax:
SELECT [column,] group_function(column),..
FROM table
[WHERE condition]
[GROUP BY column]
[HAVING group_condion]
[ORDER BY column];


1. You can use AVG and SUM for numeric data.

2. You can use MIN and MAX for any data type.

3. COUNT(*) returns the number of rows in a table.

4. Using the DISTINCT Keyword: COUNT(DISTINCT expr) returns the number of distinct non-null values of the expr.

5. In Oracle,Group function ignore null values in the column.【在Oracle环境中,在实现聚合函数处理时,聚合函数其缺省情况它会忽略NULL值。如:COUNT(expr) returns the number of rows with non-null values for the expr.】
eg:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select avg(deptno) from emp;

AVG(DEPTNO)
-----------
22.1428571

SQL> select avg(distinct deptno) from emp;

AVG(DISTINCTDEPTNO)
-------------------
20
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

6. Using the NVL Function with Group Function:
The NVL function forces group functions to include null values.
eg:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select sum(mgr) from emp;

SUM(MGR)
----------
100611

SQL> select sum(nvl(mgr,100000000)) from emp;

SUM(NVL(MGR,100000000))
-----------------------
100100611
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

7. Group Function can be nested.
eg:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select sum(avg(empno)) from emp group by deptno

SUM(AVG(EMPNO))
---------------
23237.8667

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

8. Group Functions' location is in SELECT list and HAVING clause.

-------------------------------------------------------------------------------------------------------------------------
Creating Groups of Data : The GROUP BY Clause Syntax
- Divide rows in a table into smaller groups by using the GROUP BY clause.
eg:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select sum(empno) from emp group by deptno;

SUM(EMPNO)
----------
23555
38501
46116
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- All columns in the SELECT list that are not in group functions must be in the GROUP BY clause.
- The GROUP BY column does not have to be in the SELECT list.

eg:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select ename,sum(empno) from emp group by deptno;
select ename,sum(empno) from emp group by deptno
*
第1行出现错误:
ORA-00979: 不是 GROUP BY 表达式


SQL> select ename,sum(empno) from emp group by deptno,ename;

ENAME SUM(EMPNO)
---------- ----------
KING 7839
CLARK 7782
MILLER 7934
FORD 7902
ADAMS 7876
JONES 7566
SCOTT 7788
SMITH 7369
WARD 7521
ALLEN 7499
BLAKE 7698
JAMES 7900
MARTIN 7654
TURNER 7844

已选择14行

SQL> select ename,sum(empno),deptno from emp group by deptno,ename;

ENAME SUM(EMPNO) DEPTNO
---------- ---------- ----------
KING 7839 10
CLARK 7782 10
MILLER 7934 10
FORD 7902 20
ADAMS 7876 20
JONES 7566 20
SCOTT 7788 20
SMITH 7369 20
WARD 7521 30
ALLEN 7499 30
BLAKE 7698 30
JAMES 7900 30
MARTIN 7654 30
TURNER 7844 30

已选择14行

SQL> select ename,sum(empno),deptno from emp group by ename,deptno;

ENAME SUM(EMPNO) DEPTNO
---------- ---------- ----------
FORD 7902 20
KING 7839 10
WARD 7521 30
ADAMS 7876 20
ALLEN 7499 30
BLAKE 7698 30
CLARK 7782 10
JAMES 7900 30
JONES 7566 20
SCOTT 7788 20
SMITH 7369 20
MARTIN 7654 30
MILLER 7934 10
TURNER 7844 30

已选择14行
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


-------------------------------------------------------------------------------------------------------------------------
Excluding Group Results: The HAVING Clause
Use the HAVING clause to restrict groups:
1. Rows are grouped.
2. The group function is applied.
3. Groups matching the HAVING clause are displayed.
eg:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select ename,mgr,deptno from emp group by deptno,ename,mgr having avg(empno)>7700

ENAME MGR DEPTNO
---------- ---------- ----------
KING 10
CLARK 7839 10
MILLER 7782 10
FORD 7566 20
ADAMS 7788 20
SCOTT 7566 20
JAMES 7698 30
TURNER 7698 30

已选择8行
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


-------------------------------------------------------------------------------------------------------------------------
Illegal (非法的) Queries Using Group Functions:
- You cannot use the WHERE clause to restrict (约定、限制) groups.
- You use the HAVING clause to restrict groups.
- You cannot use group functions in the WHERE clause.
eg:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select ename,mgr from emp where avg(mgr>7650;
select ename,mgr from emp where avg(mgr>7650
*
第1行出现错误:
ORA-00934: 此处不允许使用分组函数


SQL> select ename,mgr from emp where mgr>(select avg(mgr) from emp);

ENAME MGR
---------- ----------
SMITH 7902
JONES 7839
BLAKE 7839
CLARK 7839
ADAMS 7788
MILLER 7782

已选择6行

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
分享到:
评论

相关推荐

    SQL 语法 SQL 总结 SQL教程

    SQL 基础 SQL 首页 SQL 简介 SQL 语法 ...SQL Group By SQL Having SQL ucase() SQL lcase() SQL mid() SQL len() SQL round() SQL now() SQL format() SQL 总结 SQL 快速索引 SQL 总结

    Oracle SQL:经典查询练手

    SQL包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等子句,它们分别用于定义要查询的数据、指定数据来源、过滤条件、分组以及排序。例如,一个简单的查询可能如下所示: ```sql SELECT column1, column2 ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询 样例数据库

    4. **GROUP BY与HAVING子句**:GROUP BY用于将数据按照一个或多个列进行分组,HAVING则在分组后对组进行条件筛选。 5. **聚合函数**:如COUNT、SUM、AVG、MAX和MIN,用于对一组值进行计算。 6. **JOIN操作**:包括...

    SQL:SQL-92,SQL-99和SQL-2003的BNF语法

    例如,BNF可能会描述如何构建一个SELECT语句,包括其组成部分(如`SELECT`, `FROM`, `WHERE`, `GROUP BY`, `HAVING`等)以及这些部分如何组合。 在学习和应用这些SQL标准时,理解BNF语法对于编写正确和高效的SQL...

    Microsoft SQL Server 2005技术内幕全套(三):T-SQL查询.part1

    同时,GROUP BY和HAVING子句用于根据一个或多个列对数据进行分组,并对分组结果进行筛选。透视查询(PIVOT)和行列转换也是重要的内容,它们能够将数据从行转换为列或反之,以满足特定的报表需求。 窗口函数...

    oracle advanced sql 高级SQL教程 ORACLE官方教材

    Review of Group Functions 3-3 Review of the GROUP BY Clause 3-4 Review of the HAVING Clause 3-5 GROUP BY with ROLLUP and CUBE Operators 3-6 ROLLUP Operator 3-7 ROLLUP Operator Example 3-8 CUBE ...

    key_functions_in_oracle_sql.rar_in

    `HAVING`可以与`GROUP BY`结合使用,如`SELECT column1, AVG(column2) FROM table GROUP BY column1 HAVING AVG(column2) > 100`. 5. **JOIN操作**: JOIN用于合并两个或更多表中的数据。有多种类型的JOIN,如INNER ...

    SQL SERVER 2000查询语句

    4. **分组与聚合函数(GROUP BY 和 HAVING)**: GROUP BY语句用于根据一个或多个列对结果进行分组,而聚合函数(如COUNT、SUM、AVG、MAX和MIN)则用于计算每个组的汇总信息。HAVING用于过滤分组后的结果。例如,找...

    SQL 重复函数 2005

    - **组合使用**:`DISTINCT`可以与其他SQL关键字如`GROUP BY`、`HAVING`等结合使用,实现更复杂的数据筛选和统计需求。 ```sql SELECT DISTINCT column1, SUM(column2) FROM table_name GROUP BY column1; ``` #...

    SQL 经典查询练习

    以上示例涵盖了SQL查询的基础语法和一些高级技巧,如连接操作(JOIN)、子查询(SUBQUERY)和聚合函数(AGGREGATE FUNCTIONS)。通过这些练习,可以帮助初学者更好地理解和掌握SQL语言的关键概念和技术,从而提高其...

    SQL的简单查询功能

    - 分组查询通常涉及`GROUP BY`子句,它与普通的`WHERE`子句选择不同之处在于,`GROUP BY`会先对数据进行分组,然后应用聚集函数。 - 示例:查询有两门课在90分以上的学生学号及90分以上课程数。 ```sql SELECT ...

    Microsoft SQL Server 2005 技术内幕:T-SQL 编程

    以及聚合函数(GROUP BY 和 HAVING),用于对数据进行分组和过滤。 3. **存储过程和函数**:讲解如何创建和管理存储过程,这是预编译的T-SQL代码块,可以提高性能并简化复杂的操作。同时,会涉及用户定义函数(UDFs...

    高级查询sql题目

    6. **HAVING子句**:与WHERE子句类似,HAVING用于过滤GROUP BY后的结果,但WHERE在聚合函数之前应用,HAVING则在之后。 7. **窗口函数(Window Functions)**:窗口函数允许我们在一个数据集的“窗口”上进行计算,...

    T-SQL编程入门(SQL Server)

    - `GROUP BY` 子句根据指定列进行分组。 - `HAVING` 子句用于过滤分组后的数据。 #### 十三、多表联接查询 (Join Queries) - **分类**: - 内连接 (`INNER JOIN`): 返回两个表中匹配的行。 - 左外连接 (`LEFT ...

    SQL操作符和函数

    - **GROUP BY**:按一个或多个列进行分组。 - **HAVING**:对分组后的结果进行过滤。 #### 三、SQL操作符详解 ##### 1. SQL比较操作符 - **COMPARISON OPERATORS**:用于比较两个值。 - `=`:等于。 - `<>` 或 `...

    LINQ to SQL手册

    6. **Group By/Having**:`Group By` 将数据按指定字段分组,`Having` 则用于在分组后过滤数据,类似 `WHERE` 但针对的是分组后的结果。 7. **Exists/In/Any/All/Contains**:这些谓词用于检查条件的存在性,如 `...

    SQL语句-递归查询、分组、统计.pdf

    - 复杂的`GROUP BY`:`SELECT t.personname, t.idno, COUNT(idno) FROM hr_returnsale t GROUP BY idno HAVING COUNT(idno) > 1`,它同时考虑了`personname`,并仅显示那些与多个`idno`关联的人员。 3. **统计...

    SQL基础、中级SQL、高级SQL_手册

    GROUP BY和HAVING子句用于对数据进行分组和过滤,便于聚合计算如SUM、COUNT、AVG和MAX。此外,你还将学习子查询,它可以在主查询内部执行,提供更灵活的数据筛选方式。 在高级SQL部分,将深入探讨窗口函数(Window ...

    Oracle sql 语句集锦

    - **筛选分组后的条件(Having)**: `HAVING`子句用于对`GROUP BY`后的结果进行筛选,与`WHERE`不同,`HAVING`可以作用于聚合函数的结果。 以上是Oracle SQL语句集锦中的核心知识点,涵盖了数据定义、数据操纵、...

Global site tag (gtag.js) - Google Analytics