04.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方法

select min(sal) as min_sal,max(sal) as max_sal,
avg(sal) as avg_sal,sum(sal) as sum_sal
from scott.emp;

idle> select min(sal) as min_sal,max(sal) as max_sal,
avg(sal) as avg_sal,sum(sal) as sum_sal
from scott.emp;
  2    3
   MIN_SAL    MAX_SAL	 AVG_SAL    SUM_SAL
---------- ---------- ---------- ----------
       800	 5000 2073.21429      29025

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

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

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

MIN_HIREDA MAX_HIREDA
---------- ----------
1980-12-17 1987-05-23

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

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

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

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

  COUNT(*) COUNT(MGR) COUNT(DISTINCTMGR)
---------- ---------- ------------------
	14	   13		       6

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

SQL>

idle>  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;

idle> 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;

idle> 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;

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

    DEPTNO   AVG(SAL)
---------- ----------
	20	 2175
	10 2916.66667

  

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

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

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

JOB	    AVG(SAL)
--------- ----------
PRESIDENT	5000
MANAGER   2758.33333
ANALYST 	3000

  

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

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

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

    DEPTNO   COUNT(*)
---------- ----------
	30	    6

  

--使用分组函数的嵌套

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

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

MAX(AVG(SAL))
-------------
   2916.66667

 

时间: 2024-08-29 06:23:34

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

SQL基础术语和单行函数

1.SQL基础术语 Sql语言:结构化查询语言(Structured Query Language) 查询语句 SELECT DML数据操作语言 INSERT ,UPDATE,DELETE DDL数据定义语句 CREATE,ALTER,DROP,RENAME,TRUNCATE 事务控制语句 COMMIT,ROLLBACK 数据控制语句 GRANT,REVOKE Dual空表任何含有空值的数据表达式计算出的结果都是空 例如: SQL> select 3*2 from dual; 3*2 -----

5、SQL基础整理(字符串函数)

字符串函数 ASCII 返回字符串首字母的ascii编码 select ASCII('name') select ASCII(name) from xuesheng select *from xuesheng where ASCII(name)>=200 CHAR --将ascii代码转换成对应的字符 select CHAR(13)--回车键 CHARINDEX 在一个表达式中搜索另一个表达式,并返回其起始位置(如果没找到,返回’0’) select CHARINDEX('efg','abcde

SQL基础学习篇--字符函数

字符函数可与SELECT,UPDATE,DELETE RIGHT()----从右侧开始选择  SELECT RIGHT(列,字符数量) FROM 表 LEFT()----从左侧开始选择  SUBSTRING_INDEX----截取部分列值,会找出指定字符或字符串前的所有内容 SELECT SUBSTRING_INDEX(列,'字符(串)',1代表代表出现的‘字符(串)’是第一次,2代表出现的是第二次) FROM 表 注意:字符串特指CHAR或者VARCHAR类型的数据 SUBSTRING---截

4、SQL基础整理(规范函数)

规范函数: 绝对值 select abs(-5) print abs(-5) 表中取绝对值的方法: select code,name,abs(chinese)as yuwen from xuesheng select *from xuesheng where ABS(chinese)>90 天花板.地板 select ceiling(math) from xuesheng//天花板 select *from xuesheng where ([weight] - CEILING([weight])

2、SQL基础整理(聚合函数)

聚合函数 --求平均 select  AVG(age) as 年龄 from xuesheng select AVG(chinese) as 语文 from xuesheng where class = 1 *只能对数字类型的进行操作 --求个数 select COUNT(*) from xuesheng/*查询表中有多少条数据*/ select COUNT(*) from xuesheng where name like '王%' select COUNT(distinct class) fr

SQL Server之 (三) 分组 类型转换函数 插入多条数据 字符串函数

SQL Server之 (三)  分组 类型转换函数  插入多条数据  字符串函数 自己学习笔记,转载请注明出处,谢谢!---酸菜 1.SQL 数据分组----Group by /Having  ①有一学生信息表:StuID/StuName/StuAge/StuGender/StuClassID; 求每个班级的ID和对应人数:select StuClassID 班级ID,count(*) 班级人数  from StuInfo group by StuClassID ; 求所有同学中男女同学对应人

SQL基础语法和函数

SQL常用查询语句和函数 (2012-05-09 09:44:55) 转载▼ 标签: sql查询 函数 sql常用语句 it 分类: SQL SQL SELECT 语法 SELECT 列名称 FROM 表名称 SELECT LastName,FirstName FROM Persons --------------------------------------------------------------------------------- SQL SELECT DISTINCT 语句 在

[Oracle系列整理04] oracle pl/sql 基础

PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事务控制语句 (COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DDL语句(CREATE,ALTER,DROP)和DCL语句 (GRANT,REVOKE) 1.检索单行数据    1.1使用标量变量接受数据  v_ename emp.ename%type;  v_sal   emp.sal%type;  select ename,sal into v_ename,v_sal fro

mysql 数据库笔记-基本查询(分组、聚合函数)

SELECT COUNT(*) FROM T_Employee WHERE FAge=23;  //查看人数 ALTER TABLE T_Employee ADD FSubCompany VARCHAR(20); ALTER TABLE T_Employee ADD FDepartment VARCHAR(20);  //为T_Employee表增加两列 UPDATE T_Employee SET FSubCompany='Beijing',FDepartment='Development' W