一.分组
1.组函数操作行集,给出每组的结果。这些集合可能是整个表或者是表分的组。
2.组函数和单行函数的区别
单行函数对每行的结果做处理,组函数只对分组的函数做处理。
单行函数对每个结果集返回一个结果,组函数对每个组返回一个结果。
3.组函数的类型
age,count,min,max,sum
4.组函数的语法
select [column],function(column)...
from table
[where condition]
[group by column]
[order by column]
5.组函数使用原则
参数数据类型可以是:char ,varchar1, number,date
所有组函数忽视空值,可以用nvl,nvl2,函数代替空值
二.函数的使用
1.avg,sum
两个函数的参数只能是数值类型
实列:
求员工表中平均薪水与薪水总额
select avg(salary),sum(salary) from employees'
2.min和max
参数类型可以是:数字,字符,日期
实列:
求员工表中的最高薪水和最低薪水
select mun(salary),min(salary) from employees
3.count
返回一个表中的行数
三种格式:
count(*)
返回所有行数,包括有数值的,重复行,空值,如果有where ,则返回满足条件的行数
实列:
返回查询结果的 行数:
select count(*) from employees;
count(expr)
返回有expr指定的列,返回非空的行数
实列:
显示部门80中有奖金的员工人数
select count(commission_pct) from employees e where e.commission_id=80
count(distinct expr)
除去重复行的函数
4.组函数和null值
使用nvl函数处理组函数忽视的空值,是空值的行也查询出来
实列:
计算有佣金的员工的平均值
select avg(commission_pct) from employees
计算所有员工的佣金的平均值
select avg(nvl(commission_pct,0)) from employees
三.创建数据组
1.根据查询的结果集划分跟小的组,用group by实现
2.group by子句可以把表中的行划分为组,然后用组函数返回每一组的信息。
3.分组原则
(1)select子句中出现的列必须出现在
group by子句中,否则会出现一个错误信息。
(2)可以使用where子句将分组前的数据过滤。
(3)group by子句中不能用列的别名
(4)group by包含的列中的字段默认升序排列。
(5)select子句是可以不包含group by中的列
实列:
显示出每个部门付给每个工作岗位的合计薪水报告
select department_id, sum(salary), job_id from employees group by job_id , department_id order by department_id
4.group by的执行顺序
数据查询-->数据分组 -->执行组函数
四.having子句
1.having于group by联合使用,用来过滤分组后的数据。having弥补了where函数
与聚合函数不能联合使用的不足。
2.过滤的列如果是组函数处理过的列需要加上组函数
实列:
显示最高薪水大于10000的部门的部门编号和最高薪水
select department_id,max(salary) from employees group by department_id having max(salary)>10000;
----------------------------子查询---------------------------------------------------------
一.子查询简介
1.字查询是 一个select语句,他是嵌套在另一个select语句中的子句
2.语法结构
select select_list from table where exper operator(select select_list from table)
3.子查询在查询之前执行一次,子查询的结果被用于主查询。
4.可以将子查询放在 where子句中,having子句中,from子句中
5.查询原则
(1)子查询放在圆括号中
(2)将子查询放在比较条件的右边
(3)在单行子查询中用单行运算符,多行字查询中用多行运算符。
6.子查询的类型
单行子查询:子查询语句值返回一行的查询
多行子查询:子查询返回多行的查询
二.单行子查询
1.仅返回一行,使用单行比较运算符
2.单行运算符
3.实列:
显示哪些job_id和员工141相同的员工的名字与job_id
select job_id,last_name from employees group by job_id having job_id=(select job_id from employees where employee_id =141);
4.实列:
显示job_id于员工141相同,并且薪水高于143的那些员工:
select salary ,job_id from employees where job_id=(select job_id from employees where employee_id=141) and salary>(select salary from employees where employee_id=143)
5.子查询中使用组函数
实列:显示所有薪水等于最低薪水的员工的last_name,job_id,salary:
select last_name,job_id,salary from employees where salary=(select min(salary) from employees );
6.代子查询的having的子句
实列:显示所有最低薪水小于部门50的最低薪水的部门号和最低薪水
select dapartment_id ,min(salary) from employees group by department_id having min(salary)<(select min(salary) from employees where department_id=50)
三.多行子查询
1.返回多于一行,使用多行比较符
2.多行比较符
3.in运算符
实列:
查询各部门收入为部门最低的哪些成员,显示名字,薪水,部门id
select first_name,salary,department_id from employees where salary in (select min(salary) from employees group by department_id)
4.any运算符
< any意思是小于最大值,>any意思是大于最大值
实列:
显示工作岗位不是 IT_PROG 的雇员,并且
这些雇员的的薪水少于 IT_PROG 工作岗位的雇员的 ID、名字、工作岗位和薪水
select employee_id,last_name,job_id, salary from employees where job_id<>'IT_PROG' and salary < any(select salary from employees where jon_id='IT_PROG')
5.all运算符
<ALL 意思是小于最小值。>ALL 意思是大于最大值。
ANY 与 ALL 的区别:
ANY: >ANY 表示至少大于一个值,即大于最小值。
ALL: >ALL 表示大于每一个值,既大于最大值。