第五章 分页和去重
5.1分页介绍
为何会用到分页呢,由于列表内容太多了,因此运用分页进行表示。数据太多单页面没法表示所有内容,则每一次只表示一部分的数据。
分页,是一种将所有数据分段展示给用户的技术。用户每次看到的不是所有数据,而是其中的一部分,倘若在其中无找到自习自己想要的内容,用户能够经过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止。其实这和咱们阅读书籍很类似。 实现分页的处理方法有两种:
(1)一次查找出数据库中的所有记录,而后在每页中表示指定的记录。(2)对数据库进行多次查找,每次只得到本页的数据并表示
如今网站建设中的数据都是海量的,若按方法1执行:无疑会加大服务器内存的负载,降低系统运行速度;若运用方法2执行,则可能回频繁操作数据库,亦会影响响应效率;因而大众都会运用方法1+方法2来实现。
分页的核心便是计算每页多少记录和总页数以及第几页。每一页的数据则只需计算初始的记录和结束记录就可。 5.1.1 rownum
rownum不是一个真实存在的列,它是用于从查找返回的行的编号,返回的第1行分配的是1,第二行是2,依此类推,这个伪字段能够用于限制查找返回的总行数。
因为rownum总是结果集的编号,因此没法直接查找rownum>1的任何记录,由于总是从1起始的嘛。 5.1.2 oracle 分页实现
虽然ronum不可直接查找大于1的记录,然则咱们能够自己添加伪列,将查找的结果集中的rownum做为查找的源自,则此时源自中的rownum变成为了普通字段,再经过这个rownum来进行某段记录的选择就可。
5.2 去除重复记录5.2.1 rowid介绍
ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对独一位置值。一般状况下,该值在该行数据插进到数据库表时即被确定且独一。ROWID它是一个伪列,它并不实质存在于表中。它是ORACLE在读取表中数据行时,按照每一行数据的理学位置信息编码而成的一个伪列。因此按照一行数据的ROWID能找到一行数据的理学位置信息。从而快速地定位到数据行。数据库的大都数操作都是经过ROWID来完成的,况且运用ROWID来进行单记录定位速度是最快的。
有时繁杂的数据检索时,普通检索要求不可达到需求,能够利用rowid来精确检索的结果 oracle中倘若要查找某张表中多个字段,又只对某个字段去重的时候用distinct或group by都不行。distinct和group by会对要查找的字段一块进行去重,亦便是当查找的所有字段都相同,oracle才认为是重复的。此时用rowid是个不错的选取。5.2.2 重复记录的查询
题目场景:当咱们表里面显现了许多重复记录时,咱们必须将重复的记录找出来 实现过程:
1、根据重复内容分组2、取出每一组中的一条并记录保存(重视拥有独一性)3、删除未在保存范围的数据
第六章 表连接
6.1 表连接介绍
当咱们获取的数据不是来自于同一张表而是来自于多张表时就必须运用到表连接。表连接便是一个表的行按照指定的要求跟另一个表的行连接起来形成新的行的过程。
简单来讲,咱们将数据存在区别的表中,而区别的表有着它们自己的表结构,区别表之间能够是相关联的,大部分实质运用中,不会仅仅只必须一张表的信息,比如必须从一个班级表中找出北京地区的学生,再用这个信息去检索成绩表中她们的数学成绩,倘若无多表连接,那只能手动将第1个表的信息查找出来做为第二个表的检索信息去查找最后的结果,可想而知这将会是多么繁琐。 连接查找:
1) 即查找的时候同期必须多张表(尤其是存在外键关系的),此时必须多张表之间的值进行连接;2) 日前SQL标准提出过两种连接查找,第1种是较早的SQL92标准,第二种是日前运用广泛的较新的SQL99标准;3) 92形式简单,但编写较为冗长,99不仅在底层得到优化,况且形式看上去更加一目了然,规律性更强,通常意见运用99标准;
6.2 92语法
多张表必须所有放在from之后,所有的连接要求都放在where其中,因此呢SQL92中的等值连接、非等值链接、外连接等等其实只是where要求的筛选
结构:select ... from table1, table2 ,table3 ... where...
非常多时候必须为表取别名(1、简化表名 2、可能存在自连接的状况) 连接的原理:根据from后面表的显现次序,前面的表做为内存的for循环,后显现的表做为外层的for循环6.2.1 笛卡尔积
经过线性代数的人都晓得,笛卡尔乘积通俗的说,便是两个集合中的每一个成员,都与对方集合中的任意一个成员相关联。
例如有个考勤记录表,记录着100个人的2011年4月的考勤信息,理论上这些人应该每日都有记录的。 但是实质上某些人在某些天上面的数据,缺少了。 一天一天的查找,还是一个人一个人的查找,都有些麻烦。 这种状况下,能够针对 每一个人 与 每一天 做一个 笛卡尔积 的处理。 而后与实质的表去相关。就很容易查找出结果了。 select ... from t1,t26.2.2 等值连接
在笛卡尔积的基本上取要求列相同的值
查找员工信息和分部信息 查找员工姓名,分部名叫作6.2.3 非等值连接
!=、>、<、<>、between and 查找员工姓名,工资及等级6.2.4 自连接
特殊的等值连接(来自于同一张表) 找出存在上级的员工姓名6.2.5 外连接
内联接运用比较运算符按照每一个表共有的列的值匹配两个表中的行。
外联接能够是左向外联接、右向外联接或完整外边联接。
左向外联接的结果集包含 LEFT OUTER子句中指定的左表的所有行,而不仅是联接列所匹配的行。倘若左表的某行在右表中无匹配行,则在关联联的结果集行中右表的所有选取列表列均为空值。
右向外联接是左向外联接的反向联接。将返回右表的所有行。倘若右表的某行在左表中无匹配行,则将为左表返回空值。
看‘+’,带‘+’的表为从表,对立面的表为主表。
找出所有员工的姓名 以及他上级的名叫作
找出所有上级的名叫作以及其手下员工的名叫作
找出所有分部的员工数 及分部名叫作 找出所有有员工的分部名叫作及员工数
6.3 99语法6.3.1 cross join
交叉连接,实现笛卡尔积 6.3.2 natural join
必须有(同名列、主外建)
自然连接,做等值连接 查找所有员工姓名及所在分部的名叫作6.3.3 join using (同名列)
using 连接 ,等值连接 查找所有员工姓名及所在分部的名叫作6.3.4 join on
on 连接,可做等值连接、非等值连接、自连接,能够处理一切连接,关系列必要要区分
查找所有员工姓名及所在分部的名叫作 查找所有员工的姓名,工资以及工资等级6.3.5 outer join
外连接,有主表和从表一说
left [outer] join on
left [outer] join using
right [outer] join on right [outer] join using6.3.6 full join on| using
全连接,满足则直接匹配,不满足的相互弥补null,保证所有的表记录都最少显现一次。
6.4 集合操作
Union、Union All、Intersect、Minus
Union,并集(去重) 对两个结果集进行并集操作,不包含重复行同期进行默认规则的排序;
Union All,全集(不去重) 对两个结果集进行并集操作,包含重复行,不进行排序 ;
Intersect,交集(找出重复) 对两个结果集进行交集操作,不包含重复行,同期进行默认规则的排序; Minus,差集(减去重复) 对两个结果集进行差操作,不包含重复行,同期进行默认规则的排序
分页和去重
|