- DISTINCT 关键字
去除重复行(去除某一个字段中重复行然后返回)
--查看公司有多少种职位
select DISTINCT job from emp;
也可以对多列去重,去重的原则是多个字段值的组合没有重复行(单个字段可以有重复)
select DISTINCT job,deptno from emp
- order by 子句
用于对给定的字段进行排序,order by 子句只能定义在查询的最后一个子句上。
有升序 ASC,不写默认就是升序
DESC ,降序排列
--查看公司中工资排名
select name,salary from emp order by salary DESC;
可以对多字段进行排序,每个字段可以单独指定排序方式,排序的方式从左到右进行,如果第一个字段排序完以后有相同的数据则按第二个字段排序,以此类推…
NULL 值在排序中被认作最大值
select name,salary,deptno from emp ORDER BY salary DESC,deptno ASC;
- 聚合函数
聚合函数是对结果集进行统计使用的
函数 | 意义 |
---|---|
MIN | 最小值 |
MAX | 最大值 |
AVG | 求和 |
SUM | 求平均值 |
COUNT | 对记录数的统计(多少条数据,不是具体的值) |
--查看公司的工资情况
select MIN(salary),MAX(salary),SUM(salary),AVG(salary)
from emp;
--查看公司有多少人
select COUNT(name) from emp;
聚合函数都忽略 NULL 值,直接忽略,连人头都不算,所以一般建议这样写:
select COUNT(NVL(comm,0)) from emp;
--求表中的记录总数
select COUNT(*) from emp;
- GROUP BY 子句,表示分组,根据…分组
可以对结果集按照给定字段值相同的记录进行分组,基本上是配合聚合函数对结果集进行分组使用的
--查看每个部门的平均工资
select AVG(salary),deptno from emp GROUP BY deptno;
--查看每种职位的最高工资
select MAX(salary),job from emp GROUP BY job;
多字段分组,分组的几个字段值都相同的被看做一组
--查看每个部门每种职位的最高工资
select MAX(salary),deptno,job from emp GROUP BY deptno,job;
- HAVING 与 GROUP BY
HAVING 是跟 GROUP BY 连用的,是对分好组以后的结果集进行过滤,从而过滤出满足要求的组。
--查看部门的平均工资,前提是该部门的平均工资高于2500的
select AVG(salary),deptno from emp GROUP BY deptno HAVING AVG(salary)>2500;
- HAVING 与 WHERE 的区别:
HAVING 是对分组进行过滤,是数据查询出来以后决定分组的取舍的,所以必须跟在 GROUP BY 后面,WHERE 是在查询过程中对记录进行过滤,所以过滤时机是先 WHERE 后 HAVING
--查看平均工资高于2000的部门的最高工资与最低工资
select MAX(salary),MIN(salary),deptno
from emp
GROUP BY deptno
HAVING AVG(salary)>2000;
查询语句执行顺序:
- from 子句:执行顺序从后往前,从右往左(数据量少的表尽量放在后面);
- where 子句:执行顺序自上而下,从右到左(将能过滤掉最大记录数的条件写在最右边);
- group by 子句:执行顺序从左往右分组(建议使用 where 在 group by 之前将不需要的记录过滤掉);
- having 子句:消耗资源(尽量避免使用,having 会在检索出所有记录之后才对结果进行过滤,需要排序等操作);
- select 子句:少用 * ,尽量取字段名称。(oracle 在解析过程中通过通过查询数据字段将 * 号依次转换成所有的列名,消耗时间);
- order by 子句:执行顺序从左到右排序。