4.1.4分组一group by子句 在数据库查询中,分组是一个非常重要的应用。分组 是指将数据表中所有记录中,以某个或者某些列为标准,划 分为一组。例如,在一个存储了地区学生的表中,以学校为 标准,可以将所有学生信息划分为多个组。 进行分组查询应该使用group by-子句。group by-子句指 定分组标准,并将数据源按照该标准进行划分,然后循环处 理每组数据
—— group by group by
4.1.5过滤分组—having子句 where-子句可以过滤from子句所指定的数据源,但是对 于group by子句所产生的分组无效。为了将分组按照一定条 件进行过滤,应该使用having子句。 【示例4-6】having子句是依附于group by-子句存在而 存在。在示例4-5中,为了获得工资总额大于10000的记录, 应该使用如下SQL语句。 select e.employee_id,e.employee_name,sum(s.salary) total salary from employees e,salary s where e.employee_id s.employee_id group by e.employee_id,e.employee_name having (sum(s.salary))>10000
—— where from group by having 4-6 having group by 4-5 10000 SQL select e.employee_id, e.employee_name, sum(s.salary) total_salary from employees e, salary s where e.employee_id = s.employee_id group by e.employee_id, e.employee_name having (sum(s.salary))>10000
4.1.6排序一order by子句 order by-子句用于排序结果集。order by-子句在使用时 需要指定排序标准和排序方式。排序标准是指按照结果集中 哪个或哪些列进行排序;order by.有两种排序方式一升序 (asc,同时也是默认排序方式)和降序(desc)。 【示例4-7】在示例4-4的查询结果中可以看到,没有指 定排序规则的情况下,搜寻结果是杂乱无章的。可以对该搜 寻结果按照工资水平由高到低的顺序排列,SQL语句如下所 示。 SQL>select distinct e.employee_name,s.salary 2 from employees e,salary s 3 where e.employee_id =s.employee_id 4 order by s.salary desc;
—— order by order by order by —— (asc ) desc 4-7 4-4 SQL SQL> select distinct e.employee_name, s.salary 2 from employees e, salary s 3 where e.employee_id = s.employee_id 4 order by s.salary desc;
4.1.7 order by与group by子句 本小节,我们来讨论一条SQL查询语句中同时存在order by与group by子句时的执行情况。当两种子句同时存在时, Oracle首先执行group by-子句,然后才进行排序操作。 【示例4-8】通过员工表employees-与工资表salary,我们 可以获得员工工资总额状况,并按照工资总额由高到低的顺 序进行排列。 SQL>select e.employee name,sum(s.salary)total_salary 2 from employees e,salary s 3 where e.employee_id s.employee_id 4 group by e.employee_name 5 order by total salary desc;
SQL order by group by Oracle group by 4-8 employees salary SQL> select e.employee_name, sum(s.salary) total_salary 2 from employees e, salary s 3 where e.employee_id = s.employee_id 4 group by e.employee_name 5 order by total_salary desc;
4.1.8 order bydistinct order by子句与distinct关键字同时使用时,也必须遵循 这样一个规则一order by子句所指定的排序列,必须出现 在select表达式中。 【示例4-9】我们可以通过表employees-与表salary获得 员工的单月工资状况。现欲获得所有员工姓名,并按工资进 行升序排列。 SQL>select e.employee_name 2 from employees e,salary s 3 where e.employee_id s.employee_id 4 order by s.salary 5/
order by distinct ——order by select 4-9 employees salary SQL> select e.employee_name 2 from employees e, salary s 3 where e.employee_id = s.employee_id 4 order by s.salary 5 /