4.4过滤行记录和组信息
行记录的过滤是针对每条记录的筛选,组信息的过滤是针对组的筛选,是可以同时出现的,先筛选行,再过滤组。
where 筛选行,只能出现行信息
having 筛选组,只能出现组信息
结构:select...from...where...group by ...having...
执行顺序:
from
where
group by
having
select
--查询部门编号和部门里面的员工数量
--只统计工资大于2000的员工(行记录)
--并且是工资大于2000的员工数量在2及其以上的部门(组信息过滤)
select deptno,count(*) from emp where sal>2000 group by deptno having count(*)>=2;
- 分页和去重
1.1分页介绍
因为列表内容太多,所以使用分页进行显示。数据过多单页无法显示所有内容,则每一次只显示一部分的数据。
分页,是一种将所有数据分段展示给用户的技术,用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止。
实现分页的解决方案有两种:
(1).一次查询出数据库中的所有记录,在每页中显示指定的记录。
(2).对数据库进行多次查询,每次只获取本页的数据并显示。
注意:执行方案1会加大服务器内存的负载,降低系统运行速度,执行方案2,则可能会频繁操作数据库,会影响效率 ,建议采用1+2的方式来实现。
分页的核心就是计算每页多少记录和总页数以及第几页。每一页的数据则只需计算起始的记录和结束的记录即可。
1.2rownum
rownum 不是一个真实存在的列,它是用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。
由于rownum 总是结果集的编号,所以无法查询rownum>1的任何记录,因为总是从1开始的。
--rownum 是对每一个结果集中的每一条记录的编号,从1开始
select ename,sal,deptno,rownum from emp;
select ename,sal,deptno,rownum from emp where deptno =30;
--进行分页,每一页显示5条记录,查询第一页的数据
select ename,sal,deptnpo,rownum from emp where rownum <=5;
--查询第二的数据 6~10 (注:此方法不可取)
select ename,sal,deptno,rownum from emp where rownum <=10 and rownum >=6;
正确方法:
--将查询所有的员工信息,并且加上伪列rownum;
select ename,sal,deptno,rownum from emp;
--将查询出来的结果作为临时的数据来源,此时,刚才临时的那个结果集rownum普通字段(rw 在这里是别名的意思 ) 这里是第二页的意思
select * from (select ename,sal,deptno,rownum rw from emp)where rw>5 and rw<=10;
--查询员工的信息,姓名,工资,部门编号,按照工资降序排序,实现分页
--每一页显示3条记录 查询第2页的数据
第一步:select ename,sal,depyno,r1,rownum r2 from ( select ename ,sal,deptno,rownum r1 from emp order by sal desc);
第二步:select ename ,sal,deptno,r1,r2 from (select ename,sal,depyno,r1,rownum r2 from ( select ename ,sal,deptno,rownum r1 from emp order by sal desc)) where r2>(3-1)*3 and r2<=2*3;