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前执行)

posted @ 2018-09-04 15:01  不是一个世界的人  阅读(197)  评论(0编辑  收藏  举报