开工大吉,Oracle系列五六章合集-分页和去重、表连接

第五章 分页和去重

5.1分页介绍

为什么会用到分页呢,因为列表内容太多了,所以使用分页进行显示。数据过多单页面无法显示所有内容,则每一次只显示一部分的数据。

分页,是一种将所有数据分段展示给用户的技术。用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自习自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止。其实这和我们阅读书籍很类似。

实现分页的解决方案有两种:

(1)一次查询出数据库中的所有记录,然后在每页中显示指定的记录。

(2)对数据库进行多次查询,每次只获得本页的数据并显示

如今网站建设中的数据都是海量的,若按方案1执行:无疑会加大服务器内存的负载,降低系统运行速度;若使用方案2执行,则可能回频繁操作数据库,也会影响响应效率;因而大家都会使用方案1+方案2来实现。

分页的核心就是计算每页多少记录和总页数以及第几页。每一页的数据则只需计算起始的记录和结束记录即可。

5.1.1 rownum

不是一个真实存在的列,它是用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。

由于总是结果集的编号,所以无法直接查询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) 即查询的时候同时需要多张表(特别是存在外键关系的),此时需要多张表之间的值进行连接;

2) 目前SQL标准提出过两种连接查询,第一种是较早的SQL92标准,第二种是目前使用广泛的较新的SQL99标准;

3) 92形式简单,但编写较为冗长,99不仅在底层得到优化,而且形式看上去更加一目了然,逻辑性更强,一般建议使用99标准;

6.2 92语法

多张表需要全部放在from之后,所有的连接条件都放在where当中,因此SQL92中的等值连接、非等值链接、外连接等等其实只是where条件的筛选

结构:

很多时候需要为表取别名(1、简化表名 2、可能存在自连接的情况)

连接的原理:按照from后面表的出现顺序,前面的表作为内存的for循环,后出现的表作为外层的for循环

6.2.1 笛卡尔积

通过线性代数的人都知道,笛卡尔乘积通俗的说,就是两个集合中的每一个成员,都与对方集合中的任意一个成员有关联。

例如有个考勤记录表,记录着100个人的2011年4月的考勤信息,理论上这些人应该每天都有记录的。 但是实际上某些人在某些天上面的数据,缺少了。 一天一天的查询,还是一个人一个人的查询,都有些麻烦。 这种情况下,可以针对 每个人 与 每一天 做一个 笛卡尔积 的处理。 然后与实际的表去关联。就很容易查询出结果了。

6.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

外连接,有主表和从表一说

6.3.6 full join on| using

全连接,满足则直接匹配,不满足的相互补充null,确保所有的表记录都至少出现一次。

6.4 集合操作

、、、

,并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;

,全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;

,交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

,差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序

分页和去重

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190212A0F91H00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券