Oracle-05
数据查询语言---DQL
1、排序
asc:升序(默认值)
desc:降序
将查询结果进行排序(先有查询的结果再进行排序),排序用order by后面跟上排序呢指定的列,指明排序的规则
eg:将薪水由低到高进行排序
select ename,salary from emp_xu order by salary asc;//asca表示升序,也可以不写,默认为升序
select ename,salary from emp_xu order by salary desc;//降序
注意:空值在排序的时候被看做最大值
排序语句的执行在select之后,因此排序可以使用列名、列别名、表达式、函数还可以用数字值(表示按照结果集第几列排序,第一列使用数字1表示))
2、分组
1)分组使用group by后面跟上指定的分组字段
eg:按照职位进行分组,求每个职位的最高,最低薪水和对应的人数总和
select position,max(salary),min(salary),count(*) from emp_xu group by position;
select ename,position,max(salary),min(salary),count(*) from emp_xu group by position;//报错,ename不是 GROUP BY 表达式
select position,max(ename),max(salary),min(salary),count(*) from emp_xu group by position;//将ename使用组函数进行包围
注意:select之后出现的列,凡是没有被组函数包围的,必须要出现在group by语句中
2)having:用于对分组之后的数据进行过滤,having是结合group by一起使用
eg:查询平均薪水大于5000的部门号、平均薪水,没有部门号的不算在内
select deptno,avg(nvl(salary,0)) from emp_xu where deptno is not null group by deptno having avg(nvl(salary,0))>5000;
select deptno,avg(salary) from emp_xu where deptno is not null group by deptno having avg(salary)>5000;
select deptno,avg(salary) avg_salary from emp_xu where deptno is not null group by deptno having avg_salary>5000;//报错,avg_salary无效的标识符,
注意:where是对表中的数据进行过滤,having是对分组之后的结果进行过滤
语句有先后的执行顺序,having在select之前执行的(from->where->group by->having->select)
总结:(表的基础查询)
a. 写法顺序:
select->from->where->group by->having->order by
b. 执行顺序
from->where->group by->having->select->order by
c. 关于where和having区别
* where是行记录的过滤,having是组数据记录的过滤
* where可以跟任何的列名以及单行函数,不能跟组函数
* having只能包含group by之后的表达式或组函数
* where是执行在前的,having执行在后
* where和having都不能跟列别名(他们都是在select前执行)